(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不会直接遭受这个问题,使用像双重命名空间这样的东西,以及关于阴影"内置"绑定的规则.