在 Lisp 中从字符串创建变量名

Posted

技术标签:

【中文标题】在 Lisp 中从字符串创建变量名【英文标题】:Create a variable name from a string in Lisp 【发布时间】:2011-07-15 11:26:20 【问题描述】:

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

例如:

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

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

【问题讨论】:

【参考方案1】:

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

    SETF 不计算其第一个参数。它需要一个符号或表格来指定要更新的位置。请改用SET

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

    STRING 的调用是无害的,但如果值已经是字符串,则没有必要。

把它们放在一起,试试这个:

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

【讨论】:

嘿,成功了!嗯,有点。我实际上并没有尝试使用 (set) 分配值,而是使用我没有创建的另一个名为 (add-dm) 的函数。显然,(add-dm) 与 (setf) 具有相同的限制,即不计算第一个表达式,所以我必须找出另一种方法。但这确实说明了一些事情,所以谢谢! (另外,我确实意识到 (string) 是不必要的,尽管我的最终目标是从连接的字符串创建一个符号,所以我保留它以防万一它有所作为)。 @Jeff 如果ADD-DM 是一个宏,它可能会扩展为一个导出函数,该函数的使用方式与SET 相同。尝试检查(macroexpand-1 '(add-dm ...)) 的结果,看看你是否幸运。【参考方案2】:

用途:

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

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

【讨论】:

以上是关于在 Lisp 中从字符串创建变量名的主要内容,如果未能解决你的问题,请参考以下文章

autocad lisp怎么创建通用函数

在 Bash 中从文本文件创建数组

在Recyclerview Android中从Firebase检索日期

如何从 Ruby on Rails 中的字符串值创建变量名?

在 Django 中从外键设置会话变量:需要字段名而不是主键

重新定义已删除的包(Common Lisp)