方案

2017-05-31 35 views
0

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

我不知道为什么。它的第三行

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

回答

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

这里是abs一个定义:

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

当给返回评估-的结果,否则+所以如果你是通过-5变得(- -5)和的情况下5获得通过,也为负数变成(+ 5)。两者评估为5。你看到我正在使用表达式作为函数返回吗?这也就是在括号的意思..在一个类似C语言无视围绕每个学期你有双括号几个地方的括号的时候我可能会做类似(n < 0 ? sub : add)(0, n)

在你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))))) 

注意括号与同一级别对齐,以便您知道下一个词何时开始。它可以帮助你阅读代码,因为你在问题中的格式没有提供任何线索。得到一个适当的编辑器来做你的编码。