Scheme / Racket中lamb的lambda定义是什么?

时间:2015-05-27 13:21:50

标签: lambda scheme racket let

今天我试图理解如何让我们在Scheme / Racket中使用lambda演算的上下文,但是我无法弄清楚如何将let等效于lambda函数。

我认为它的一般形式应该是这样的:

((lambda (p1 p2...) body) v1 v2...)

但绝对不是一个完整的功能定义。

对此有正确/完整定义的想法吗?

提前谢谢!

2 个答案:

答案 0 :(得分:5)

你的例子

((lambda (p1 p2 ...) body) v1 v2 ...)

正是

(let ([p1 v1] [p2 v2] ...) body)

的装置。

您可以将示例转换为这样的宏:

#lang racket

(define-syntax my-let
  (syntax-rules ()
    [(_my-let ([p1 v1] [p2 v2] ...) body)
     ((lambda (p1 p2 ...) body) v1 v2 ...)]))

(my-let ([x 1]
         [y 2])
  (+ x y))

该计划的结果是3。

答案 1 :(得分:4)

R5RS开始,let的定义为:

(define-syntax let
  (syntax-rules ()
    ((let ((name val) ...) body1 body2 ...)
      ((lambda (name ...) body1 body2 ...)
        val ...))
    ((let tag ((name val) ...) body1 body2 ...)
      ((letrec ((tag (lambda (name ...)
                       body1 body2 ...)))
        tag)
      val ...))))