在Scheme中调用函数时出错

时间:2017-05-31 17:07:01

标签: scheme racket

我的代码显示此错误 - function call: expected a function after the open parenthesis, but received (void)

我不知道为什么。它在第3行

(define countdown
  (lambda (n)
    (cond ((zero? n) (( display "Time") (newline)))
       (else
        ((display n) (newline) (countdown ( - n 1)))))))

2 个答案:

答案 0 :(得分:1)

使用cond语句时,您不需要围绕后果表达式使用括​​号。一般结构是:

(cond (condition1 expr1 expr2 expr3 ...)       ;; NOT (... (expr1 expr2 expr3 ...))
      (condition2 expr1 expr2 expr3 ...)
      ...
      (else ...))

因此您的具体案例可以修复为:

(cond ((zero? n) (display "Time") (newline))
      (else (display n) (newline) (countdown (- n 1))))

并且程序可以改写为:

(define countdown
  (lambda (n)
    (cond ((zero? n)
           (displayln "Time"))
          (else
           (displayln n)
           (countdown (- n 1))))))

如果在结果表达式周围包括括号,例如,有

((display "Time") (newline))

然后将其解释为程序

(procedure-name arg)

其中procedure-name的值为(display "Time"),而arg的值为(newline)。由于(display "Time")仅用于没有返回值的副作用,因此您获得过程的常量#<void>,因此出现错误消息:期望可以应用于参数的过程

答案 1 :(得分:1)

以下是abs的定义:

(define (abs n)
  ((if (< n 0) - +) n))

如果给出一个负数,那么评估-的结果会返回+,所以如果你要传递-5,它会变成(- -5),而5就是(+ 5)传递它变成5。两者都评估为(n < 0 ? sub : add)(0, n)。你看到我使用表达式作为函数的返回吗?这就是括号的意思..在类似C语言中,我可能做过类似cond

的事情。

((display "Time") (newline)) ((display n) (newline) (countdown ( - n 1))) 忽略围绕每个词语的括号时,你会有几个地方加上括号:

{}

他们都假设显示功能返回一个可以应用的功能。它并不会告诉你这不是一个功能,它会失败。

如果您希望将命令组合在一起,例如C语言中的begin,那么您正在寻找特殊形式(begin 1 2 3) ; ==> 3。例如。 cond

begin在每个术语中都有明确的(define (countdown n) (cond ((zero? n) (display "Time") (newline)) (else (display n) (newline) (countdown (- n 1))))) ,因此,如果您只是希望对每个部分进行评估,则修复程序如下所示:

(define (countdown n)
  (cond 
    ((zero? n) 
     (display "Time") (newline))
    (else 
     (display n) 
     (newline) 
     (countdown (- n 1)))))

格式化的另一种方法是:

master

注意括号与同一级别对齐,以便您知道下一个术语何时开始。它可以帮助您阅读代码,因为您在问题中的格式不会给出任何线索。找一个合适的编辑器进行编码。