首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >in返回为零,而dosync不允许重复

in返回为零,而dosync不允许重复
EN

Stack Overflow用户
提问于 2016-10-05 16:10:34
回答 1查看 133关注 0票数 0

编辑:

dosync自己创建了一个函数,因此对recur的调用被解释为对生成的函数dosync的调用。

这是我实际创建的函数的足迹。尽量简单点,我想。

代码语言:javascript
复制
(defn change-to-ref [ref data]
  (dosync
    (if-let [[new-ref new-data] (some-test @ref data)]
      (recur new-ref new-data)
      (alter ref f data))))

例外情况:

代码语言:javascript
复制
CompilerException java.lang.IllegalArgumentException:
Mismatched argument count to recur, expected: 0 args, got: 2

原件:

我试图在参考文件中更新一个hashmap,如下所示

代码语言:javascript
复制
(def example-ref (ref {:some {:nested {:structure}}}))
(defn f [this] [this])  ;; just an example function

(sync (alter example-ref update-in [:some] f)

user=> nil

这很令人惊讶,因为它应该会回来

代码语言:javascript
复制
user=> {:some [{:nested {:structure}}]}

所以比我试过:

代码语言:javascript
复制
(update-in @example-ref [:some] f)

user=> {:some [{:nested {:structure}}]}

但我所读到的alter是这样称呼apply的:

代码语言:javascript
复制
(apply update-in @example-ref '([:some] f))

user=> {:some nil}

好吧,那么让我们用正确的方式:

代码语言:javascript
复制
(apply update-in @example-ref (list [:some] f))

user=> {:some [{:nested {:structure}}]}

很好,我弄明白了,但这并不能解释为什么alter出了问题,我甚至不能改变它.

代码语言:javascript
复制
(apply (fn [a b] (update-in a b f)) @example-ref '([:something]))

user=> {:some [{:nested {:structure}}]}

它看起来很糟糕,但至少它能工作,我可以为alter :D模拟它。

代码语言:javascript
复制
(sync (alter example-ref (fn [a b] (update-in a b f)) [:some])

user=> nil

好吧,你赢了。

我看了一眼:clojure.lang.Ref.alter源,但一点也不聪明。(除此之外,据我所知,alter实际上并没有调用apply)

我希望你们中的一些人能理解这一点,并对什么是正确的代码有一个答案。

EN

回答 1

Stack Overflow用户

发布于 2016-10-05 16:24:00

问题是sync的签名如下:

(同步标志-忽略了“现在”和“身体”)

忽略此宏的第一个参数。此外,文档还建议传递nil

事务标记=> TBD,暂时传递零。

因此,使用sync的正确方法是:

代码语言:javascript
复制
> (sync nil (alter example-ref update-in [:some] (partial conj [])))
{:some [{:nested {:structure :foo}}]}

我还建议使用dosync而不是sync (只是不要弄乱第一个参数;本质上是这些函数都是一样的):

代码语言:javascript
复制
> (dosync (alter example-ref update-in [:some] (partial conj [])))
{:some [{:nested {:structure :foo}}]}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39878987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档