我试图在方案中定义一个函数,在调用时打印一条消息,然后是换行符。为此,我尝试使用嵌套的lambda,如下所示:
(define message
(lambda (msg)
(lambda (newL)
(newline)
)
(display msg))
)
然而,当我这样做时,并调用如下函数:
(message "#f")
它只打印#f,而不创建换行符。如果我在函数中反转lambda订单并交换newL和msg lambda的位置,那么它只打印一个换行符并且不显示该消息!
在这段代码中调用该函数:
(define (permute upList)
(if (null? upList)
(message "#f")
;permutation code
)
)
不使用嵌套的lambda时收到的错误消息如下:
错误:调用非程序:#
Call history:
<syntax> (permute (quote ()))
<syntax> (quote ())
<syntax> (##core#quote ())
<eval> (permute (quote ()))
<eval> [permute] (null? upList)
<eval> [permute] (message "#f")
<eval> [message] ((display msg) (newline))
<eval> [message] (display msg)
<eval> [message] (newline) <--
任何帮助都将不胜感激。
答案 0 :(得分:0)
在此代码中,您只创建一个过程对象,然后立即将其丢弃:
(define message
(lambda (msg)
(lambda (newL)
(newline))
(display msg)))
就像在做:
(define message
(lambda (msg)
1234
(display msg)))
此处的 是,但该值完全被忽略。
如果你有一个程序而你想立即调用它,你必须包含一组额外的括号(因为在Scheme中,通常,parens代表应用程序):
(define message
(lambda (msg)
((lambda (newL)
(newline)) #f)
(display msg)))
但是,正如其他人所指出的那样,在这种情况下不需要创建嵌套的lambda。此外,该程序无论如何都忽略了它的论证,这就是为什么我必须发明一个论证才能通过;我使用#f因为这是典型的“不关心”值。你可以这样做:
(define message
(lambda (msg)
(newline)
(display msg)))