当我处理clojure源代码时,我经常发现自己键入(ns user)
并反复按 C + c M + n 。问题是我经常使用source
和doc
之类的函数,它们位于clojure.repl
中,我不想:require
它们到我的命名空间。在这种情况下,经验丰富的clojurians在做什么?
澄清:我知道clojure的命名空间是如何工作的。我想要达到的目的是能够调用(source myfunc)
,(doc myfunc)
等,而无需在REPL 和中使用完全限定名称,而无需使用这些功能来自我的每个命名空间中的clojure.repl
。
答案 0 :(得分:3)
感谢您清理所要求的内容。
Leiningen有一个名为:injections 的功能,您可以combine with vinyasa获得此效果如果您在leiningen个人资料中添加了这样的内容:
〜/ LEIN / profiles.clj:
{:user {:plugins []
:dependencies [[im.chit/vinyasa "0.1.8"]]
:injections [(require 'vinyasa.inject)
(vinyasa.inject/inject
'clojure.core '>
'[[clojure.repl doc source]
[clojure.pprint pprint pp]])]}}
因为这是在你的profiles.clj中,它只会影响你。其他从事该项目的人不会受到影响。
<小时/> 因为注入clojure.core对我来说有点不确定,所以我遵循vinyasa作者的建议并注入一个名为的命名空间。这是我工作的每个项目的配置文件。此命名空间始终存在,这使得这些函数即使在尚未引用clojure.core的新创建的命名空间中也能正常工作。
我的〜/ .lein / profiles.clj:
{:user
{:plugins []
:dependencies [[spyscope "0.1.4"]
[org.clojure/tools.namespace "0.2.4"]
[io.aviso/pretty "0.1.8"]
[im.chit/vinyasa "0.4.7"]]
:injections
[(require 'spyscope.core)
(require '[vinyasa.inject :as inject])
(require 'io.aviso.repl)
(inject/in ;; the default injected namespace is `.`
;; note that `:refer, :all and :exclude can be used
[vinyasa.inject :refer [inject [in inject-in]]]
[clojure.pprint :refer [pprint]]
[clojure.java.shell :refer [sh]]
[clojure.repl :refer [doc source]]
[vinyasa.maven pull]
[vinyasa.reflection .> .? .* .% .%> .& .>ns .>var])]}}
的工作原理如下:
hello.core> (./doc first)
-------------------------
clojure.core/first
([coll])
Returns the first item in the collection. Calls seq on its
argument. If coll is nil, returns nil.
nil
hello.core> (in-ns 'new-namespace)
#namespace[new-namespace]
new-namespace> (./doc first)
nil
new-namespace> (clojure.core/refer-clojure)
nil
new-namespace> (./doc first)
-------------------------
clojure.core/first
([coll])
Returns the first item in the collection. Calls seq on its
argument. If coll is nil, returns nil.
nil
答案 1 :(得分:1)
要实现此目的,您可以使用vinyasa库,特别是其inject
功能。基本上,您需要将clojure.repl
命名空间中所需的函数添加到clojure.core
命名空间。在您不需要明确要求它们之后。请参阅以下内容:
user> (require '[vinyasa.inject :refer [inject]])
nil
;; injecting `source` and `doc` symbols to clojure.core
user> (inject '[clojure.core [clojure.repl source doc]])
[]
;; switching to some other namespace
user> (require 'my-project.core)
nil
user> (in-ns 'my-project.core)
#namespace[my-project.core]
;; now those functions are accessible w/o qualifier
my-project.core> (doc vector)
-------------------------
clojure.core/vector
([] [a] [a b] [a b c] [a b c d] [a b c d e] [a b c d e f] [a b c d e f & args])
Creates a new vector containing the args.
nil