LISP:如何在defparameters中使用字符串

LISP:如何在defparameters中使用字符串,lisp,common-lisp,Lisp,Common Lisp,我是Lisp的初学者。我有两个函数,一个defparameter,一个defstruct。每次将一本书传递到inputBook时,我都希望该书的标题(字符串)成为defparameter的名称。这可能吗? 我试着硬编码一个字符串,如下所示,上面写着“MobyDick”,但我得到了一个错误。那么这可能吗 我试图简单地使用传递的参数title,但是如果您尝试将另一本书传递到函数中,它们都被分配到title,但是最后传递的一本将打印,而不是第一本,也不是两本。那么,我怎样才能在没有列表或哈希表的情况下

我是Lisp的初学者。我有两个
函数
,一个
defparameter
,一个
defstruct
。每次将一本书传递到
inputBook
时,我都希望该书的标题(字符串)成为
defparameter
的名称。这可能吗? 我试着硬编码一个字符串,如下所示,上面写着“MobyDick”,但我得到了一个错误。那么这可能吗

我试图简单地使用传递的参数
title
,但是如果您尝试将另一本书传递到函数中,它们都被分配到
title
,但是最后传递的一本将打印,而不是第一本,也不是两本。那么,我怎样才能在没有列表或哈希表的情况下拥有尽可能多的“书”

如果后一种方法不可行,我如何修改代码,以便为任意数量的书籍创建一个
defparameter
,并通过
getAuthor
函数访问?这有意义吗?(请参阅下面的功能。)


非常感谢!而且,我是一个初学者。我一直在通过谷歌搜索学习,我在这里被难住了。

使用带有任意名称的符号有一个典型的缺点:您可以覆盖现有符号的值。因此,为它提供一个单独的包是有用的,它不会从其他包中导入符号

最好是有一个哈希表,它可以从字符串映射到book对象

带有符号的代码草图:

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

使用具有任意名称的符号有一个典型的缺点:可以覆盖现有符号的值。因此,为它提供一个单独的包是有用的,它不会从其他包中导入符号

最好是有一个哈希表,它可以从字符串映射到book对象

带有符号的代码草图:

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

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

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

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

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

我不明白你想干什么。为什么要使用
defparmeter
?我正在使用defparmeter创建一个全局变量,这样我就可以访问在getAuthor的inputBook中创建的书。我尝试在没有def参数的情况下使用setq make book,但当我获得author时,这本书并不存在。这毫无意义。你是如何使用你的功能的?好的。所以本质上我希望用户使用所有四个参数将一本书传递给inputBook。然后我想用defstruct创建这本书。所以我用makebook来做这个。我正在使用def参数,以便访问刚刚在getAuthor中使用make book制作的书籍。如果我不使用defparameter,那么函数getAuthor将无法获取该书的作者。有道理吗?如果我没有很好地解释这一点,我很抱歉。我真的很感谢你的帮助。我不清楚的是,如果你想创建一本书,并将其分配给一个全局(用CL术语来说是特殊的)变量,或者想将其分配给一个与书名同名的特殊变量,如果你想创建多本书,然后把它们分别赋给不同的特殊变量,称为书名,或者别的什么?我不明白你想做什么。为什么要使用
defparmeter
?我正在使用defparmeter创建一个全局变量,这样我就可以访问在getAuthor的inputBook中创建的书。我尝试在没有def参数的情况下使用setq make book,但当我获得author时,这本书并不存在。这毫无意义。你是如何使用你的功能的?好的。所以本质上我希望用户使用所有四个参数将一本书传递给inputBook。然后我想用defstruct创建这本书。所以我用makebook来做这个。我正在使用def参数,以便访问刚刚在getAuthor中使用make book制作的书籍。如果我不使用defparameter,那么函数getAuthor将无法获取该书的作者。有道理吗?如果我没有很好地解释这一点,我很抱歉。我真的很感谢你的帮助。我不清楚的是,如果你想创建一本书,并将其分配给一个全局(用CL术语来说是特殊的)变量,或者想将其分配给一个与书名同名的特殊变量,如果你想创建多本书,并将它们分配给不同的特殊变量,称为书名,或者其他什么?