3

如果我这样做,我会得到什么“什么样的东西”?

(car (list lambda lambda))

我以为我会lambda回来,这意味着我可以做到

(define my_lambda (car (list lambda lambda)))
(define foo (my_lambda (n) (+ n n)))

但这没有用!谢谢,

4

2 回答 2

5

lambda是一种特殊形式(意思是:标准评估规则不适用于它),是语言核心原语的一部分,不是可以分配给变量的符号或其他类型的值。

回答您的问题,评估表达式后您将获得的“类型”(list lambda)将取决于您使用的 Scheme 解释器,但通常您会收到错误。例如,DrRacket 抱怨如下:

lambda: bad syntax in: lambda
于 2012-10-18T22:28:46.477 回答
2

在某种意义上,lambda在运行时不存在(当然,由 lambda 语句创建的函数存在,但这是另一回事;它们lambda本身不是)。

这样做的原因是 lambda 语句操纵了其他在运行时不存在的东西;特别是,它改变了变量名的含义(在你的例子中,n)。

要回答您关于什么是事物的问题lambda,通常的答案是“语法”。幸运的是,Scheme 提供了一种抽象语法的机制:宏。宏可以抽象出仅编译时的实体,例如变量名和 lambda 以及其他宏。所以,你可以写(在这种情况下,在 Racket REPL 中):

> (define-syntax-rule (mylambda (x ...) body)
    (lambda (x ...) body))
> (define foo (mylambda (n) (+ n n)))
> (foo 71)
142

定义 Scheme 宏的系统有多种;syntax-rules系统以一种不寻常但最终非常直观的...方式使用 s。也可以通过编写发出Scheme的Scheme代码来定义宏,这涉及到更多的复杂性。

于 2012-10-19T01:14:20.803 回答