2012-05-12 21 views
1

想象我得到了某种由宏调用的函数返回像如何删除反引号内的字符串quotationmarks

(do-something 'argument) 

的表达,因此功能有看起来像

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

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

(do-something '"foobar") 

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

回答

2

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

如果是这种情况,请使用intern函数。你要么需要通过intern编辑字符串(如(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))) 
10

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

这个问题不是很有用。

1:我们需要问,为什么会有'quotationmarks'?

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

这是一个字符:"buddha"

2:我们需要问一下没有'引用标记'我们有什么?

答案:符号

这是一个符号:buddha

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

我们需要使用INTERNFIND-SYMBOL

> (intern "buddha") 
|buddha| 

4:为什么会竖线?

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

所以常见Lisp使用竖线来转义符号时,他们有非大写字符。

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

使用功能STRING-UPCASE

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

现在我们已经拘留了大量佛

相关问题