我的代码显示此错误 - 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)))))))
答案 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
注意括号与同一级别对齐,以便您知道下一个术语何时开始。它可以帮助您阅读代码,因为您在问题中的格式不会给出任何线索。找一个合适的编辑器进行编码。