0

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

任何帮助,将不胜感激。

4

1 回答 1

0

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

(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 是因为这是典型的“不关心”值。你可以这样做:

(define message 
  (lambda (msg)
    (newline)
    (display msg)))
于 2016-03-31T07:21:02.290 回答