Syntax 公共LISP编程中带两个字符串参数的调用函数

Syntax 公共LISP编程中带两个字符串参数的调用函数,syntax,common-lisp,Syntax,Common Lisp,我创建了一个获取两个字符串参数的函数。该函数只需将每个字符串长度相加。下面是一个代码 (defun add_twostring_length (mystr1 mystr2) (+ (length mystr1) (length mystr2)) ) 当我像这样调用add\u twostring\u length函数时 (添加两个字符串长度“cpp”“lisp”) 输出是正确的7 但是,当我以逗号的方式调用同一个函数时 (添加字符串长度“cpp”、“lisp”) 我收到一条错误消息 错误:逗号不

我创建了一个获取两个字符串参数的函数。该函数只需将每个字符串长度相加。下面是一个代码

(defun add_twostring_length (mystr1 mystr2)
(+ (length mystr1) (length mystr2))
)
当我像这样调用
add\u twostring\u length
函数时

(添加两个字符串长度“cpp”“lisp”)

输出是正确的7

但是,当我以逗号的方式调用同一个函数时

(添加字符串长度“cpp”、“lisp”)

我收到一条错误消息

错误:逗号不在反引号内

[条件类型:读卡器错误]

我想以
的方式调用函数(添加两个字符串长度“cpp”、“lisp”)

代码有什么问题


您可能会问“为什么我不能调用没有括号的函数?”在lisp中,您将函数作为sexpr调用,函数在car中,参数在cdr中。这里没有逗号,这是lisp的语法。

您想要的是可能的,但我强烈建议不要使用它:

(set-macro-character #\,
                     #'(lambda (stream char)
                         (read stream t nil t)))
上面的代码创建了所谓的“读取宏”。在读取时,common lisp将查找所有出现的
,并忽略它们。这使得调用以下函数成为可能:

(+ 1, 2, 3) ; => 6
但是,这将破坏模板中的转义:

`(1 2 ,(+ 3 4)) ; => (1 2 (+ 3 4))

也许可以使read宏更智能化,但我不想深入探讨这个问题,因为我不喜欢这个想法。抱歉。

逗号用于在反引号中转义表达式。你没有回帖,所以没有什么需要esacpe的。你能给我一些提示吗?首先,我尝试了
(defun add_twostring_length'(mystr1,(mystr2))(+(length mystr1)(length mystr2))
,但这也不起作用。其次,我尝试了
(defun add_twostring_length'((mystr1)(mystr2))(+(length mystr1)(length mystr2))
它也不起作用。你能给我一些提示吗@克里斯多德@박주현 在Lisp中,不应该使用逗号分隔参数。参数总是用空格分隔,就像你第一次做的那样。使用逗号有语法错误,无法使用。您可能会与Clojure混淆,后者允许使用逗号。我不理解您的想法。我应该用add_twostring_length调用替换char(在您建议的代码中)吗@박주현 (1) 其想法是更改Lisp读取器:。该表达式更改当前的可读表,使逗号与空白一样。(2) 不,您应该执行第一个代码段(3),但您仍然没有说明为什么需要该功能。这一点很重要,因为你的请求是不合理的。写那些不需要的额外的
,这真的是浪费时间,最终会给你带来困扰你睡眠的bug。如果您在宏中意外地执行了
`(/ab,(+5,d)
。请说明错误是内部列表意外地未被引用,如果您使用数字文本进行测试,您将找不到错误。祝您好运!