【问题标题】:How can I mimic "load-file" behavior with use ?如何使用 use 模拟“加载文件”行为?
【发布时间】:2011-10-21 16:51:42
【问题描述】:

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

use 与 load 有何不同?

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

但是,如果我“使用”x(通过引用 x 的命名空间),则在 x 中导入的那些类在 repl 中不可用。

有没有一种方法可以用来模仿 load-file 将文件导入到我的 repl 中的方式?

【问题讨论】:

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


    【解决方案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))
    

    当你调用它时,阅读器会从你调用它的命名空间中运行usees(例如,它将use它们进入repl的当前ns

    【讨论】:

    • 不正确。 use 是在 require 和(我认为)intern 等基元之上实现的普通旧函数。
    【解决方案2】:

    use 将所有公共变量导入当前命名空间。这不是你想要的吗?

    例子:

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

    【讨论】:

    • 你是对的,我澄清了这个问题。我的意思是,我希望将我的 x.clj 文件的导入加载到我的 repl 中。我有一个“x.clj”文件,它正在导入很多类,我希望在一次调用 (use 'x) 后,这些类方法可以从 repl 中调用。
    【解决方案3】:

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

    【讨论】:

    • 嗯好的。看起来这删除了标准的 repl 导入。有没有办法保留这些?例如,(源)宏将不再工作......
    猜你喜欢
    • 2021-02-19
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多