“让”的方案问题

时间:2010-12-06 01:19:38

标签: function scheme

我正在尝试编写一个计划程序来读取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'

我不知道如何解决这个问题。你认为哪个是错的?

谢谢你!

2 个答案:

答案 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))))
          ...