如果我这样做,我会得到什么“什么样的东西”?
(car (list lambda lambda))
我以为我会lambda
回来,这意味着我可以做到
(define my_lambda (car (list lambda lambda)))
(define foo (my_lambda (n) (+ n n)))
但这没有用!谢谢,
lambda
是一种特殊形式(意思是:标准评估规则不适用于它),是语言核心原语的一部分,不是可以分配给变量的符号或其他类型的值。
回答您的问题,评估表达式后您将获得的“类型”(list lambda)
将取决于您使用的 Scheme 解释器,但通常您会收到错误。例如,DrRacket 抱怨如下:
lambda: bad syntax in: lambda
在某种意义上,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代码来定义宏,这涉及到更多的复杂性。