我正在寻找一种在Clojure和erlang之间来回传递事件的方法.
我有一个在 GPLv3 下发布的项目,它需要 clojure.jar 和 clojure-tontrib.jar 才能运行。我真的很想和所有这些一起发送一个大 jar 文件。(也许还有 license.txt)
*我不是在寻求法律建议,也不会这样解释任何回应。
Om,反应的clojurescript包装,据说非常快,因为它利用了不变性.我无法理解持久性数据结构如何在这里提供帮助.
我所理解的是应用状态是一个原子.此状态传递给返回虚拟DOM节点的函数(om组件),因此创建当前虚拟DOM与其先前状态之间差异的"补丁"比直接在实际DOM上操作要好得多.
但是持久数据结构可以在这里提供帮助吗
(def app-state (atom {:foo {:counter 0}))
(om/root click-counter app-state {:target ...})
Run Code Online (Sandbox Code Playgroud)
例如,click-counter
渲染一个按钮,单击该按钮会增加计数器.所以过渡函数看起来像这样:
(dom/button #js {:onClick #(om/transact! app [:foo :counter] inc)}
(str "clicked " (-> app :foo :counter) " times"))
Run Code Online (Sandbox Code Playgroud)
我没有理解这一点:onClick
执行时clojurescript创建一个新的地图(非常有效),如下所示:
{:foo {:counter 1}}
Run Code Online (Sandbox Code Playgroud)
而app-state
现在指向新的地图.此时Om意识到状态已经改变,因为它只是一个等式检查的问题.
这里的问题是Om应该仍然计算整个旧虚拟DOM和新虚拟DOM之间的差异.它不知道只是计数器被改变了.
我的错误在哪里?
我已经编写了以下代码来计算两个正数的最大公约数.在代码中是否存在一些不是最优或足够的问题,如果是这样的话,那么做GCD的更多cloujerian方式是什么?
(def gcd (fn [a b] (->> (map (fn [x]
(filter #(zero? (mod x %)) (range 1 (inc x))))
[a b])
(map set)
(apply clojure.set/intersection)
(apply max))))
(gcd 1023 858)` => 33
Run Code Online (Sandbox Code Playgroud) 周四在Bay Area Clojure Meetup上的一个演示文稿中,我正在编写一个在Clojure中泄漏内存的方法列表.
到目前为止,我有:
还有什么?
我正在使用桌面应用程序,并且很乐意使用碰巧可用的任何硬件随机数生成器,但我不希望用户必须使用任何令人困惑的设置来使用它.它的Java/Clojure基于Java世界的东西会很好,虽然我愿意和任何事情一起工作.知道任何做得好的程序吗?他们跨平台吗?
我需要的只是Erlang中的一个大型持久查找表,而dets似乎就是这样的东西,虽然我需要一个明确的答案:
我有一个bug的函数:
user> (-> 42 int-to-bytes bytes-to-int)
42
user> (-> 128 int-to-bytes bytes-to-int)
-128
user>
Run Code Online (Sandbox Code Playgroud)
看起来我需要在转换回来时处理溢出...
最好写一个测试,以确保再也不会发生这种情况.这个项目使用的是clojure.contrib.test-是这样我写的:
(deftest int-to-bytes-to-int
(let [lots-of-big-numbers (big-test-numbers)]
(map #(is (= (-> %
int-to-bytes
bytes-to-int)
%))
lots-of-big-numbers)))
Run Code Online (Sandbox Code Playgroud)
这应该是测试转换为seq的字节然后再次在10000个随机数的列表上产生原始结果.理论上看起来不错?除了没有任何测试运行.
Testing com.cryptovide.miscTest
Ran 23 tests containing 34 assertions.
0 failures, 0 errors.
Run Code Online (Sandbox Code Playgroud)
当我尝试在Clojure中向无限延迟序列添加元数据时,我得到了堆栈溢出,如果我取消元数据,那么它可以正常工作.为什么添加with-meta
宏打破了懒惰的seq?
首先创建一个非常好的数字的无限序列:
(defn good [] (lazy-seq (cons 42 (good)))) user> (take 5 (good)) (42 42 42 42 42)
然后,为每个lazy-seq实例添加一些元数据:
(defn bad [] (lazy-seq (cons 42 (with-meta (bad) {:padding 4})))) user> (take 5 (bad)) java.lang.StackOverflowError (NO_SOURCE_FILE:0) [Thrown class clojure.lang.Compiler$CompilerException]
尝试将元数据上移一级:
(defn also-bad [] (with-meta (lazy-seq (cons 42 (also-bad))) {:padding 4})) user> (take 5 (foo)) java.lang.StackOverflowError (NO_SOURCE_FILE:0) [Thrown class clojure.lang.Compiler$CompilerException]
以下是有限序列的元数据示例:
(defn also-works [] (lazy-seq (cons 4 (with-meta () {:a 5})))) user> (also-works) (4) user> (meta (rest (also-works))) {:a 5} …
clojure ×9
erlang ×2
cryptography ×1
dets ×1
epl ×1
gpl ×1
ipc ×1
jar ×1
java ×1
licensing ×1
lisp ×1
memory-leaks ×1
om ×1
random ×1
unit-testing ×1