[英]Scheme R5RS: defining let expression
我想知道您将如何在Scheme中定义自己的let表达式(我对Scheme非常陌生)。 我希望它看起来像(mylet id expr1 expr2),其中id绑定到expr1的值并在expr2中使用。 我认为这可能与以下内容类似:
(define (mylet x a body)
((lambda (x) body) a) )
但这不起作用。
当我尝试
(mylet x 4 (* x 4))
我收到以下错误:
x: undefined; cannot reference undefined identifier.
我究竟做错了什么?
let
实际上是一个宏。 您不能将其定义为过程。 由于您使用的是球拍,请尝试以下操作:
(define-syntax-rule (mylet x a body)
((lambda (x) body) a))
看起来几乎像您的原始代码,但是使用define-syntax-rule
而不是define
。 ;-) define-syntax-rule
实际上是以下完整宏的快捷方式:
(define-syntax mylet
(syntax-rules ()
((_ x a body)
((lambda (x) body) a))))
实际上,您甚至可以通过以下方式定义“标准” let
宏(减去名为let
):
(define-syntax-rule (let ((id val) ...) body ...)
((lambda (id ...) body ...) val ...))
请注意省略号( ...
)的使用。 这允许零种或多种形式; 在这种情况下,它可以让let
含有多种人体形式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.