Scheme语言中reverse定义里的特殊let形式是什么?
Scheme中
let rev (...)写法的解释 你看到的(let rev ([ls ls] [new '()]) ...)是Scheme里的**命名let(Named Let)**语法,专门用来快速定义局部递归函数,是letrec的语法糖。
- 这里的
rev是这个局部递归函数的名字,后面的([ls ls] [new '()])是函数的参数与初始绑定:第一个ls是参数名,第二个ls是传入的初始实参;new是第二个参数,初始值为空列表'()。 - 这种写法等价于先通过
letrec定义递归函数再调用,比如下面的代码和你看到的命名let完全等效:
(define reverse (lambda (ls) (letrec ([rev (lambda (ls new) (if (null? ls) new (rev (cdr ls) (cons (car ls) new))))]) (rev ls '()))))
- 命名let的优势在于简化代码:不用单独写
lambda和letrec,直接在let后加函数名,就能创建一个可自身递归的局部函数,实现reverse这类递归操作时非常简洁直观。
内容的提问来源于stack exchange,提问作者durandaltheta
相关产品推荐
相关产品推荐

