在 Scheme / Racket 中 let 的 lambda 定义是啥? [复制]
Posted
技术标签:
【中文标题】在 Scheme / Racket 中 let 的 lambda 定义是啥? [复制]【英文标题】: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...)
但这绝对不是一个完整的函数定义。
对此有正确/完整定义的任何想法吗?
提前谢谢你!
【问题讨论】:
【参考方案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 ...))))
【讨论】:
以上是关于在 Scheme / Racket 中 let 的 lambda 定义是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 miniKanren 中的“disj”在 Scheme 中有效,而在 Racket 中无效?