【问题标题】:When to use lambda definition with a "bare" formal parameter?何时使用带有“裸”形参数的 lambda 定义?
【发布时间】:2012-02-07 20:22:23
【问题描述】:

我现在正在学习Guile Scheme,在文档中我突然遇到了以下构造:

((lambda args (display args)) 42)
=> (42)

这让我陷入了困境;到目前为止,我一直认为形式参数总是包含在一个列表中:

((lambda (args) (display args)) 42)
=> 42

我想知道何时使用此变体,以及它与可变数量参数的点表示法有何不同。具体来说,以下两种变体有什么区别:

((lambda args (display args)) 1 2 3)     => (1 2 3)
((lambda (. args) (display args)) 1 2 3) => (1 2 3)

是否有区别——也许对于更复杂的例子——我需要注意,是否有任何理由更喜欢其中一个?

【问题讨论】:

  • 另外,list 的定义是(define list (lambda x x))

标签: lambda scheme guile


【解决方案1】:

这让我陷入了循环;到目前为止,我一直认为形式参数总是包含在一个列表中:

请注意,(a . args)(a b . args) 之类的内容也不是真正的列表。 (a . args) 是一对,其中car 是符号acdr 是符号args(a b . args) 是一对,其中car 是符号acdr 是(一对car 是符号bcdr 是符号args)。有一段时间它看起来有点像一个列表,有ab 之类的,但由于它没有以null/空列表结尾,所以它不是一个真正的列表。像这样的结构通常被称为不正确的列表。如果您愿意,可以阅读一些关于点对符号 here 或其他地方的内容...

对于(. args),我可能会说“这是一对,其中cdr 是符号args”。或者它可能会像“一对carcdrargs”。无论哪种方式,它都没有多大意义,而且,正如 Chris Jester-Young 所说,它不是真正有效的方案。

所以。像(a b . args) 这样的东西只是常规的点对符号,用于将不为空的东西放在最后一个cdr 中。如果 Scheme 中的形参-thing 可以是那些不正确的列表之一或正确的列表或只是一个符号,那么形参-thing 的定义必须类似于:形参-thing 必须为空、符号、或者car是一个符号而cdr是一个形式参数的一对。

(我认为这是一种很酷的东西,它提供了一种将参数绑定到参数的相当优雅的方式。就像,你看看形式参数的东西,如果它是一个符号,你将参数列表绑定到那个如果它是一对,则将参数的car 绑定到形式参数事物的cdr 并在形式参数事物/参数的cdr 上重复出现(哦,如果它为空,你就像完成了或其他什么)。这让我觉得比 Common Lisp 方式的“如果car 中的符号是&rest 你将其余的参数绑定到之后的符号”更漂亮。)

【讨论】:

  • 虚线对 - 我从未建立连接。认为这是形式参数规范的特定符号。谢谢;有机会我会修改我的问题。
【解决方案2】:

不同之处在于此版本接收一个名为 args 的参数,这对于您确切知道 lambda 表单预期的实际参数数量的情况很有用:

(lambda (args) (display args))

这个版本接收一个(可能是空的)列表参数,称为args,当你期望lambda形式的参数数量可变时很有用:

(lambda args (display args))

以下两个版本应该没有区别,但并非所有解释器都会接受第二个版本,因为它缺少点之前的部分(因此应该避免):

(lambda args (display args))
(lambda (. args) (display args))

当您要指定lambda 表单具有一个或多个强制参数(点左侧的符号)和零个或多个可选参数列表(右侧的单个符号)时,以下版本很有用点):

(lambda (mandadory1 mandatory2 . optional) (display mandatory1))

【讨论】:

  • (. args) 不是有效的方案读取语法。然而,Guile 似乎将其读者扩展为args。它绝对不是便携式的,就像你说的,最好避免。
  • 太好了,谢谢。我认为情况正好相反;假设仅点形式是完全标准的,而“裸”形式有点奇怪。对于我的初学者来说,我想点形式更自然地遵循其他形式。
猜你喜欢
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2021-10-15
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多