Lisp中如何构造(key . (list of values))形式的点对结构?
Lisp点对列表
(key . (list of values))构造说明 完全可以实现你需要的(a . (b c))结构,你构造出反向的((a b) . c)本质是cons函数的参数顺序写反了。
Lisp中点对(cons cell)的构造规则非常明确:
cons函数接收两个参数,第一个参数会成为点对的car(也就是点号.前面的元素),第二个参数会成为点对的cdr(也就是点号.后面的元素)- 你需要的
(a . (b c))其实就是Lisp里最普通的标准列表(a b c)——标准列表的底层存储就是嵌套的点对,最后一个点对的cdr为空列表nil,(a . (b c))是这个结构的完全展开写法,平时REPL默认会把这种结构简写为(a b c),二者完全等价。
构造示例
;; 正确构造目标结构,car为原子a,cdr为列表(b c) (cons 'a '(b c)) ;; 底层存储结构就是(a . (b c)),REPL默认打印为(A B C) ;; 你当前错误写法:car为列表(a b),cdr为原子c,得到反向错误结构 (cons '(a b) 'c) ;; 打印结果为((A B) . C)
如果需要让REPL显式打印出带点号的完整展开形式,而非列表简写,可以打开对应Lisp实现的点对打印开关:比如Common Lisp中执行(setf *print-pretty* nil)后再输出结构,就能看到显式的点对表示。
内容的提问来源于stack exchange,提问作者Void
相关产品推荐
相关产品推荐

