Lisp 使用'list'或'append'实现cons`
是否有任何方法可以在公共LISP中使用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是列表和附加的构建块,而不是相反
列表
,附加
,第一个
,其余
等实现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)
。同意:“最后一个参数[toappend
]没有被复制;它成为前面列表串联的最后一个点对的cdr。”