- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
有什么区别:
(cons 'a (cons 'b 'c)) ;; (A B . C)
和
(cons 'a '(b.c)) ;; (A B.C)
我需要使用 cons 创建以下列表 ((a.b).c),所以我试图理解那个“.”是什么。代表。
L.E.:我有以下 (cons (cons 'a 'b) 'c)
但它生成 ((A . B) . C)
而不是 ((A.B).C)
(注意多余的空格)
最佳答案
空格用于分隔列表标记。 A.B
是单个标记。 (A.B)
是一个只有一个元素的列表。 (A . B)
是一个 cons cell,A
是汽车,B
是 cdr。
cons cell 是一对“事物”(对象)。在您的例子中,这些东西是符号,它们被命名为 A
、B
等。这种单元格的打印表示是 (A . B)
,例如。这称为“点符号”。第一个元素称为“car”,第二个元素称为“cdr”。
cons
函数创建这样一个单元格。 (cons 'a 'b)
因此生成单元格 (A . B)
。 请注意名称在内部始终大写。
这很可能是你的老师想要的,所以 ((A . B) . C)
是正确的输出,你的代码就是正确的答案。这是汽车指向另一个单元格的单元格,cdr 包含 C
。另一个单元格是汽车包含 A
和 cdr B
的单元格。
顺便说一句,列表 是此类 cons 单元的线性链,因此 car 始终持有一个值,而 cdr 指向列表的其余部分。最后一个 cdr 指向任何地方(在 Lisp 中称为 NIL)。在点表示法中,列表是例如(A.(B.(C.NIL)))
。由于列表很重要,因此可以将它们写得更短,如下所示:(A B C)
。如果最后一个 CDR 有一个值而不是 NIL,则它以点符号显示,例如(A . (B . (C . D))))
可以写成(A B C . D)
。
关于Lisp 之间的区别 (cons 'a (cons ' b 'c)) and (cons ' a '(b.c)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1859505/
我是一名优秀的程序员,十分优秀!