2016-06-19 13 views
0

Wenn ich eine Funktionsdefinition make-cd habe und die Funktion ausführen, um die falsche Antwort zu erhalten.(Liste ...) vs '(...) in Lisp

(defun make-cd (title artist rating ripped) 
    '(:title title :artist artist :rating rating :ripped ripped)) 

(add-record (make-cd "Roses" "Kathy Mattea" 7 t)) 

(:TITLE TITLE :ARTIST ARTIST :RATING RATING :RIPPED RIPPED) 

Ich hätte (list ...) bekommen eine richtige Antwort verwendet.

(defun make-cd (title artist rating ripped) 
    (list :title title :artist artist :rating rating :ripped ripped)) 

(add-record (make-cd "Roses" "Kathy Mattea" 7 t)) 

(:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T) 

Warum ist das?

+0

'(X Y Z)' ist eine Abkürzung für '(QUOTE (X Y Z))'. ["Zitat"] (http: //www.lispworks.com/documentation/HyperSpec/Body/s_quote.htm) gibt das gegebene Objekt einfach als Literaldaten zurück, anstatt es zu bewerten. Das heißt, in Ihrem Beispiel sind 'TITLE',' ARTIST', 'RATING' und' RIPPED' keine Verweise auf die Variablen mit diesen Namen; Sie sind nur buchstäbliche Symbole. – jkiiski

+0

Es ist wie der Unterschied zwischen konstanten Strings, die nicht interpolieren ''das ist $ WYSIWYG' // => 'das ist $ WYSIWYG'' und Strings, die tun" Dies ist nicht $ WYSIWYG "// =>" Das ist nicht ersetzt "'. – Sylwester

Antwort

3

Lisp hat Symbole als Datenstruktur. Symbole können als sie selbst - als Symbole - oder als Variablen im Code verwendet werden.

Sie müssen die Bewertungsregeln für zitierte Ausdrücke und Funktion erinnern, ruft:

Bewertungsregel für zitierte Ausdruck: nichts in einem zitierte Ausdruck ausgewertet wird. Der Wert wird unverändert zurückgegeben.

Bewertungsregel für Funktionsaufrufe: Bei einem Funktionsaufruf werden alle Argumente von links nach rechts ausgewertet und diese Ergebnisse an die Funktion übergeben. Die Berechnungsergebnisse der Funktion werden zurückgegeben.

Erstellen von Daten:

A zitierte Symbol:

CL-USER 13 > 'foo 
FOO 

Eine Liste zitiert. Nichts im Angebot wird ausgewertet.

CL-USER 14 > '(foo bar) 
(FOO BAR) 

Eine verschachtelte Liste, zitiert.

CL-USER 15 > '((foo bar) (foo baz)) 
((FOO BAR) (FOO BAZ)) 

Eine frisch erstellte Liste mit der Funktion list. Die Inhalte sind Symbole.

CL-USER 16 > (list 'foo 'bar) 
(FOO BAR) 

Eine frisch erstellt verschachtelte Liste:

CL-USER 17 > (list (list 'foo 'bar) (list 'foo 'bar)) 
((FOO BAR) (FOO BAR)) 

Eine frisch Liste erstellt, wobei als Inhalt zitiert Listen:

CL-USER 18 > (list '(foo bar) '(foo bar)) 
((FOO BAR) (FOO BAR)) 

Daten erstellen, Variablen:

Mit der Funktion list mit zwei va riables:

CL-USER 19 > (let ((foo 1) 
        (bar 2)) 
       (list foo bar)) 
(1 2) 

Mit einer backquoted Liste. Die Elemente nach dem Komma werden ausgewertet.

CL-USER 20 > (let ((foo 1) 
        (bar 2)) 
       `(,foo ,bar)) 
(1 2) 

eine verschachtelte backquoted Mit Liste. Die Elemente nach dem Komma werden ausgewertet.

CL-USER 21 > (let ((foo 1) 
        (bar 2)) 
       `((,foo ,bar) (,foo ,bar))) 
((1 2) (1 2))