【问题标题】:What would be the lambda definition of let in Scheme / Racket? [duplicate]在 Scheme / Racket 中 let 的 lambda 定义是什么? [复制]
【发布时间】:2015-08-09 14:46:49
【问题描述】:

今天我试图了解 let 在 Scheme / Racket 中的 lambda 演算上下文中是如何工作的,但我不知道如何将 let 的等价物编写为 lambda 函数。

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

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

但这绝对不是一个完整的函数定义。

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

提前谢谢你!

【问题讨论】:

    标签: lambda scheme racket let


    【解决方案1】:

    你的例子

    ((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。

    【讨论】:

      【解决方案2】:

      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 ...))))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-18
        • 2013-09-22
        • 2021-12-09
        • 1970-01-01
        • 2018-11-10
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        相关资源
        最近更新 更多