在clojurescript中返回一个唯一的通道

Geo*_*rge 1 clojure clojurescript

目标:构造一个ClojureScript函数,该函数接受一个字符串s并返回带有名称的唯一通道(str s "-chan")(如果该通道不存在,则创建它).这是我的尝试:

(defn string-channel 
  [s]
  (let [chan-name (symbol (str s "-chan"))]
    (defonce chan-name (chan))
    chan-name))
Run Code Online (Sandbox Code Playgroud)

这会产生错误.我如何实现这一目标?请注意,由于我在ClojureScript中,eval如果解决方案涉及宏,我无法使用该构造.

lee*_*ski 5

我宁愿建议将这些通道保存在原子中(因为在这里动态定义变量似乎真的不必要).另外,在一个地方保留频道对我来说更容易管理.

(def channels (atom {}))

(defn string-channel [s]
  (when-not (@channels s)
    (swap! channels assoc s (chan)))
  (@channels s))
Run Code Online (Sandbox Code Playgroud)