Jan*_*nne 8 lambda scheme guile
我正在学习Guile Scheme,在文档中我突然遇到了以下构造:
((lambda args (display args)) 42)
=> (42)
Run Code Online (Sandbox Code Playgroud)
这让我陷入了困境; 直到这一点,我假设正式参数始终包含在列表中:
((lambda (args) (display args)) 42)
=> 42
Run Code Online (Sandbox Code Playgroud)
我想知道何时使用这个变体,以及它如何与可变数量的参数的点表示法不同.具体来说,以下两个变体之间有什么区别:
((lambda args (display args)) 1 2 3) => (1 2 3)
((lambda (. args) (display args)) 1 2 3) => (1 2 3)
Run Code Online (Sandbox Code Playgroud)
是否存在差异 - 也许是为了更复杂的例子 - 我需要注意并且是否有理由更喜欢一个而不是另一个?
区别在于此版本接收一个名为的参数args,当您确切知道lambda表单所需的实际参数数量时,这个参数非常有用:
(lambda (args) (display args))
Run Code Online (Sandbox Code Playgroud)
此版本接收一个(可能为空)参数列表args,当您期望lambda表单的参数可变数量时,这些参数列表非常有用:
(lambda args (display args))
Run Code Online (Sandbox Code Playgroud)
以下两个版本之间应该没有区别,但并非所有解释器都接受第二个版本,因为它在点之前缺少部分(因此应该避免):
(lambda args (display args))
(lambda (. args) (display args))
Run Code Online (Sandbox Code Playgroud)
如果要指定lambda表单具有一个或多个必需参数(点左侧的符号)和零个或多个可选参数列表(点右侧的单个符号),则以下版本非常有用:
(lambda (mandadory1 mandatory2 . optional) (display mandatory1))
Run Code Online (Sandbox Code Playgroud)