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

5

I want

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

我似乎找不到一个能做到这个的函数。

2
没有任何东西可以给你第二个形式的行为,因为CL有特殊的规则来评估形式中的运算符,它们不允许这样的结构。 - Xach
3个回答

9

根据你想要做什么,有几种不同的选择。

首先是intern函数,如果已存在该名称的symbol,则返回该symbol,否则创建一个新的。

其次是find-symbol函数,如果存在该symbol,则返回该symbol,否则返回nil(该函数有两个返回值,第二个返回值可以用来区分“返回nil作为symbol”和“没有找到symbol返回nil”的情况)。

第三种选择是make-symbol函数,该函数总是创建一个新的未interned的symbol,几乎肯定不是你在这种情况下想要的。


2

你正在寻找这个吗?

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

输出:1


更新:

那么 (funcall (intern "CAR") '(1 2)) 呢? :)


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

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一起使用。
您还可以创建一个表单并对其进行EVAL:
CL-USER 19 > (eval `(,(find-symbol "CAR") '(1 2)))
1

或者

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接