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

时间:2011-02-18 06:01:23

标签: function lisp common-lisp symbols

我想要

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

我似乎找不到这样做的功能。

3 个答案:

答案 0 :(得分:9)

有一些,具体取决于你想要做什么。

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

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

第三,有make-symbol,这将始终创建一个新的,未加工的符号,几乎可以保证在这种特定情况下不是你想要的。

答案 1 :(得分:2)

你在找这个吗?

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

给予:1


更新:

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

答案 2 :(得分:2)

>(??? "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的函数对象。

你也可以创建一个表格并评估:

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

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