列表的lisp Cons单元格图

时间:2017-03-07 12:20:57

标签: lisp common-lisp

这是我尝试的代码。

(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 " . ")并递归打印列表

但它进展不顺利。

我应该从哪里开始修改?

1 个答案:

答案 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)))

PS

请注意,我根据普遍接受的Lisp编码标准自由格式化代码。

很明显,nil子句中有一个多余的listp(在一个单独的行上)。

您可能希望使用Emacs编辑代码。