我正在尝试编写一个计划程序来读取2个数字并显示它们的添加,但是我遇到了'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'
我不知道如何解决这个问题。你认为哪个是错的?
谢谢你!
答案 0 :(得分:3)
看起来你有一套不匹配的括号。尝试:
(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 ...)
答案 1 :(得分:3)
问题不在let
,而在程序应用程序。看看你的第一个表达:
(first ((display "Enter first number:")
(read)))
您尝试绑定到表达式first
的符号((display "Enter first number:") (read))
结果。我知道你希望这会做2个动作:显示消息和读取输入,但它不会。第一个表达式(即(display "Enter first number: ")
)将被评估为void#
。第二个表达式将给出一个输入。在评估2个参数后,Scheme将看到表达式(void# 4)
。但这个程序应用程序!并且Scheme会通过您的错误消息告诉您。
要避免这种情况,您可以执行以下操作:在 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))))
...