这是我尝试的代码。
(defun f (lst)
(cond ((null lst) nil)
((listp (first lst))
nil
(f (car lst)))
(t (cons (first lst)
(list (f (cdr lst)))))))
(f '(a (b) c))
==> (A (B NIL))
我的目标是(f '(a (b) c))
应该返回(a . ((b . nil) . (c . nil)))
。
或(f '(a b))
应该返回(a . (b . nil))
。
这意味着过程利弊细胞。
我该如何解决?
我想知道过程符号的另一件事。
要处理符号,请使用try (format t " . ")
并递归打印列表
但它进展不顺利。
我应该从哪里开始修改?
答案 0 :(得分:3)
当参数为(a . ((b . nil) . (c . nil)))
时,返回 (a (b) c)
您不需要执行任何操作 - 这些相同已经使用(使用identity
: - )。
请查看手册:
具体做法是:
虽然下面的两个表达式是等价的,并且读者接受任何一个并产生相同的缺点,但打印机总是以第二种形式打印这样的缺点:
(a . (b . ((c . (d . nil)) . (e . nil)))) (a b (c d) e)
如果您需要构建字符串 "(a . ((b . nil) . (c . nil)))"
,则需要工作:
(defun cons-cell-diagram-string (x)
(if (consp x)
(format nil "(~A . ~A)"
(cons-cell-diagram-string (car x))
(cons-cell-diagram-string (cdr x)))
(princ-to-string x)))
(cons-cell-diagram-string '(a (b) c))
==> "(A . ((B . NIL) . (C . NIL)))"
该任务的另一种可能解释是返回一个列表但是将点插入字符串:
(defun cons-cell-diagram-list (x &optional (consing-dot "."))
(if (consp x)
(list (cons-cell-diagram-list (car x) consing-dot)
consing-dot
(cons-cell-diagram-list (cdr x) consing-dot))
x))
(cons-cell-diagram-list '(a (b) c))
==> (A "." ((B "." NIL) "." (C "." NIL)))
(cons-cell-diagram-list '(a (b) c) '|.|)
==> (A |.| ((B |.| NIL) |.| (C |.| NIL)))
(cons-cell-diagram-list '(a (b) c) '#\.)
==> (A #\. ((B #\. NIL) #\. (C #\. NIL)))
请注意,我根据普遍接受的Lisp编码标准自由格式化代码。
很明显,nil
子句中有一个多余的listp
(在一个单独的行上)。
您可能希望使用Emacs编辑代码。