Scheme 中 "if" 和 "cond" 的区别

difference in "if" and "cond" in Scheme

我正在使用 Scheme 学习 Berkeley CS61A。 pigl函数用于引入递归,示例代码如下

(define (pigl wd)
  (if (pl-done? wd) 
    (word wd 'ay)
    (pigl (word (bf wd) (first wd))) ) )

我尝试将if改为cond表达式,修改后的代码如下

(define (pigl2 wd)
  (cond ((pl-done? wd) (word wd 'ay))
      (else pigl2 (word (bf wd) (first wd))) ) )

根据我对SICP中ifcond解释的理解,我认为这两个过程应该是等价的。但是 pigl2 没有工作,它给出了 'ab 输入 'ba 并且正确答案是 abay.

不知道是我理解错了ifcond的求值规则,还是犯了其他愚蠢的错误。请帮助我,谢谢!

这是你的代码,注释以突出问题:

(define (pigl2 wd)
  (cond ((pl-done? wd) (word wd 'ay))
      (else
       pigl2 ; this line does nothing at all
       (word (bf wd) (first wd))))) ; return result of calling `word`

您实际上忘记了 调用 pigl2:缺少括号!这应该可以解决问题:

(define (pigl2 wd)
  (cond ((pl-done? wd) (word wd 'ay))
        (else (pigl2 (word (bf wd) (first wd))))))