方案中的嵌套 lambda

nested lambda in 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)   <--

如有任何帮助,我们将不胜感激。

在此代码中,您只创建了一个过程对象,然后立即将其丢弃:

(define message 
  (lambda (msg)
    (lambda (newL) 
      (newline))
    (display msg)))

就像在做:

(define message 
  (lambda (msg)
    1234
    (display msg)))

这里的1234求值的,但是这个值完全被忽略了。

如果你有一个过程并且你想立即调用它,你必须用一组额外的括号括起来(因为在 Scheme 中,通常情况下,括号代表应用程序):

(define message 
  (lambda (msg)
    ((lambda (newL) 
       (newline)) #f)
    (display msg)))

但是,正如其他人所指出的,在这种情况下没有必要创建嵌套的 lambda。另外,该过程无论如何都会忽略它的参数,这就是为什么我必须发明一个参数才能通过;我使用 #f 是因为这是典型的 "don't care" 值。你可以这样做:

(define message 
  (lambda (msg)
    (newline)
    (display msg)))