使用用户输入lisp添加到全局符号列表

时间:2018-02-08 01:44:07

标签: lisp

我正在使用SBCL REPL:

功能:

 (defun add-from-list (word) 
    (setf (symbol-value word) '())
    (push  word *vocab*))   

我可以

> (add-from-list 'dog)

我的全局列表*vocab*如下所示:

> (dog)

我可以整天添加动物,列表会更长。我可以给动物关联数组并用它们做很多有趣的事情。

但是现在我想从用户输入中添加一个动物我已经尝试了许多不同的东西,特别是(intern (read-line)),直到我感到困惑。我得到的最接近的东西看起来像是

> (|snake|)

当我尝试像其他动物一样使用它时,它说它是未绑定的。

  1. 当它周围有|时它意味着什么?

  2. 如何使用*vocab*等用户输入将另一只动物添加到我的全局列表read-line

1 个答案:

答案 0 :(得分:2)

|用于转义包含特殊字符的符号。

在这种情况下,这是因为符号名称包含小写字母。默认情况下,当您键入符号时,字母将转换为大写,例如当您输入foo时,它会显示为符号FOO。这允许您编写不区分大小写的代码,例如你可以写(defun ...)(DEFUN ...),他们都会工作。

但这只是在阅读输入时才会这样做。像INTERN这样的函数按字面意思使用名称。由于打印机试图打印符号,使得读回它们将返回相同的符号,如果它包含小写字母,它将转义名称以确保这种一致性。

如果您想按照阅读器的方式处理用户输入,可以在致电READ-FROM-STRING后使用READ-LINE

(let ((word (read-from-string (read-line))))
    ...
)

或者您可以致电STRING-UPCASE

(let ((word (intern (string-upcase (read-line)))))
    ...
)

但是,这样便携性较差,因为自动更新是一种可自定义的可读特定设置(参见READTABLE-CASE)。使用READ-FROM-STRING可确保您获得当前设置。