Return clojurescript 中的一个独特频道
Return a unique channel in clojurescript
目标: 构造一个 ClojureScript 函数,该函数采用字符串 s
和 returns 名称为 (str s "-chan")
的唯一通道(如果通道不存在,然后创建它)。这是我的尝试:
(defn string-channel
[s]
(let [chan-name (symbol (str s "-chan"))]
(defonce chan-name (chan))
chan-name))
这会产生错误。我如何实现这个目标?请注意,由于我在 ClojureScript 中,如果解决方案涉及宏,我将无法使用 eval
构造。
事实证明正确的方法是使用 defmacro
:
(defmacro string-channel
[s]
`(do
(defonce ~(symbol (str s "-chan")) (chan))
~(symbol (str s "-chan"))))
我宁愿建议将这些通道保留在一个原子中(因为在这里动态定义变量似乎真的没有必要)。此外,在我看来,将频道放在一个地方更易于管理。
(def channels (atom {}))
(defn string-channel [s]
(when-not (@channels s)
(swap! channels assoc s (chan)))
(@channels s))
如果目的是确保每个标签的唯一渠道,请考虑使用 memoizes:
(def unique-channel (memoize (fn [s] (chan))))
目标: 构造一个 ClojureScript 函数,该函数采用字符串 s
和 returns 名称为 (str s "-chan")
的唯一通道(如果通道不存在,然后创建它)。这是我的尝试:
(defn string-channel
[s]
(let [chan-name (symbol (str s "-chan"))]
(defonce chan-name (chan))
chan-name))
这会产生错误。我如何实现这个目标?请注意,由于我在 ClojureScript 中,如果解决方案涉及宏,我将无法使用 eval
构造。
事实证明正确的方法是使用 defmacro
:
(defmacro string-channel
[s]
`(do
(defonce ~(symbol (str s "-chan")) (chan))
~(symbol (str s "-chan"))))
我宁愿建议将这些通道保留在一个原子中(因为在这里动态定义变量似乎真的没有必要)。此外,在我看来,将频道放在一个地方更易于管理。
(def channels (atom {}))
(defn string-channel [s]
(when-not (@channels s)
(swap! channels assoc s (chan)))
(@channels s))
如果目的是确保每个标签的唯一渠道,请考虑使用 memoizes:
(def unique-channel (memoize (fn [s] (chan))))