Проблема не в let
, а в применении процедуры .Посмотрите на ваше первое выражение let:
(first ((display "Enter first number:")
(read)))
Вы пытаетесь связать с символом first
результат выражения ((display "Enter first number:") (read))
.Я понимаю, вы ожидаете, что это сделает 2 действия: отобразить сообщение и прочитать ввод, но это не так.Первое выражение (т.е. (display "Enter first number: ")
) будет оценено как void#
.Второе выражение даст вход.После того, как 2 аргумента будут оценены, Схема увидит выражение (void# 4)
.Но это процедура подачи заявки!И Схема сообщает вам об этом с помощью сообщения об ошибке.
Чтобы избежать этого, вы можете сделать 2 вещи: показать сообщение перед let
выражение:
(define (add-two)
(display "Enter first number:")
(let (first (read))
(display "Enter second number:")
(let second (read))
...
Илииспользуйте begin
процедуру для последовательного вычисления выражений:
(define (add-two)
(let* ((first (begin (display "Enter first number:")
(read)))
(second (begin (display "Enter second number:")
(read))))
...