有没有办法从另一个命名空间重新导出某些命名空间的变量?我希望能够做到这一点:
(ns mine.core
(:use [incanter core charts datasets io]))
; re-export Incanter somehow
然后在REPL中我只能use
- mine.core
使用Incanter的功能。
user=> (use 'mine.core)
nil
user=> (view (histogram (sample-normal 1000)))
谢谢!
答案 0 :(得分:2)
我曾经通过将常用的REPLd use
表达式放在一个单独的文件中来完成此操作,当我启动REPL时,我可以load-file
。这工作得相当好,因为我可以将所有内容放在那里,然后获得的不仅仅是一个命名空间。
后来我切换到定义'everything'命名空间并使用leiningend :main
指令like in this SO question开始我的repl,这就像我的第一个方法,但似乎更优雅。
我的方式继续改变,我现在总是切换到包含代码的命名空间。这很好用,因为在较大的项目中它有助于跟踪代码在哪里,我认为这种做法可以帮助我更快地学习代码的布局。当然每个人的经历都是不同的和个人的,YMMV :)
答案 1 :(得分:1)
答案 2 :(得分:0)
我建议考虑明确导入所有必要的依赖项,如其他答案所示。这通常会导致代码不那么复杂。
但是如果你想要这个,例如要提供一致的界面,那么您可以使用clojure.core/intern
函数执行此操作,该函数可以生成任何符号" native"给定命名空间。例如:
(ns user)
(intern 'user 'map clojure.core/map)
(ns new-ns)
(require 'user)
(user/map inc [1 2 3])
; => [2 3 4]
(use 'user)
; => WARNING: map already refers to: #'clojure.core/map in namespace: new-ns,
; being replaced by: #'user/map
(map inc [1 2 3])
; => [2 3 4]
请注意,在您重新实习符号之前,符号的原始命名空间中的更改不会反映出来。