2016-06-19 8 views
0

私は関数定義make-cdを持っていて、間違った答えを得るために関数を実行します。(list ...)Lispのvs '(...)

(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) 

正解を得るには、(list ...)を使用してください。

(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) 

なぜですか?

+0

'(X Y Z)'は '(QUOTE(X Y Z))'の省略形です。 ['QUOTE'](http://www.lispworks。com/documentation/HyperSpec/Body/s_quote.htm)は、指定されたオブジェクトを単に評価する代わりにリテラルデータとして返します。つまり、あなたの例の 'TITLE'では' ARTIST'、 'RATING'と' RIPPED'はそれらの名前を持つ変数への参照ではありません。彼らは文字通りのシンボルです。 – jkiiski

+0

これは、 '$ WYSIWYG '// =>'これは$ WYSIWYG 'であり、' "$ WYSIWYG" // => "ではない文字列を補間しない定数文字列の違いと似ています置き換えられない "。 – Sylwester

答えて

3

Lispにはシンボルがデータ構造としてあります。シンボルはシンボルとして、またはコード内の変数として使用できます。あなたが引用された式の評価規則を覚えておく必要があると関数呼び出し

評価が引用された表現のルール:引用符で囲まれた式の中は何も評価されません。値はそのまま返されます。

関数呼び出しの評価規則:関数呼び出しでは、すべての引数が左から右に評価され、これらの結果は関数に渡されます。関数の計算結果が返されます。

引用された記号:

CL-USER 13 > 'foo 
FOO 

引用されたリストデータを作成

。見積もりの​​中の何も評価されません。

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

入れ子リストです。

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

機能listを使用して新しく作成されたリスト。内容はシンボルです。

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

新規に作成したネストされたリスト:内容として引用されたリストを使用して

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

たて作成したリストを、:

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

は、変数にを使用して、データの作成:

関数listを使用して2つのva riables:バッククォートリストを使用して

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

。コンマの後の要素が評価されます。ネストされたバッククォートリストを使用して

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

。コンマの後の要素が評価されます。

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