1

想象一下,我得到了某种由宏调用的函数来返回一个类似的表达式

(do-something 'argument)

因此函数必须看起来像

(defun form-expression (arg)
  `(do-something ',arg))

但是当被调用时(form-expression "foobar"),由于包装宏必须接收字符串作为参数,结果是:

(do-something '"foobar")

如何“删除”给定字符串的引号?

4

2 回答 2

12

你的问题是:如何去掉引号?

这个问题真的没用。

1:我们要问,为什么会有“引号”?

答:因为它是字符串的语法。

这是一个字符串:"buddha".

2:我们需要问我们有什么没有“引号”?

答案:符号

这是一个符号:buddha

3:如果我们有一个字符串,我们如何创建或获取对应的符号?

我们需要使用INTERNor FIND-SYMBOL

> (intern "buddha")
|buddha|

4:为什么会有竖条?

默认情况下,所有符号在内部都是大写的(早期有很多计算机只有大写字符,而 Lisp 早在大洪水之前就被发现了)。

因此,Common Lisp 使用竖线在符号有非大写字符时对其进行转义。

5:我怎样才能得到一个正常的内部大写符号?

使用功能STRING-UPCASE

> (intern (string-upcase "buddha"))
BUDDHA 

现在我们住了一尊大佛

于 2012-05-12T09:24:09.777 回答
2

如果我对您的理解正确,对于“foobar”的输入,您希望结果form-expression(do-something 'foobar).

如果是这种情况,请使用该intern功能。您要么需要传递interned 字符串(如 中(form-expression (intern "foobar"))),要么需要在函数中进行类型调度

(defun form-expression (arg)
   `(do-something ',(if (stringp arg) (intern arg) arg)))

实际上,由于您要根据参数的类型进行调度,因此这是使用方法的理想场所。

(defmethod form-expression (arg) `(do-something ',arg))
(defmethod form-expression ((str string)) `(do-something ',(intern str)))
于 2012-05-12T03:27:28.257 回答