我是口齿不清的初学者我有两个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)