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

Lisp 使用'list'或'append'实现cons`,lisp,common-lisp,Lisp,Common Lisp,是否有任何方法可以在公共LISP中使用列表,附加,第一个,其余等实现cons 在下面的代码中 (defun my_list (&rest arguments) `(,@arguments) ; Line 1 ) 完整的第1行是什么意思?这个怎么样 (defun cons (a b) '(a . b)) 或者,如果你迫切需要使用列表 (defun cons (a b) (first (list '(a . b)))) 第一个问题:不,因为cons是列表和附加的构建块,而不是相反

是否有任何方法可以在公共LISP中使用
列表
附加
第一个
其余
等实现
cons

在下面的代码中

(defun my_list (&rest arguments)
   `(,@arguments) ; Line 1
)
完整的第1行是什么意思?

这个怎么样

(defun cons (a b) '(a . b))
或者,如果你迫切需要使用列表

(defun cons (a b) (first (list '(a . b))))

第一个问题:不,因为
cons
列表
附加
的构建块,而不是相反。这就像试图用房屋建造一块砖

第二个问题:CLHS()中解释了反引号语法

风格评论:

  • 它的拼写是“commonlisp”

  • 不要使用下划线分隔名称的各个部分,而是使用连字符:
    my list

  • 不要让括号挂在周围。您的代码段的格式应如下所示:

    (defun my-list (&rest arguments)
      `(,@arguments)) ; Line 1
    
  • 在宏之外使用反引号语法通常不是一个好主意。在这种情况下,这完全是多余的:

    (defun my-list (&rest arguments)
      arguments)
    

    • 第二个问题我有答案:
      对于以下内容:
      如果my_symbol=1
      `(my_symbol 23)=(my_symbol 23)
      ,但带有,:

      `(,my_符号23)=(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行只是从一个列表中提取参数并将其放入另一个列表中

      是的,理论上你可以用
      列表
      追加
      来定义
      cons
      ,如下所示:

      (defun cons (car cdr) (append (list car) cdr))
      

      复制品?你想解释一下这个问题的答案吗?你为什么要这么做?CONS是创建CONS单元格的基本操作。这不起作用。上面的代码将使(cons 1 2)和(cons 4 5)相等(相同,创建读取时间,返回cons)。为什么在宏之外使用反引号语法不是一个好主意?我不能代表Svante,但在我看来,在不必要的地方使用额外语法总是一个坏主意。根据我的经验,很少有时候你需要在宏之外加上反引号。@Alexandre Deschamps:当你最好将s表达式作为模板查看时,反引号总是很有用的。没有任何东西将backquote与宏绑定。不,
      (cons12)
      应该返回
      (1.2)
      ,但是您的版本会发出错误信号。您使用的是什么Lisp?这在CLisp和emacslisp中适用:
      (append(list 1)2)==>(1.2)
      。同意:“最后一个参数[to
      append
      ]没有被复制;它成为前面列表串联的最后一个点对的cdr。”