从Lisp中的字符串创建变量名称

时间:2011-03-15 02:21:33

标签: common-lisp symbols

我正在尝试获取一个字符串,并将其转换为变量名称。我虽然(make-symbol)或(实习生)会这样做,但显然它不是我想要的,或者我使用不正确。

例如:

> (setf (intern (string "foo")) 5)
> foo
  5

这里我将尝试创建一个名为'foo'的变量,其值为5.除此之外,上面的代码给出了一个错误。我正在寻找的命令是什么?

2 个答案:

答案 0 :(得分:13)

这里有很多事情需要考虑:

  1. SETF未评估其第一个参数。它需要一个符号或表单来指定要更新的位置。请改用SET

  2. 根据Common Lisp实现的复古和设置,符号名称可能默认为大写。因此,对foo的第二次引用实际上可能是指名称为"FOO"的符号。在这种情况下,您需要使用(intern "FOO")

  3. STRING的调用是无害的,但如果该值已经是字符串则不必要。

  4. 全部放在一起,试试这个:

    > (set (intern "FOO") 5)
    > foo
      5
    

答案 1 :(得分:7)

使用:

CL-USER 7 > (setf (SYMBOL-VALUE (INTERN "FOO")) 5) 
5

CL-USER 8 > foo
5

这也适用于变量:

CL-USER 11 > (let ((sym-name "FOO"))
               (setf (SYMBOL-VALUE (INTERN sym-name)) 3))
3

CL-USER 12 > foo
3

还要记住,默认情况下,符号在内部创建为大写。如果要通过字符串访问符号,则必须使用大写字符串。

相关问题