基于命令行输入,我需要设置一些运行时常量,许多下游函数将使用这些常量.这些函数中的代码可以在其他线程中执行,因此我不考虑"声明var和使用绑定宏"组合.使用var(使用alter-var-root)与使用原子相比有什么优缺点?那是,
(declare *dry-run*) ; one of my constants
(defn -main [& args]
; fetch command line option
;(cli args ...)
(alter-var-root #'*dry-run* (constantly ...))
(do-stuff-in-thread-pool))
Run Code Online (Sandbox Code Playgroud)
与
(def *dry-run* (atom true))
(defn -main [& args]
; fetch command line option
;(cli args ...)
(reset! *dry-run* ...)
(do-stuff-in-thread-pool))
Run Code Online (Sandbox Code Playgroud)
如果除了这两个之外还有其他选择我应该考虑,很想知道.
另外,理想情况下我宁愿不向原子提供初始值因为我想在其他地方设置默认值(使用cli调用),但我可以忍受它,特别是如果使用原子提供了与替代品相比的优势( S).
问题:
如何在汇总映射之间的公共键值的同时合并映射。
输入:
[a: 10, b:2, c:3]
[b:3, c:2, d:5]
Run Code Online (Sandbox Code Playgroud)
输出
[a:10, b:5, c:5, d:5]
Run Code Online (Sandbox Code Playgroud)
扩展问题:
如何通过对 2 个映射中公共键的值应用函数(闭包)来合并原始 2 个映射。IE。让用户指定要使用的功能,而不是简单地总结公共键的值。
例如:如果用户想使用“min”函数而不是求和,则可以指定 min [a:10, b:2, c:2, d:5]
作为结果。
我编写了一个函数,试图以交互方式从用户那里获得ay/n(是/否)答案.它测试答案是否有效,如果没有,请再次征求用户的意见:
(defn get-valid-answer [question]
(println question)
(loop []
(let [ans (.trim (read-line))]
(if (#{"y" "n"} ans)
ans
(do (println "Please answer \"y\"[yes] or \"n\"[no] only!")
(recur) )))))
Run Code Online (Sandbox Code Playgroud)
带有loop-recur的上述版本完成了这项工作,但我有一种唠叨的感觉,必须有更好的(更多功能)方法来做到这一点.我宁愿只进行一次读取线调用.任何人都可以建议在这种情况下不使用loop-recur的替代版本,但可能使用一些(Clojure内置)宏而不是?
我的 java 应用程序将大量信息记录到磁盘上的日志文件中。一些记录的信息比其他信息更重要;除了在极少数情况下,需要不太重要的信息来向最终用户解释为什么生产中的代码做出了某个决定。
我想知道将不太重要的信息记录到套接字而不是磁盘上的文件是否是个好主意。套接字写入是否比磁盘写入快得多?
更新:基本上,我想登录到同一子网甚至同一台机器中的套接字,假设它比写入磁盘更快。另一个进程(不是我的应用程序的一部分)将在方便时从该套接字读取。我在想这将是从套接字中拉出的logstash。使用另一个线程异步记录到磁盘是另一种选择,但我想首先考虑套接字选项,如果这是一个具有最小性能影响的简单解决方案。
在Clojure REPL中,这个表达式
( #(for [x %] (+ 100 (second x))) ['(+ 38) '(+ 48)] )
Run Code Online (Sandbox Code Playgroud)
按预期产生(138 148)
但是这个
( #(for [x %] ((first x) 100 (second x))) ['(+ 38) '(+ 48)] )
Run Code Online (Sandbox Code Playgroud)
产生(38 48)这似乎真的很奇怪.
这两个表达式确实应该产生相同的结果!我错过了什么?将欣赏任何解决这个谜团的想法.
顺便说一下,我尝试使用'apply(first x)'并将其余的args打包成一个列表,但似乎并不重要.同样意外的结果又回来了.
另外,为了验证+确实从输入中解析,我将以下内容提供给REPL
( #(for [x %] (resolve (first x) )) '((+ 38) (+ 48)) )
Run Code Online (Sandbox Code Playgroud)
哪个产生了
(#'clojure.core/+ #'clojure.core/+) as expected.
Run Code Online (Sandbox Code Playgroud) 我需要从我的函数返回一个序列,一个数字和一个哈希映射(所有包装在一个向量中),以便打印的返回值如下所示:
[ ([:c :a] [:e :c] [:f :e] [:d :e] [:g :f] [:b :a]) 15
{:g :c, :f :a, :c :e, :d :a, :b :a, :c :a} ]
Run Code Online (Sandbox Code Playgroud)
由于我的输入可能很大,我想从我的函数返回延迟序列/对象.对的序列(我的返回向量中的第一个对象)很容易通过在构建它的conj调用周围包装'lazy-seq'来使其变得懒惰.
哈希映射(我的返回向量中的第三个对象,可能像我的序列一样非常大)正在与序列相同的循环 - 重复块中构建(使用assoc调用).哈希映射是我的一些调用者将使用的附加信息,但如果对序列被返回为惰性,那么我想知道是否有意义发回一个潜在的巨大哈希映射与(一个有效的)lazy-seq即使我把它作为一个可选的返回值.散列映射中的条目与惰性序列中的对相关.
所以这是我的noobie问题:在发送一个懒惰的MapEntry序列代替大型HashMap时有什么意义吗?也就是说,假设用户将获取一小部分laEq-Map的MapEntrys,将它们转换为hashmap以进行查找...即将获取下一个块,依此类推.这是一种懒惰地使用关联数据的合理方法吗?在Clojure中是否有一些惯用的方法来返回/管理大型关联数据?我很欣赏任何关于我的选择的想法.在此先感谢您的帮助.
我写了一个PointPair类,它有4个双精度表示2点的坐标值,其中第一个点,A =(a1,a2),第二个点,B =(b1,b2).我在我的类中实现了hashCode和equals方法,并且一直运行良好,直到我被告知它需要支持对称性,即用A构建的PointPair对象,B需要等于用B,A构建的PointPair.
class PointPair {
public final double a1, a2, b1, b2;
public PointPair(Point a, Point b) {
this.a1 = a.x; this.a2 = a.y;
this.b1 = b.x; this.b2 = b.y;
}
public int hashCode() {
return Objects.hash(a1, a2, b1, b2); // fix me!
}
private boolean bothEqual(double d1, d2) {
return Double.compare(d1,d2) == 0 ;
}
public boolean equals(Object obj) {
if ((obj == null) || !(obj instanceof PointPair))
return false;
PointPair pObj = (PointPair) obj;
//test for same …
Run Code Online (Sandbox Code Playgroud)