任务不适合动态范围

kon*_*onr 6 lisp scheme scope elisp

你能给我一些不适合动态范围lisps的任务的例子吗?我没有看到词汇范围如何更好,而不仅仅是改变编码风格,所以我喜欢编写一些东西并亲眼看到它.

谢谢!

Eli*_*lay 7

(define (add n) (lambda (m) (+ n m)))
(define add4 (add 4))
(map (add 7) (list 1 2 3))
Run Code Online (Sandbox Code Playgroud)

但这只是一个小小的随机例子.如果你挖得足够远,你会发现其他几个原因.要进行更彻底的讨论,你应该仔细阅读一些教科书.我对此的建议是PLAI.

这是另一个演示:

(define tax 0.17)
(define (add-tax amt) (+ amt (* amt tax)))
Run Code Online (Sandbox Code Playgroud)

它看起来像是add-tax一个函数,它返回给定的金额并添加了正确的税率 - 但你永远不能依赖于这种情况.例如,它可以像这样调用:

(let ((tax -0.17)) (add-tax 100))
Run Code Online (Sandbox Code Playgroud)

你会得到完全错误的答案.但是,如果您的语言是真正动态范围的,那么情况会更糟:您不能依赖任何绑定,包括函数.考虑一下:

(let ((+ -)) (add-tax 100))
Run Code Online (Sandbox Code Playgroud)

BTW Elisp和CL不会直接遭受这个问题,使用像双重命名空间这样的东西,以及关于阴影"内置"绑定的规则.