gpt4 book ai didi

architecture - clojure 中协议(protocol)/多方法的环境依赖调度

转载 作者:行者123 更新时间:2023-12-04 14:32:30 25 4
gpt4 key购买 nike

我在如何构建我的软件的特定部分时遇到了问题。
可以说,我有一个名为 make-temp-dir 的函数(和许多其他人)
一些黑魔法取决于当前的操作系统。我希望能够把
在单独的命名空间中为每个操作系统实现这些方法。

首先,我相信协议(protocol)(如果可能的话)或多方法是解决
这。但是,我从未见过将这些与实现一起使用的示例
跨越多个命名空间。而且我无法弄清楚这是如何工作的
出去。

其次,如果我为此使用协议(protocol),我将不得不调用这些方法

(make-temp-dir current-os arg-1 arg-2)

不知何故,一直将 os 作为第一个参数传递看起来不太好
对我来说。为了语义,我希望 make-temp-dir采取智能
取决于操作系统的决定。当然我可以使用一些宏并做类似的事情
(doto current-os
(make-temp-dir arg-1 arg2))

但这感觉不对。

这应该怎么做?还是我走错路了?任何帮助表示赞赏。

编辑 :好的,非常感谢@kotarak,我设法得到了一些工作。对于任何偶然发现此问题的人, https://gist.github.com/2477120 .它工作正常,我想我会去的。谢谢大家。

最佳答案

(ns your.utils)

(def current-os)

(defmulti make-temp-dir
(fn [& _] current-os))

(ns your.utils.mac)

(defmethod make-temp-dir :mac-os-x
[a b]
(...))

(ns your.utils.win)

(defmethod make-temp-dir :windows
[a b]
(...))

在您的启动代码中,您必须初始化 current-osalter-var-root在使用任何实用程序功能之前。
(let [os (find-os)]
(alter-var-root #'current-os (constantly os))
(require (case os
:mac-os-x 'your.utils.mac
:windows 'your.utils.win)))

希望这能让你开始。

关于architecture - clojure 中协议(protocol)/多方法的环境依赖调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10283730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com