gpt4 book ai didi

syntax - Unusual Scheme `let`绑定(bind),什么是 `f`?

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:07 25 4
gpt4 key购买 nike

“Scheme 编程语言第 4 版” 第 3.3 节 Continuations给出了以下示例:

(define product
(lambda (ls)
(call/cc
(lambda (break)
(let f ([ls ls])
(cond
[(null? ls) 1]
[(= (car ls) 0) (break 0)]
[else (* (car ls) (f (cdr ls)))]))))))

我可以确认它在 chezscheme 中如所写的那样有效:

> (product '(1 2 3 4 5))
120

上面let中的'f'是什么?为什么给定的 ls 被分配给自己?它似乎与我对 (let ...) 的理解不符,如 4.4 local binding 中所述:

syntax: (let ((var expr) ...) body1 body2 ...)

如果这里定义了'f',我希望它在圆括号/方括号内:

(let ([f some-value]) ...)

最佳答案

这就是“named let”,这是一种语法上的便利。

(let f ([x y] ...)
...
(f ...)
...)

或多或少等同于

(letrec ([f (λ (x ...)
...
(f ...)
...)])
(f y ...))

或者,在合适的上下文中,本地定义然后调用:

(define (outer ...)
(let inner ([x y] ...)
...
(inner ...)
...))

或多或少等同于

(define (outer ...)
(define (inner x ...)
...
(inner ...)
...)
(inner y ...))

named let 的好处在于它将本地函数的定义和初始调用放在同一个地方。

像我这样使用 CL 的穴居人有时会使用下面的 binding 之类的宏来实现这一点(注意这不是生产代码:它的所有错误消息都是晦涩的笑话):

(defmacro binding (name/bindings &body bindings/decls/forms)
;; let / named let
(typecase name/bindings
(list
`(let ,name/bindings ,@bindings/decls/forms))
(symbol
(unless (not (null bindings/decls/forms))
(error "a syntax"))
(destructuring-bind (bindings . decls/forms) bindings/decls/forms
(unless (listp bindings)
(error "another syntax"))
(unless (listp decls/forms)
(error "yet another syntax"))
(multiple-value-bind (args inits)
(loop for binding in bindings
do (unless (and (listp binding)
(= (length binding) 2)
(symbolp (first binding)))
(error "a more subtle syntax"))
collect (first binding) into args
collect (second binding) into inits
finally (return (values args inits)))
`(labels ((,name/bindings ,args
,@decls/forms))
(,name/bindings ,@inits)))))
(t
(error "yet a different syntax"))))

关于syntax - Unusual Scheme `let`绑定(bind),什么是 `f`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58460770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com