Схема: нельзя использовать #t в операторе if
Извиняюсь, если название вопроса немного сбивает с толку. Может быть, после того, как вы прочитаете это, вы можете предложить мне лучший заголовок.
Как часть домашнего задания для онлайн-курса, я написал итерационную процедуру в mit-scheme
для отображения числа от 1 до заданного числа.
Код ниже работает нормально:
(define (count2-iter num)
(define (iter counter)
(cond ((> counter num) #t)
(else (display counter)
(iter (+ counter 1)))))
(iter 1))
Выход:
1 ]=> (load "count2-iter.scm")
;Loading "count2-iter.scm"... done
;Value: count2-iter
1 ]=> (count2-iter 10)
12345678910
;Value: #t
Лично я не люблю использовать cond
только для 2 веток и я попытался использовать if
за это.
(define (count2-iter1 num)
(define (loop idx)
(if (> idx num)
#t
((display idx)
(loop (+ idx 1)))))
(loop 1))
Выход:
1 ]=> (count2-iter1 5)
5
;The object #!unspecific is not applicable.
;To continue, call RESTART with an option number:
; (RESTART 2) => Specify a procedure to use in its place.
; (RESTART 1) => Return to read-eval-print level 1.
Почему это? Не должен #t оцениваться так же, как он использовался в cond
? Буду очень признателен за объяснение, так как я все еще новичок в Схеме.
1 ответ
Попробуйте это вместо этого:
(define (count2-iter1 num)
(define (loop idx)
(if (> idx num)
#t
(begin ; notice the difference!
(display idx)
(loop (+ idx 1)))))
(loop 1))
И вот почему: когда вы используете if
, может быть только одно выражение в последовательной части и одно в альтернативной части. Если требуется более одного выражения, мы должны окружить их (begin ...)
, Вы окружили выражения между (...)
, что не в порядке, потому что скобки используются для приложения функции (поэтому сообщение об ошибке гласит, что The object #!unspecific is not applicable
).
С другой стороны, cond
имеет неявное begin
для каждого из его пунктов, когда условие выполняется. Лично я предпочитаю придерживаться использования cond
когда мне нужно более одного выражения после условия - оно менее многословно.