方案 if 语句

标签 scheme lisp racket the-little-schemer

我目前正在与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”?)

谢谢。

最佳答案

您的 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 的结果,所以你会得到错误提示 '() 不是函数。

关于方案 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19341125/

相关文章:

hash - SHA256 的 "pure"方案实现(R5RS)?

scheme - Racket "eval"一个数据

list - 在 Lisp 中使用 AND

compiler-construction - 是否有针对不同 "RnRS"方案标准的摘要?

scheme - 检查参数是列表还是原子

scheme - Racket 计划 - 成员(member)?功能难题

scheme - 是否可以更改DrRacket/Scheme搜索/引用库的顺序?

scheme - 如何在方案/ Racket 中使用展开来编写 Collat​​z 序列?

lambda - 在Scheme中使用lambda表达式来定义函数的原因是什么?

iteration - SICP - 我对阶乘迭代过程的递归定义不好吗?