Схема проблемы с «пусть» - PullRequest
       3

Схема проблемы с «пусть»

1 голос
/ 06 декабря 2010

Я пытаюсь написать программу-схему для чтения двух чисел и отображения их сложения, но у меня проблема с выражением 'let'

(define (add-two)
  (let* ((first ((display "Enter first number:")
                (read)))
        (second ((display "Enter second number:")
                 (read))))
        (sum (+ first second))
        )
    (display "total is " sum)
    )

После прочтения первого числа программа вылетает ... и указывает на выражение let, компилятор сообщает

'процедура применения: ожидается процедура, заданная: #; аргументы были: 4 '

Я не уверен, как это исправить .. Что вы думаете не так?

спасибо в adv!

Ответы [ 2 ]

3 голосов
/ 06 декабря 2010

Проблема не в 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))))
          ...
3 голосов
/ 06 декабря 2010

Похоже, у вас несоответствующий набор скобок.Попробуйте:

(define (add-two) 
  (let* ((first (begin
                  (display "Enter first number:") 
                  (read))) 
         (second (begin
                   (display "Enter second number:") 
                   (read)))
         (sum (+ first second)))
    (display "total is " sum)))

В форме let* первые круглые скобки объединяют новые привязки, затем остальные (в данном примере display) - это тело.В общем:

(let* ((a1 x1) (a2 x2) ...) body ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...