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