gpt4 book ai didi

Clojure - 如何让库用户选择使用哪种打印功能,以显示数据结构?

转载 作者:行者123 更新时间:2023-12-04 17:00:18 27 4
gpt4 key购买 nike

我正在编写一个小型调试库,我想让用户选择如何显示数据结构。我在想象用户可能会以这种方式要求它:

(ns some-user-namespace
(:require
[clojure.pprint]
[my.library :with-args {print-fn clojure.pprint/pprint}]))

这样的事情有可能吗,如果没有,我该如何解决这个问题?

最佳答案

这样做是不可能的。如果你真的要提供这种设置,你可以提供一个配置函数,在导入后由用户调用:

(ns some-namespace
(:require [my.library]))

(my.library/print-with! clojure.pprint/pprint)

! 结束函数名是一种惯用的方式,表明它会引起一些副作用。

在您的图书馆中,它可能看起来像:
(ns my.library)

(def config (atom {:printer println}))

(defn print-with! [new-printer]
(swap! config assoc :printer new-printer))

(defn my-lib-print [foo]
((:printer @config) foo))

编辑 :对于不需要全局可变状态的解决方案,您可以使用动态绑定(bind)。

图书馆:
(ns my.library)

(def ^:dynamic *printer* println)

(defn my-lib-print [foo]
(*printer* foo))

用法:
(binding [my.library/*printer* clojure.pprint/pprint]
(my.library/my-lib-print {:hello "World"}))

这是我能想到的某种外部上下文配置的唯一两种方法。唯一的选择是纯高阶函数:
(defn my-lib-print [printer foo]
(printer foo))

关于Clojure - 如何让库用户选择使用哪种打印功能,以显示数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24951894/

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