lisp - 如何在 lisp 中创建 (d . nil)

标签 lisp common-lisp clisp

我是 Lisp 初学者。有一个问题我无法解决。

显示当您键入以下内容时 Lisp 将打印出的最简单的表达式 表达式:

’(a b (c . e) (d . nil))

我试过 (cons 'a (cons 'b (cons (cons 'c 'e) (cons (cons 'd nil)))))

但是,它不会创建 (d . nil)。

那么,有什么方法可以创建这样的点对吗?

最佳答案

Show the simplest expression that Lisp will print out when you type the following expression

问题不是要你创建点对,而是如何打印点对。我想这个问题的目的是向您展示列表只是以特殊方式打印的点对。

如果你在 REPL 中写这个:

'(a b (c . e) (d . nil))

REPL 回复:

(A B (C . E) (D))

如果你这样写,你会得到完全相同的输出:

'(a . (b . ((c . e) . ((d . nil) . nil))))

基本上,(a b) 是由符号 a 和子列表 (b) 组成的列表,写为 (a.(b))。这里我只谈表单是如何阅读的。如果您直接在 REPL 中写入它们,它们将首先被读取,然后是求值,在这种情况下您将得到一个错误。这就是示例中被引用的原因:被引用的表达式不会被计算,而是按原样返回。

如果你想编写代码,在计算时生成cons-cell (0 . 1),你必须写这个列表:

(cons 0 1)

上面是三个元素的列表,可以等价写成:

(cons . (0 . (1 . nil)))

您的解释器将阅读此列表(一个符号,两个数字)并评估生成的表格。该表单在运行时生成以下 cons 单元格:

(0 . 1)

关于lisp - 如何在 lisp 中创建 (d . nil),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48940382/

相关文章:

emacs - 史莱姆有什么好处?

vim - 强制 Vim 在 Lisp 中对齐参数

clojure - Clojure 中的合并条件参数(CL 样式)

lisp - 运行 Common Lisp 时遇到问题

LISP:为什么我不能在空列表上使用 cons?

package - Clisp 找不到包

lisp - defvar、defparameter、setf 和 setq 之间有什么区别

syntax - 文件流字符以对象结尾

vector - 如何将数字向量转换为整数?

lisp - 删除重复项时将槽值指定为键