我刚刚开始使用Clojure(来自Ruby),我想用命令行界面构建一个小应用程序.如何处理CL的输入/输出?
我注意到有一个clojure.contrib.command-line,但文档很小.
我找不到有关如何解析xml文档和访问元素的任何信息.
我找到了两种解析xml文档的方法
(clojure.zip/xml-zip (clojure.xml/parse file))
Run Code Online (Sandbox Code Playgroud)
和
(parse-seq file)
Run Code Online (Sandbox Code Playgroud)
但我似乎可以找到有关如何处理结果结构的任何信息?
源文件是指如何查询结果的zip-query.clj,但似乎也没有.
我正在寻找使用字符串作为我的来源创建一个字符列表.我做了一些谷歌搜索并没有提出任何事情,所以我写了一个功能,做了我想要的:
(defn list-from-string [char-string]
(loop [source char-string result ()]
(def result-char (string/take 1 source))
(cond
(empty? source) result
:else (recur (string/drop 1 source) (conj result result-char)))))
Run Code Online (Sandbox Code Playgroud)
但看着这个让我觉得我必须错过一招.
看起来每个人都涵盖了基本情况,例如选择某些列并通过谓词过滤得很好,但我想知道每种情况如何比较更高级的情况.是否更容易在一个方面表达复杂的查询?一个库是否缺少对方涵盖的任何功能?
我的project.clj之一:依赖关系取决于整体的clojure-contrib-1.1.0.jar,但我无法猜出哪一个正在下载它.如果没有逐步评论每一个,我怎么能发现它们中的哪一个负责?
说我有以下代码:
(defn ^{:graph-title "Function 1"} func-1
[x]
(do-something-with x))
(defn get-graph-title
[func]
(str
((meta func) :graph-title)))
我希望这会返回"功能1",但它返回nil.我认为这源于以下差异,我不完全理解:
(meta func-1)
=> {:ns some-ns-info, :name func-1}
(meta #'func-1)
=> {:ns some-ns-info, :name func-1, :graph-title "Function 1"}
谁可以给我解释一下这个?
我是Clojure和Leiningen的新手,我已经确定我想要使用的一些内容位于clojure.contrib.generic.math-functions中.我在http://richhickey.github.com/clojure-contrib/branch-1.1.x/math-api.html找到了API的信息,但我找不到任何可以帮助我弄清楚应该放入什么的东西我的project.clj文件用于该依赖项.
我曾尝试[clojure.contrib.generic.math-functions "1.1"],[clojure.contrib.generic.math-functions "1.1.x"]和[clojure.contrib.generic.math-functions "1.1.0"].对于每一个,我得到像......
...
Caused by: org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException: Missing:
----------
1) clojure.contrib.generic.math-functions:clojure.contrib.generic.math-functions:jar:1.1
Run Code Online (Sandbox Code Playgroud) 我一直在为Clojure程序员阅读monad的优秀介绍.文章说明Identity monad在功能上等同于Clojure的let,而Sequence/List monad等同于.
当文章到达monad变换器时,它显示了一个组合Maybe和Sequence monad的示例.好了,一个原因是使用序列单子,而不是针对的是我可以改变它.但是,转换一个Identity monad对我来说没有意义 - 这不总是等同于构建变换monad的任何东西吗?例如,如果我使用Identity转换了Maybe - 那不就是给我一个Maybe,这本来更容易直接声明吗?
有人可以清楚在Clojure中是否有实际用途来选择一个版本monad而不是let(也许我不是一直在考虑变换器的含义?),还是它只是为了理论上的完整性?
无论如何从Java调用Clojure宏?
这是我想要做的:
RT.var("clojure.core", "require").invoke(Symbol.create("clojure.contrib.prxml"));
Var prxml = RT.var("clojure.contrib.prxml", "prxml");
Var withOutStr = RT.var("clojure.core", "with-out-str");
String stringXML = (String) withOutStr.invoke((prxml.invoke("[:Name \"Bob\"]")));
Run Code Online (Sandbox Code Playgroud)
prxml默认写入*out*,这就是为什么我需要用带有-out-str的宏包装它来返回字符串.
我收到此错误:
[java] java.lang.IllegalArgumentException: Wrong number of args (1) passed to: core$with-out-str
[java] at clojure.lang.AFn.throwArity(AFn.java:437)
[java] at clojure.lang.RestFn.invoke(RestFn.java:412)
[java] at clojure.lang.Var.invoke(Var.java:365)
[java] at JavaClojure.xml.main(Unknown Source)
Run Code Online (Sandbox Code Playgroud) 我很困惑如何习惯性地更改通过clojure.contrib的zip-filter.xml访问的xml树.应该尝试这样做,还是有更好的方法?
假设我有一些虚拟xml文件"itemdb.xml",如下所示:
<itemlist>
<item id="1">
<name>John</name>
<desc>Works near here.</desc>
</item>
<item id="2">
<name>Sally</name>
<desc>Owner of pet store.</desc>
</item>
</itemlist>
Run Code Online (Sandbox Code Playgroud)
我有一些代码:
(require '[clojure.zip :as zip]
'[clojure.contrib.duck-streams :as ds]
'[clojure.contrib.lazy-xml :as lxml]
'[clojure.contrib.zip-filter.xml :as zf])
(def db (ref (zip/xml-zip (lxml/parse-trim (java.io.File. "itemdb.xml")))))
;; Test that we can traverse and parse.
(doall (map #(print (format "%10s: %s\n"
(apply str (zf/xml-> % :name zf/text))
(apply str (zf/xml-> % :desc zf/text))))
(zf/xml-> @db :item)))
;; I assume something like this is needed to make the …Run Code Online (Sandbox Code Playgroud)