使用`list`或`append`实现cons

时间:2010-11-18 15:03:07

标签: lisp common-lisp

使用conslistappendfirst等,是否可以通过哪种方式在公共LISP中实施rest

在以下代码中

(defun my_list (&rest arguments)
   `(,@arguments) ; Line 1
)

完整第1行是什么意思?

4 个答案:

答案 0 :(得分:6)

第一个问题:不,因为conslistappend的构建基块,而不是相反。这就像试图用房子建造一块砖。

第二个问题: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)

是的,理论上您可以用conslist来定义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))))