想象一下,我得到了某种由宏调用的函数来返回像
这样的表达式(do-something 'argument)
因此该功能必须看起来像
(defun form-expression (arg)
`(do-something ',arg))
但是当调用(form-expression "foobar")
时,由于包装宏必须接收字符串作为参数,结果是:
(do-something '"foobar")
如何“删除”给定字符串的引号?
答案 0 :(得分:11)
您的问题是:如何摆脱引号?
这个问题确实没用。
1:我们需要问一下,为什么会有'引号'?
答案:因为它是字符串的语法。
这是一个字符串:"buddha"
。
2:我们需要问一下没有“引号”我们有什么?
答案:符号。
这是一个符号:buddha
。
3:如果我们有字符串,我们如何创建或获取相应的符号?
我们需要使用INTERN
或FIND-SYMBOL
。
> (intern "buddha")
|buddha|
4:为什么它垂直吧?
默认情况下,所有符号都是内部大写的(在早期,有很多计算机只有大写字符,并且在大洪水之前很久就发现了Lisp。)
因此Common Lisp使用垂直条来转义符号,当它们具有非大写字符时。
5:如何获得正常的内部大写符号?
使用函数STRING-UPCASE
:
> (intern (string-upcase "buddha"))
BUDDHA
现在我们实习了一个大佛。
答案 1 :(得分:2)
如果我理解正确,对于“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)))