1

我想知道您将如何在 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. 

我究竟做错了什么?

4

1 回答 1

2

let实际上是一个宏。您不能将其定义为过程。由于您使用的是 Racket,请尝试以下操作:

(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宏(减去 named let):

(define-syntax-rule (let ((id val) ...) body ...)
  ((lambda (id ...) body ...) val ...))

请注意省略号 ( ...) 的使用。这允许零个或多个表单;在这种情况下,它允许let包含多个主体形式。

于 2014-04-16T22:37:31.323 回答