你能给我一些不适合动态范围lisps的任务示例吗?我没有看到词汇范围如何更好,而不仅仅是改变编码风格,所以我喜欢用自己的眼睛编写代码并进行编码。
谢谢!
答案 0 :(得分:7)
(define (add n) (lambda (m) (+ n m)))
(define add4 (add 4))
(map (add 7) (list 1 2 3))
但这只是一个小小的随机例子。如果你挖得足够远,你会发现其他几个原因。要进行更彻底的讨论,你应该仔细阅读一些教科书。我对此的建议是PLAI。
这是另一个演示:
(define tax 0.17)
(define (add-tax amt) (+ amt (* amt tax)))
看起来add-tax
是一个函数,它返回给定金额并添加了正确的税率 - 但是你永远不能依赖于这种情况。例如,它可以像这样调用:
(let ((tax -0.17)) (add-tax 100))
你会得到完全错误的答案。但是,如果您的语言是真正动态范围的,情况会更糟:您不能依赖任何绑定,包括函数。考虑一下:
(let ((+ -)) (add-tax 100))
BTW Elisp和CL不会直接遇到这个问题,使用双命名空间之类的东西,以及关于阴影“内置”绑定的规则。
答案 1 :(得分:0)