任务不适合动态范围

时间:2010-08-26 18:18:36

标签: lisp scope scheme elisp

你能给我一些不适合动态范围lisps的任务示例吗?我没有看到词汇范围如何更好,而不仅仅是改变编码风格,所以我喜欢用自己的眼睛编写代码并进行编码。

谢谢!

2 个答案:

答案 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)

值得阅读关于scope的维基百科文章。

从功能上讲,只有当您拥有未绑定在当前范围内的变量时才会起作用。所以,如果你没有任何自由变量,那就无所谓了。

Eliz Barzilay的answer是lambda的一个很好的例子,其函数具有符号(n),在动态/静态范围内具有不同的绑定。

据我所知,具有词法作用域的语言可以编译得更多一些,因为在编译时编译器可以确定所有的变量引用,而动态作用域必须在运行时查找变量引用。