我正在学习一些clojure。我意外地覆盖了clojure中的核心方法:seq。我运行的代码行是:
(def seq "WATCH OUT!")
然后我在控制台发出警告:
WARNING: seq already refers to: #'clojure.core/seq in namespace: user, being replaced by: #'user/seq
现在seq
的值为WATCH OUT!
。
如何撤消此操作?这不是一个危险的力量吗?理论上这不可能以这种方式打破一个程序吗?
答案 0 :(得分:3)
您很可能在自己的命名空间中定义了seq
符号,使得seq
无法访问,而没有明确指定命名空间来查找它。
要检查是否是这种情况,请在“吹seq
向上”后尝试此操作:
(clojure.core/seq [1 2 3])
如果可行(输出(1 2 3)
),则解决方案将从clojure.core
再次refer
,默认情况下完成:
(refer 'clojure.core :only ['seq])
或者,a shorthand用于此特定命名空间:
(refer-clojure :only ['seq])
答案 1 :(得分:1)
在命名空间中定义var之后只需refer
就行了,因为有一个编译器安全措施。
您可以取消映射var,使其能够再次refer
名称:
(ns-unmap *ns* 'seq)
(refer-clojure)