3

私は Practical Common LISP に取り組み始めており、最初の演習は単純なデータベースを作成することです。cygwin で GNU CLISP 2.48 (2009-07-28) を使用しています。

本と何度か比較したこのコードは、本が言うように出力を生成しません。

(defun make-cd (title artist rating ripped)
  (list :title title :artist artist :rating rating :ripped))
(defvar *db* nil)
(defun add-record (cd) (push cd *db*))
(add-record (make-cd "Roses" "Kathy Mattea" 7 t))
(add-record (make-cd "Fly" "Dixie Chicks" 8 t))
(add-record (make-cd "Home" "Dixie Chicks" 9 t))
(defun dump-db ()
  (dolist (cd *db*)
   (format t "~{~a:~10t~a~%~}~%" cd)))

(dump-db)

私は得る

TITLE:    Home
ARTIST:   Dixie Chicks
RATING:   9
RIPPED:   
*** - There are not enough arguments left for this format directive.
      Current point in control string:
        "~{~a:~10t~a~%~}~%"
                  |

formatトラブルシューティングを行うほど LISPを理解していません。この本には、データベース内のすべてのレコードのリストを取得する必要があると書かれています。何がうまくいかなかったのですか?

4

3 に答える 3

4

CLISP でコンパイラを使用すると、何が問題なのかがわかります。

[1]> (defun make-cd (title artist rating ripped)
       (list :title title :artist artist :rating rating :ripped))   
MAKE-CD

[2]> (compile 'make-cd)
WARNING: in MAKE-CD : variable RIPPED is not used.
         Misspelled or missing IGNORE declaration?
MAKE-CD ;
1 ;
NIL

変数RIPPEDは使用されません。

于 2012-11-05T07:40:04.107 に答える
4

まず、(make-cd) からの戻り値を見てみましょう:

[12]> (make-cd "Home" "Dixie Chicks" 9 t)
(:TITLE "Home" :ARTIST "Dixie Chicks" :RATING 9 :RIPPED)

:ripped!の値が含まれていません。(make-cd) を次のように変更します。

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

ripped後に注意してください:ripped

于 2012-11-05T04:52:25.900 に答える
1

formatディレクティブ~{...~}は反復構造であり、対応する引数はリストであることが期待されます。さらに、この場合、が2回発生するため~a、各反復で2つのアイテムが消費されるため、リスト内のアイテムの総数は均等になると予想されます。しかし、あなたはそれに奇妙な数のアイテムを提供しました。

于 2012-11-05T11:22:37.323 に答える