前提
Peter Seibelの『実践Common Lisp』のコードを試してみて、疑問があるので質問させて下さい。
著者のページにあるコードと同じものです。
(list ... )
v.s '(...)
属性リストを作るコードに、以下の例が載せられています。
common_lisp
1(defun make-cd (title artist rating ripped) 2 (list :title title :artist artist :rating rating :ripped ripped))
これを、そのままREPLEにコピペして、この関数をつかうと、
common_lisp
1CL-USER> (make-cd "AKB48" "久しぶりのリップグロス") 2(:TITLE "AKB48" :ARTIST "久しぶりのリップグロス") 3 4CL-USER> (getf (make-cd "AKB48" "久しぶりのリップグロス") :artist) 5"久しぶりのリップグロス"
これを (list ... )
から '(...)
に替えて以下のように書くと、warningが出ます。
common_lisp
1(defun make-cd (title artist rating ripped) 2 '( :title title :artist artist :rating rating :ripped ripped))
エラーではないので無視して使ってみると、正しく属性リストが作られないようです。
common_lisp
1CL-USER> (make-cd-with-quote "AKB48" "久しぶりのリップグロス") 2(:TITLE TITLE :ARTIST ARTIST) 3 4CL-USER> (getf (make-cd-with-quote "AKB48" "久しぶりのリップグロス") :artist) 5ARTIST
引数でなく、仮引数名 ARTISTがバインドされているようです。 つまり(list ... )
は必ずしも '(...)
で、代替できるわけではないということですが、どういう状況では、代替可能で、どのような状況では不可能なのでしょうか?
もしかすると、私の文法に問題があるのかもしれません。
参考までに発生しているWarningは:
; in: DEFUN MAKE-CD-WITH-QUOTE ; (SB-INT:NAMED-LAMBDA MAKE-CD-WITH-QUOTE ; (TITLE ARTIST) ; (BLOCK MAKE-CD-WITH-QUOTE '(:TITLE TITLE :ARTIST ARTIST))) ; ; caught STYLE-WARNING: ; The variable TITLE is defined but never used. ; ; caught STYLE-WARNING: ; The variable ARTIST is defined but never used. ; ; compilation unit finished ; caught 2 STYLE-WARNING conditions
よろしくお願いいたします。
'(quote) と `(backquote) を混同されているのではないでしょうか。backquote を使う場合、make-cd の定義は以下の様に書くことができます。
(defun make-cd (title artist &optional rating ripped)
`(:title ,title :artist ,artist :rating ,rating :ripped ,ripped))
回答2件
あなたの回答
tips
プレビュー