clisp 中的 cons

来源:互联网 发布:linux man命令退出 编辑:程序博客网 时间:2024/05/20 07:33
;nil -> c -> b c -> a b c(cons 'a (cons 'b (cons 'c ()))); b c -> a b c(cons 'a '(b c));c -> b c -> a b c(cons 'a (cons 'b '(c)))

刚学clisp,做到一个习题:

给出 3 种不同表示(a b c) cons表达式。

于是乎,傻傻地敲了几下。快速找到了两种:即上面两种。

对于第三种我尝试了很多写法:

(cons 'a (cons 'b 'c))

输出为:(A B . C)

(cons 'a (cons (cons 'b ()) (cons 'c ())))

输出为:(A (B) C)

(cons 'a (cons 'b (cons () 'c)))

输出为:(A B NIL . C)

(cons '(a b c) nil)
输出为:((A B C))

快把我折磨疯了。最后求助于google。

找到一篇文章:理解lisp中的cons点击打开链接

感觉说得很有道理,什么点列表, 真列表。貌似找到了答案。多厉害啊,一条规则。但是,如何解释

(cons 'a '(b c))

而且,他的想法也就只能推出

(cons 'a (cons 'b (cons 'c ())))
而且我从来不喜欢什么定理,规律。死记硬背的东西,我一向不屑。因为我坚持所有定理规律都是人写的,那么一定是有原因的,是可以被理解的。

后来我发现我已经成功的两个列表中,貌似都是; a b c ()构成的。而且()都是在最右端。(这点和他说的一致:真列表最右端为nil,这是成为真列表的必要条件)

我又尝试了多次后发现,按照优先级,最里层的括号内先执行,并且按照执行顺序进行cons,在cons过程中需要保证真列表(*)位于最右边。(比较理论的表达)

土鳖表达:先定义模板:(*),然后自右向左塞入元素。(多简单啊,多和谐啊)