Clojure/LISP REST 客户端设计

标签 clojure lisp

来自 OOP 背景,我对 Clojure 中推荐的 API 设计方式有疑问。例如在 OOP 语言(此处为 Python)中,为了使用一些 API,我会这样做:

api = someWebService()
api.setWriteApiKey(WRITE_API_KEY)
api.sampleloadSong('file.mp3')

在上面的示例中,我设置了一次 API key 并一次又一次地调用关联的方法,而没有再次传递 API key 。在 Clojure 或任何其他 LISP 语言家族中,推荐的做法是什么?

我是否需要像这样在每个函数调用中传递 key :

(sampleloadSong "WRITE_API_KEY" "file.mp3")

或者有没有其他更好的方法。

最佳答案

为了防止您描述的重复问题,您可以创建一个函数,该函数返回一个记住键的 api 函数,(关闭它们)

(defn make-client [key] (partial api key))

然后在你的程序中:

(let [api-fn (make-client WRITE_API_KEY)]
  (api-fn :sample-song "song.mp3")
  ...
  (api-fn  :delete-song "other-song.mp3"))

虽然很多人认为最好将配置映射作为第一个参数传递给每个 api 调用。

 (api {:key WRITE_API_KEY} ....)

还有另一种常见的方法,人们将键定义为可动态绑定(bind)的符号,并要求调用者适本地绑定(bind)它:

(def *api-key* :unset)

(defn api .... use *api-key* )

来自调用者的命名空间:

(binding [*api-key* WRITE_API_KEY]
   (api :add-song "foo.mp3"))

这种方法可能不像以前那样流行,我个人更喜欢传递配置映射,尽管这只是我的意见。

关于Clojure/LISP REST 客户端设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17354198/

相关文章:

clojure - ClojureScript的设计与实现

clojure - 获取当前元素和包含 Clojure 中其他所有内容的列表?

variables - 如何访问列表中变量的值?

clojure - Leiningen uberjar "empty"运行时间

clojure - 如何从 Clojure 的集合中随机获取 n 个项目?

spring-boot - 关于将Clojure集成到springboot框架中

lisp - Racket Lisp : comparison between new-if and if

scheme - 为什么 Lisp 文件不是语句列表?

xml - 我如何使用 cxml-stp 的 find-recursively 和 find-recursively-if

lisp - 理解 Common Lisp do 宏语法