在 Common Lisp 中,是不是有从给定字符串返回符号的函数?

Posted

技术标签:

【中文标题】在 Common Lisp 中,是不是有从给定字符串返回符号的函数?【英文标题】:In Common Lisp, is there a function that returns a symbol from a given string?在 Common Lisp 中,是否有从给定字符串返回符号的函数? 【发布时间】:2011-06-29 14:49:58 【问题描述】:

我想要

>(??? "car")
CAR
>((??? "car") '(1 2))
1 

我似乎找不到执行此操作的函数。

【问题讨论】:

没有任何东西会给你第二个表单的行为,因为 CL 有特殊的规则来评估表单中的运算符,它们不允许这样的构造。 【参考方案1】:
>(??? "car")
CAR
>((??? "car") '(1 2))
1 

使用:

CL-USER 17 > (find-symbol "CAR")
CAR
:INHERITED

CL-USER 18 > (funcall (find-symbol "CAR") '(1 2))
1

请注意,在 Common Lisp 中,符号的名称在内部是大写的。 FUNCALL 允许我们将符号作为函数调用。也可以将函数对象与 FUNCALL 一起使用。

您还可以创建一个表单和 EVAL:

CL-USER 19 > (eval `(,(find-symbol "CAR") '(1 2)))
1

CL-USER 20 > (eval (list (find-symbol "CAR") ''(1 2)))
1

【讨论】:

【参考方案2】:

有几个,具体取决于您想要做什么。

首先,intern,如果存在,这将返回该名称的现有符号,否则将创建一个新符号。

第二,find-symbol,如果存在则返回符号,否则返回nil(它有两个返回值,第二个可以用来区分“将nil作为符号返回”和“将nil作为无符号返回”找到”)。

第三,make-symbol,这将始终创建一个新的、未执行的符号,并且几乎可以保证在这种特定情况下不是您想要的。

【讨论】:

【参考方案3】:

你在找这个吗?

(eval (read-from-string "(car '(1 2))"))

给:1


更新:

(funcall (intern "CAR") '(1 2)) 怎么样? :)

【讨论】:

关闭,更像这样 (eval ((read-from-string "car") '(1 2))) = 1 我希望能够将字符串转换为函数使用

以上是关于在 Common Lisp 中,是不是有从给定字符串返回符号的函数?的主要内容,如果未能解决你的问题,请参考以下文章

Common Lisp宏变量扩展

Common lisp——为啥这个符号不是外部的?

在 common lisp 中居中文本

查找 Common Lisp 文件之间的依赖关系

在 Common Lisp 中将 FUNCTION 转换为 STRING 或 SYMBOL

将 Common Lisp 中的宏参数视为(区分大小写的)字符串