我是口齿不清的初学者我有两个functions,一个defparameter和一个defstruct每次将一本书传递给inputBook时,我都希望书的标题(字符串)成为defparameter的名称这可能吗?
我试着在下面硬编码一个字符串,上面写着“MobyDick”,但是我得到了一个错误那么这有可能吗?
我试图简单地使用传递的参数title,但是如果您试图将另一本书传递到函数中,它们都被分配到title,但是最后传递的将打印,而不是第一本,也不是两本那么,我如何才能做到既没有列表又没有哈希表的“书”那么多呢?
如果后者是不可能的,我如何更改代码,以便对任何数量的书籍创建一个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)))

多谢提前同时,我也是一个初学者我一直在通过谷歌学习,我在这里被难住了。

最佳答案

你可能想要这样的东西,而不是一些顶级变量的疯狂。

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

09-04 21:23