【发布时间】:2017-11-01 00:31:04
【问题描述】:
在 Clojure REPL 中:
user> (defn add [x y] (def foo :defined-inside) (+ x y))
#'user/add
user> foo
#object[clojure.lang.Var$Unbound 0x63a0ad69 "Unbound: #'user/foo"]
user> (add 1 1)
2
user> foo
:defined-inside
显然,我认为 foo 不应该在 add 之外访问,为什么 Clojure 允许这样做,这与其他 lisp(例如方案)不同?
【问题讨论】:
-
其他 lisp... CL
defparameter,defun,defvar创建顶级绑定。 Scheme 是唯一具有这种奇怪功能的方案,即lambda内的define由lambda宏处理(并重写为letrec最终变成lambda形式),而顶级define是由自己的宏处理。 -
@Sylwester 对我来说,我认为这是一个坏主意,它会污染全球环境,而 Scheme 是正确的选择。
-
如果你想要一个局部变量或函数,你永远不会有礼貌,因为你不使用
def,与 Common Lisp 相同。这与在具有 较少混淆 的 Scheme 中相同(因为您可能有这样的印象,define与let中的顶层相同,但它是由两个完全不同的部分完成的除了名称冲突之外彼此无关的实现)