如何删除反引号内的字符串的引号

时间:2012-05-12 01:38:35

标签: common-lisp

想象一下,我得到了某种由宏调用的函数来返回像

这样的表达式
(do-something 'argument)

因此该功能必须看起来像

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

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

(do-something '"foobar")

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

2 个答案:

答案 0 :(得分:11)

您的问题是:如何摆脱引号?

这个问题确实没用。

1:我们需要问一下,为什么会有'引号'?

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

这是一个字符串:"buddha"

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

答案:符号

这是一个符号:buddha

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

我们需要使用INTERNFIND-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)))