想象一下,我得到了某种由宏调用的函数来返回一个类似的表达式
(do-something 'argument)
因此函数必须看起来像
(defun form-expression (arg)
`(do-something ',arg))
但是当被调用时(form-expression "foobar")
,由于包装宏必须接收字符串作为参数,结果是:
(do-something '"foobar")
如何“删除”给定字符串的引号?
想象一下,我得到了某种由宏调用的函数来返回一个类似的表达式
(do-something 'argument)
因此函数必须看起来像
(defun form-expression (arg)
`(do-something ',arg))
但是当被调用时(form-expression "foobar")
,由于包装宏必须接收字符串作为参数,结果是:
(do-something '"foobar")
如何“删除”给定字符串的引号?
你的问题是:如何去掉引号?
这个问题真的没用。
1:我们要问,为什么会有“引号”?
答:因为它是字符串的语法。
这是一个字符串:"buddha"
.
2:我们需要问我们有什么没有“引号”?
答案:符号。
这是一个符号:buddha
。
3:如果我们有一个字符串,我们如何创建或获取对应的符号?
我们需要使用INTERN
or FIND-SYMBOL
。
> (intern "buddha")
|buddha|
4:为什么会有竖条?
默认情况下,所有符号在内部都是大写的(早期有很多计算机只有大写字符,而 Lisp 早在大洪水之前就被发现了)。
因此,Common Lisp 使用竖线在符号有非大写字符时对其进行转义。
5:我怎样才能得到一个正常的内部大写符号?
使用功能STRING-UPCASE
:
> (intern (string-upcase "buddha"))
BUDDHA
现在我们住了一尊大佛。
如果我对您的理解正确,对于“foobar”的输入,您希望结果form-expression
为(do-something 'foobar)
.
如果是这种情况,请使用该intern
功能。您要么需要传递intern
ed 字符串(如 中(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)))