方案中的嵌套lambda

时间:2016-03-31 06:30:26

标签: function lambda scheme chicken-scheme

我试图在方案中定义一个函数,在调用时打印一条消息,然后是换行符。为此,我尝试使用嵌套的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)   <--

任何帮助都将不胜感激。

1 个答案:

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