如何使用模仿“加载文件”行为?

时间:2011-10-21 16:51:42

标签: namespaces clojure read-eval-print-loop

大家好:我想查看我的命名空间中的所有函数,来自repl(用于快速黑客攻击和测试)。

使用与加载有何不同?

我注意到如果我"加载文件" x,所有导入现在都在我的命名空间中(即使是文件外部的那些)。

但是,如果我"使用" x(通过引用x' s名称空间),在x中导入的那些类在repl处可用

有没有办法可以模仿load-file包含文件导入我的repl的方式?

3 个答案:

答案 0 :(得分:1)

使用将所有公共变量导入当前名称空间。那不是你想要的吗?

示例:

user> (use 'clojure.pprint)
nil
user> (pprint [:foo])
[:foo]
nil

答案 1 :(得分:1)

好吧,不要这样做:P。如果你想要在一个特定的命名空间中,那么为什么不直接进入那个命名空间,而不是假装某种疯狂的use将所有内容导入user ns。 (require 'myns) (in-ns 'myns)可以做到这一点,或者是一个方便的快捷方式(doto 'myns require in-ns)

答案 2 :(得分:1)

use这样的特殊形式很特别。你不能将“使用”命名空间的函数编写到调用者ns中。但是一个简单的宏可以拯救你!

在我让leiningen正确加载我的repl之前,我在一个项目中做到了这一点

(defmacro load-all []
  '(use 
   :reload-all
   'com.cryptovide.modmath
   'com.cryptovide.combine
   'com.cryptovide.split
   'com.cryptovide.encrypt
   'com.cryptovide.misc
   'com.cryptovide.decrypt
   'com.cryptovide.modmathTest
   'com.cryptovide.combineTest
   'com.cryptovide.splitTest
   'com.cryptovide.encryptTest
   'com.cryptovide.miscTest
   'com.cryptovide.decryptTest
   'com.cryptovide.testlib
   'com.cryptovide.gui
   'com.cryptovide.checksum
   'com.cryptovide.log))

当你调用它时,阅读器会从你调用它的命名空间中运行use es(例如它将use它们放入repl的当前 ns < / p>