【问题标题】:Problem with list in LispLisp中的列表问题
【发布时间】:2011-01-07 12:54:53
【问题描述】:

我正在尝试在 Lisp 中编写一个简单的过程来将元素插入到二叉搜索树中。

我将树表示为一个列表:

  • 树中的第一个元素是根
  • 第二个元素是左子树
  • 第三个元素是右子树

这是我的代码:

(define Insert
  (lambda (x T) 
    (if (null? T) 
        (list x '() '())
        (if (> x (car T)) 
            (list (car T)
                  (cadr T)
                  (Insert x (list (caddr T))))
            (list (car T)
                  (Insert x (cadr T))
                  (list (caddr T)))))))

当我像这样调用过程:(Insert 2 '(4 '(2 '() '() ) '())) 时,出现 ">" 的问题,因为第二个参数不是实数,但我不知道为什么。

例外:

>: expects type <real number> as 2nd argument, given: quote; other arguments were: 2

但是,当我这样调用程序时:(Insert 2 ( list 4 (list 2 '() '() ) '())), 成功了。

为什么?

我知道'(1 '() '())(list 1 '() '()) 是相等的,不是吗?

【问题讨论】:

    标签: list functional-programming lisp scheme


    【解决方案1】:

    不,quotelist 根本不一样。 'foo的含义是(quote foo)

    '(a b c) 正好是(quote (a b c)),即列表文字quote 运算符阻止对列表进行评估)。它类似于"a b c",这是一个字符串文字5,这是一个数字文字。修改文字的操作具有未定义的效果,当您看到像 (setf 3 4) 这样的废话时,您可能会立即认出。

    另一方面,(list a b c) 根据abc 的值创建(“conses”)一个新列表。

    我相信,如果您消除对 quotelist 的困惑,您将能够更正您的代码。

    【讨论】:

      【解决方案2】:

      '(1 '()) 等价于(list 1 (list 'quote nil))。我怀疑如果你去掉“内部”引号字符,你会没事的。

      因此,生成等于(list 1 '() '()) 的表达式的引用表达式是'(1 () ())

      【讨论】:

      • 另外,Lisp 中的 nil 在 Scheme 中是 '()
      • @erijang:啊,我以为 nil 和 () 是一样的,但是 nil 和 #f 是不同的。
      猜你喜欢
      • 1970-01-01
      • 2015-05-16
      • 2011-01-15
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多