Cons 用法的一点疑问
平时用Cons,经常是形成点对。(cons 1 2)返回(1 . 2),(cons '1 2)返回(1 . 2)。这两个返回值中的1,有什么不同么?另外,我想生成(1 . (34 5 6 7)或者 (“1” . (1 2 3 4 5 6))这样的表对,可以么?
点对的最后一项一定是atom,前边是什么没有具体要求,比如(1 . 2),(1 2 3 4 . 5),((1 2 3 4) . 5)都是有效点对,虽然后边两种实际基本用不到,但都是有效的点对;
但类似(1 . (34 5 6 7))或者 (“1” . (1 2 3 4 5 6))的数据是不存在的,CAD的list认为它是不合法的,所以无法构建出它们,哪怕通过read都得不到这样的数据,(read"(1 . (34 5 6 7))")将得到的(1 3 4 5 6 7)
CONS的作用有两个,构建点对只是其中一个作用,另一个作用是给已有的表在表头位置增加一个元素,Adds an element to the beginning of a list, or constructs a dotted list
(cons new-first-element list-or-atom)
(cons'(1 2 3 4)5)->((1 2 3 4) . 5),(cons 1 nil)->(1)
另一个和CONS极其相似但不尽相同的是vl-list*,但都无法构建出楼主希望的数据,因为那样的数据本身是不合法的表或点对
本帖最后由 vitalgg 于 2023-6-14 18:26 编辑
(1 .(3 4 5 6 7)) 与 (1 3 4 5 6 7) 是等价的。
构成lisp基本元素是原子和点对,而不是原子和列表。
列表是由点对组成的。
Lisp 在打印链表的时候,会有一些原则:它输出的时候会省略掉一些 . 连结点对的点,以及 () 括号。而省略的原则如下,如果这个点对的 CDR 是 NIL 的话,那这个 NIL 跟它前面的连结点将不会被印出来;如果这个点对 A 的 CDR 是另外一个点对 B 的话,那在点对 B 前面的连结点以及点对 B 本身的小括号都不会被印出来。
更详细的内容见:
https://gitee.com/atlisp/atlisp- ... E9%97%A8/1-lisp.org
太高级学习了
页:
[1]