【问题标题】:Scheme if-statement方案 if 语句
【发布时间】:2013-10-13 02:11:00
【问题描述】:

我目前正在和 The Little Schemer 一起学习 Scheme,但遇到了一个奇怪的麻烦。 这是我的代码:

(define rember
  (lambda (a lat)
    ((if (null? lat)
         '()
         (cond
           ((eq? a (car lat)) (cdr lat))
           (else (rember a (cdr lat))))))))

(rember 'aaa '(bbb aaa))

我在教科书中使用了“if”而不是“cond”。从尾递归返回时,显示此错误:

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: '()
  arguments...: [none]

我猜这是因为它将 if 语句中的 '() 视为一个函数,并将尾递归的返回值视为其参数。但是由于这本书没有给我太多关于语言的细节,你能帮我解释一下吗? (例如,这实际上是某种语言特性吗?有什么方法可以让我在这段代码中坚持“if”吗?什么时候可以安全地使用“if”?)

谢谢。

【问题讨论】:

  • 感谢您的提醒。我确实搜索过它,但由于我是今天刚开始的菜鸟,所以几乎无法弄清楚相关性:)。
  • 一般来说,由于在问题中包含完整的错误消息是最佳实践,因此在引号中搜索错误消息将帮助您找到它(因为早期的用户,假设他们遵循实践)将其包含在他们的问题。

标签: scheme lisp racket the-little-schemer


【解决方案1】:

你的 if 周围有一组额外的括号。这个

((if (null? lat)
     '()
      (cond
        ((eq? a (car lat)) (cdr lat))
        (else (rember a (cdr lat))))))

应该是这样的:

(if (null? lat)
    '()
     (cond
       ((eq? a (car lat)) (cdr lat))
       (else (rember a (cdr lat)))))

那些额外的括号告诉Scheme你想像函数一样调用if的结果,所以你会得到一个错误,说'()不是一个函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2012-10-10
    • 1970-01-01
    • 2014-12-03
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多