2017-12-20 14 views
0

私はLispの初心者です。私は2つのfunctionsdefparameter、およびdefstructを持っています。本がinputBookに渡されるたびに、本のタイトル(文字列)をdefparameterの名前にしたいと思います。これは可能ですか? "MobyDick"と書かれているような文字列をハードコードしようとしましたが、エラーが発生します。これも可能ですか?LISP:defparametersでの文字列の使い方

私は単にtitleを渡されたパラメータを使用しようとしましたが、あなたは関数に別の本を渡ししようとした場合、それらはtitle両方が割り当てられていますが、渡された最後の1は、第1およびない、ない印刷されます。だから私はリストやハッシュテーブルなしで多くの "書籍"を持っているように私はそれを行うことができますか?

defparameterが任意の数の書籍に作成され、getAuthor機能でアクセスできるようにコードを変更するにはどうすればよいですか?それは理にかなっていますか? (下記の機能をご覧ください)

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

多くの多くの事前に感謝!また、私は初心者の初心者です。私はグーグルで学び、私はここで困惑しています。

+0

私はあなたが何をしようとして理解していません。どうして 'defparameter'を使うのですか? – melpomene

+0

私はgetAuthorのinputBookで作成された本にアクセスできるように、defparameterを使ってグローバル変数を作成しています。私はdefparameterなしでそれをやろうとしましたが、ちょうどsetq make-bookを使っていましたが、getAuthorになると本は存在しませんでした。 –

+0

それは意味をなさない。どのようにあなたの機能を使用していますか? – melpomene

答えて

2

任意の名前のシンボルを使用すると、典型的な欠点があります。既存のシンボルの値を上書きすることができます。したがって、他のパッケージからシンボルをインポートしない独立したパッケージを持つと便利です。

文字列からブックオブジェクトにマップするハッシュテーブルを作成する方がよいでしょう。シンボルとコードの

スケッチ:

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

例:

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

あなたは、おそらくこのようなものではなく、トップレベルの変数のいくつかの狂気をしたいです。

例えば次に
(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)) 

、:

> (setf (book 'moby) (make-book ...)) 
> (book 'moby) 
> (bookp 'moby) 
> (remove-book 'moby) 
関連する問題