Схема: нельзя использовать #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 когда мне нужно более одного выражения после условия - оно менее многословно.

Другие вопросы по тегам