Scheme R5RS:定义let表达式

时间:2014-04-16 21:37:05

标签: scheme racket r5rs

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

我做错了什么?

1 个答案:

答案 0 :(得分: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宏(减去名为let)这样:

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

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