разница в «если» и «конд» в схеме - PullRequest
0 голосов
/ 04 апреля 2020

Я изучаю Berkeley CS61A, используя Scheme. Функция 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))) ) )

Исходя из моего понимания интерпретации if и cond в SICP, я думаю, что эти две процедуры должны быть эквивалентны. Однако pigl2 не сработало, потому что он дал 'ab для ввода 'ba, и правильный ответ - abay.

Я не знаю, неправильно ли я понял правила оценки if и cond или если я допустил другие глупые ошибки. Пожалуйста, помогите мне, спасибо!

1 Ответ

1 голос
/ 04 апреля 2020

Это ваш код, закомментированный для выделения проблемы:

(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))))))
...