列表最后不接受特殊字符

时间:2014-04-17 13:02:24

标签: lisp

我正在尝试这个例子page当我试图创建一个后序遍历时看到预订遍历的例子,

(defun bin-tree-postorder (B)
  "Create a list containing keys of B in preorder."
  (if (bin-tree-leaf-p B)
      (list (bin-tree-leaf-element B))
    (let ((elmt  (bin-tree-node-element B))
          (left  (bin-tree-node-left    B))
          (right (bin-tree-node-right   B)))
      (cons (bin-tree-postorder left)
            (cons (bin-tree-postorder right) elmt)))))

我得到了(((2) (3) . +) ((7) (8) . -) . *) 但我渴望'(2 3 + 7 8 - *)。当我尝试使用append时,它会说" APPEND:正确的列表不得以"结尾错误。如果在其前置罚款附加任何 +, - ,/ etc但最后为什么抱怨?

我需要帮助解决这个问题。

1 个答案:

答案 0 :(得分:3)

您没有在此代码中构建您的内容:

(cons (bin-tree-postorder left)
      (cons (bin-tree-postorder right)
            elmt))

请考虑以下事项:

> (cons 2 (cons 3 '+))
(2 3 . +)

> (cons (list 2) (cons (list 3) '+))
((2) (3) . +)

请查看this answerDot notation in scheme,详细了解列表中.符号的含义,但精简版是Lisps(包括Scheme)中的正确列表之一:

  • 空列表();或
  • 一个缺点单元格,其car是列表的第一个元素,其cdr正确的列表,是列表的其余部分。

这意味着要制作列表(2 3 +),您需要等效的

(cons 2 (cons 3 (cons '+ '())))

你实际得到的是不同的:

您没有在此代码中构建您的内容:

(cons (bin-tree-postorder left)
      (cons (bin-tree-postorder right)
            elmt))
  • 由于left2(bin-tree-postorder left)(2)
  • 由于right3(bin-tree-postorder right)(3)
  • 由于elmt+elmt(3)

然后你得到的是

> (cons '(2) (cons '(3) '+))
((2) (3) . '+)

如果您想使用append,那么您需要将最后一个参数设为正确的列表。 E.g:

(append (bin-tree-postorder left) (bin-tree-postorder right) (list elmt))