在clojurescript

时间:2016-03-16 13:38:21

标签: clojure clojurescript

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

(defn string-channel 
  [s]
  (let [chan-name (symbol (str s "-chan"))]
    (defonce chan-name (chan))
    chan-name))

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

3 个答案:

答案 0 :(得分:5)

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

(def channels (atom {}))

(defn string-channel [s]
  (when-not (@channels s)
    (swap! channels assoc s (chan)))
  (@channels s))

答案 1 :(得分:0)

事实证明,正确的方法是使用defmacro

(defmacro string-channel 
  [s]
   `(do
    (defonce ~(symbol (str s "-chan")) (chan))
   ~(symbol (str s "-chan"))))

答案 2 :(得分:0)

如果目的是确保每个标签 s 的唯一渠道,请考虑使用memoize

(def unique-channel (memoize (fn [s] (chan))))