【问题标题】:lisp Cons cell diagram for the list列表的 lisp Cons 单元图
【发布时间】:2017-03-07 12:20:56
【问题描述】:

这是我尝试的代码。

(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))

这个意思是过程缺点单元格。

我该如何解决?

我想知道进程符号的另一件事。

要处理我使用的符号,请尝试 (format t " . ") 并递归打印列表,

但进展并不顺利。

我应该从哪里开始修改?

【问题讨论】:

  • (a . ((b . nil) . (c . nil)))(a (b) c) 相同(只是可视化不同,就像 4 个季度和 1 美元是相同数量的钱)。你想让它返回一个字符串"(a . ((b . nil) . (c . nil)))"吗?
  • 我想要不是字符串。像这样 (a . ((b . nil) . (c . nil)))
  • 让你的函数 return (a . ((b . nil) . (c . nil))) 不使用标准格式 (a (b) c) 是不可能的。您可以返回字符串表示形式,也可以将字符串表示形式打印到屏幕上(不返回)。
  • 感谢您的帮助

标签: lisp common-lisp


【解决方案1】:

你说的

return (a . ((b . nil) . (c . nil))) 当参数是 (a (b) c) 你不需要做任何事情 - 这些已经 相同 (使用 identity : -)。

请看说明书:

具体来说:

虽然下面的两个表达式是等价的,并且读者接受其中一个并产生相同的 cons,但打印机总是以第二种形式打印这样的 cons:

(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 编码标准来格式化您的代码。

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

您可能想使用 Emacs 来编辑您的代码。

【讨论】:

    猜你喜欢
    • 2013-05-12
    • 2010-11-21
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多