使用cons
,list
,append
,first
等,是否可以通过哪种方式在公共LISP中实施rest
?
在以下代码中
(defun my_list (&rest arguments)
`(,@arguments) ; Line 1
)
完整第1行是什么意思?
答案 0 :(得分:6)
第一个问题:不,因为cons
是list
和append
的构建基块,而不是相反。这就像试图用房子建造一块砖。
第二个问题:CLHS(http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/sec_2-4-6.html)中解释了反引用语法。
文体评论:
拼写为“Common Lisp”。
请勿使用下划线分隔名称的部分,而是使用连字符:my-list
。
不要让括号晃来晃去。您的代码段应格式如下:
(defun my-list (&rest arguments)
`(,@arguments)) ; Line 1
在宏之外使用反引用语法通常不是一个好主意。在这种情况下,它完全是多余的:
(defun my-list (&rest arguments)
arguments)
答案 1 :(得分:1)
是的,理论上您可以用cons
和list
来定义append
,如下所示:
(defun cons (car cdr) (append (list car) cdr))
答案 2 :(得分:0)
我有第二个问题的答案:
对于,:
如果my_symbol = 1
`(my_symbol 2 3) = (my_symbol 2 3)
,但是:
`(,my_symbol 2 3) = (1 2 3)
,在`语句中评估下一个符号
现在为@(这是一个符号,所以需要激活它)
`(,@('a 'b 'c) ('d 'e 'f)) = ('a 'b 'c ('d 'e 'f) )
`(,@('a 'b 'c) ,@('d 'e 'f) ) = ('a 'b 'c 'd 'e 'f)
我希望这些例子可以提供帮助。 因此,第1行只是从列表中提取参数并将它们放入另一个参数中。
答案 3 :(得分:-1)
这个怎么样?
(defun cons (a b) '(a . b))
或者,如果您迫切需要使用列表......
(defun cons (a b) (first (list '(a . b))))