Схема: нельзя использовать #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 только для двух веток, и я пытался использовать для этого 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? Был бы очень признателен за объяснение, так как я все еще новичок в Scheme.


person Soumik Das    schedule 01.06.2013    source источник


Ответы (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, когда мне нужно более одного выражения после условия - это менее подробно.

person Óscar López    schedule 01.06.2013
comment
+1, но лично я думаю, что было бы гораздо естественнее инвертировать условие. Еще лучше формы when или unless, если нет другой ветки - person djf; 02.06.2013
comment
спасибо... я уже писал con с begin несколько раз, но никогда не знал, что это было неявно. - person Soumik Das; 02.06.2013