2024 Clojure状态调查! 分享您的想法。

欢迎!请参阅 关于 页面,了解有关该页面如何工作的更多信息。

0
Refs, agents, atoms

我了解一些小的Lisp,但Clojure感觉有些不同

(defn mojorate []
  (let [v (vec (range 1 11))
        max (- (count v) 1)
        atomix (atom [])
        chanl (async/chan)]
    (println v)
    (loop [i 0]
      (async/go
        (>! chanl (swap! atomix conj (/ (get v i) 2))))
      (if (= i max)
        (do (<!! (async/go (<! chanl)))
          (async/close! chanl)
          @atomix)
        (recur (inc i))))))

这只是使用通道、atom loop/recur等的一个练习。

你可以这样做吗?

我不太确定你真正在问什么 - 你可以详细说明吗?
它按预期工作,但我不确定它是否是1.惯用2.最佳实践3.或可以做得更好。
“预期”是什么意思?该功能 *应该* 做什么?运行时,我在不同的运行中看到不同的结果,所以我不能完全推断出你需要什么。
by
我总是得到
testomato.core> (mojorate)
[1 2 3 4 5 6 7 8 9 10]                                                                      
[1/2 1 3/2 2 5/2 3 7/2 9/2 5]

这段代码将10个数字发送到通道并返回它们 - 除以二。

1 答案

+1
by

你有很多
`go`块,不仅是指代码中的数量,也包括执行的数量。循环中的第一个
`go`块并没有阻塞 - 它立即允许执行继续。在相同块再次执行之前,无法保证前面的块已经将值放入通道。这是一个竞争条件。

为了确认,只需运行以下代码:`(set (repeatedly 10000 mojorate))`。如果得到的结果是只有一个元素集,请增加数字。

这段代码将10个数字发送到通道并返回它们 - 除以二。

句子的前半部分是对函数用户的实现细节,不是重点。如果你只需要从1开始,除以2得到10个数字的向量,那么当然是`(mapv #(/ % 2) (range 1 11))`。

如果你需要其他内容,请详细描述,这样我们才不会陷入XY问题。原始函数可以有许多不同的重写方法 - 如果你的真实需求明确,这些重写方法都不一定正确。

by
我试图熟悉这个概念。并且我意识到mapv是一个更紧凑的解决方案。简单的算术在演示此类事物中并不少见。一个Common Lisp的例子

(let ((channel (make-channel)))
  (submit-task channel '+ 3 4)
  (receive-result channel))

但是,我可以确认你所预测的:通过100,000次重复,我得到

#{[1/2 1 3/2 2 5/2 3 7/2 4 9/2 5]
  [1, 3/2, 2, 5/2, 3, 7/2, 4, 9/2, 5, 1/2]
  [1/2, 1, 3/2, 2, 5/2, 3, 7/2, 4, 9/2]
  [1/2, 1, 2, 5/2, 3, 7/2, 4, 9/2, 5, 3/2]}
by
据我所知,Common Lisp中的channels与`clojure.core.async`中的channels不同。它们更像是与特定线程进行通信的一种方式。在Clojure中,如果您只想在单独的线程中运行一系列计算,最好使用`future`或`pmap`(尽管通常建议避免使用`pmap`,而是使用可控制的工具)。Clojure中的异步channel在您想在某个位置输入值,可能在第二个位置在其上方进行一些计算,并在第三个位置接收结果时很有用,这些位置可能根本不知道彼此。例如,生产者可能使用`(a/to-chan! (range 1 11))`,转换者可能使用`(a/map #(/ % 2) [channel])`,消费者可能使用`(a/go (let [all-values (a/<! (a/into [] transformed-channel))] ...))`。
by
当然,Clojure中的channel不仅仅如此。它们支持使用不同策略进行缓冲,允许进行背压,让您可以静态或动态地组合和分离通道。
by
刷新 by
谢谢。我现在开始清楚地看到这一点。而且我真心没看到竞争条件。
...