2017-12-20 4 views
0

Ich bin ein Anfänger in Lisp. Ich habe zwei functions, eine defparameter, und eine defstruct. Jedes Mal, wenn ein Buch an inputBook übergeben wird, möchte ich den Titel des Buches (die Zeichenfolge) den Namen der defparameter werden. Ist das möglich? Ich habe versucht, eine Zeichenfolge in wie unten zu codieren, wo es "MobyDick" sagt, aber ich bekomme einen Fehler. Ist das überhaupt möglich?LISP: So verwenden Sie Zeichenfolgen in defparameters

ich einfach versucht, den Parameter übergeben title aber wenn Sie versuchen, ein anderes Buch in die Funktion zu übergeben, sie sind beide -title zugewiesen, aber das letzte druckt bestanden, nicht die erste und nicht beide. Also wie kann ich es machen, damit ich so viele "Bücher" ohne eine Liste oder eine Hash-Tabelle habe?

Wenn letzteres nicht möglich ist, wie könnte ich den Code so ändern, dass ein defparameter (einzigartig) für eine beliebige Anzahl von Büchern erstellt und über die getAuthor-Funktion zugänglich ist? Ist das sinnvoll? (Bitte beachten Sie die folgenden Funktionen.)

(defstruct book() 
    (title) ;;title of the book, type string 
    (author) ;;author of the book, type string 
    (date)) ;; date of the book, type string or int 

(defun inputBook(title author month year) 
    (defparameter "MobyDick" ;;I want this to use the parameter title 
     (make-book :title title 
        :author author 
        :date '(month year)))) 

(defun getAuthor (book) 
    (write (book-author book))) 

Vielen vielen Dank im Voraus! Außerdem bin ich ein Anfänger Anfänger. Ich habe durch googeln gelernt und bin hier ratlos.

+0

Ich verstehe nicht, was Sie zu tun versuchen. Warum benutzt du 'defparameter 'überhaupt? – melpomene

+0

Ich benutze defparameter, um eine globale Variable zu erstellen, damit ich auf das Buch zugreifen kann, das in inputBook in getAuthor erstellt wurde. Ich habe versucht, es ohne Defarameter zu tun und habe nur setq make-book benutzt, aber als ich Author bekommen konnte, existierte das Buch nicht. –

+0

Das macht keinen Sinn. Wie nutzen Sie Ihre Funktionen? – melpomene

Antwort

2

Die Verwendung von Symbolen mit beliebigen Namen hat den typischen Nachteil: Sie können die Werte vorhandener Symbole überschreiben. Daher wäre es nützlich, ein separates Paket dafür zu haben, das keine Symbole aus anderen Paketen importiert.

Besser wäre es, eine Hash-Tabelle zu haben, die von einer Zeichenkette auf das Buchobjekt abbilden würde.

Skizze Code mit Symbolen:

(defstruct book 
    (title) ;; title of the book, type string 
    (author) ;; author of the book, type string 
    (date)) ;; date of the book, type list 

(defun input-book (title author month year) 
    (setf (symbol-value (intern title)) 
     (make-book :title title 
        :author author 
        :date (list month year)))) 

Beispiel:

CL-USER 52 > (input-book "Lisp Style & Design" 
         "Molly M. Miller, Eric Benson" 
         1 1990) 
#S(BOOK :TITLE "Lisp Style & Design" 
     :AUTHOR "Molly M. Miller, Eric Benson" 
     :DATE (1 1990)) 

CL-USER 53 > (book-author (symbol-value '|Lisp Style & Design|)) 
"Molly M. Miller, Eric Benson" 

CL-USER 54 > (book-author |Lisp Style & Design|) 
"Molly M. Miller, Eric Benson" 
4

Sie wahrscheinlich etwas will, das wie folgt aussieht, anstatt einig Wahnsinn der Top-Level-Variablen.

(defvar *books* (make-hash-table)) 

(defun bookp (title) 
    (nth-value 1 (gethash title *books*))) 

(defun remove-book (title) 
    (remhash title *books*)) 

(defun book (title) 
    (nth-value 0 (gethash title *books*))) 

(defun (setf book) (new title) 
    (setf (gethash title *books*) new)) 

Dann, zum Beispiel:

> (setf (book 'moby) (make-book ...)) 
> (book 'moby) 
> (bookp 'moby) 
> (remove-book 'moby) 
Verwandte Themen