Clojure/LISP REST客户端设计

Clojure/LISP REST客户端设计,clojure,lisp,Clojure,Lisp,来自OOP背景,我对Clojure中API设计的推荐方式表示怀疑。例如,在OOP语言(此处为Python)中,为了使用某些API,我将执行以下操作: api = someWebService() api.setWriteApiKey(WRITE_API_KEY) api.sampleloadSong('file.mp3') 在上面的示例中,我设置了一次API键,并一次又一次地调用关联的方法,而没有再次传递API键。在Clojure或任何其他LISP语言家族中,建议采用什么方法来实现这一点 我是

来自OOP背景,我对Clojure中API设计的推荐方式表示怀疑。例如,在OOP语言(此处为Python)中,为了使用某些API,我将执行以下操作:

api = someWebService()
api.setWriteApiKey(WRITE_API_KEY)
api.sampleloadSong('file.mp3')
在上面的示例中,我设置了一次API键,并一次又一次地调用关联的方法,而没有再次传递API键。在Clojure或任何其他LISP语言家族中,建议采用什么方法来实现这一点

我是否需要在每个函数调用中传递密钥,如下所示:

(sampleloadSong "WRITE_API_KEY" "file.mp3")

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

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

然后在以后的程序中:

(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} ....)
还有一种常见的方法,人们将键定义为可动态绑定的符号,并要求调用者对其进行适当绑定:

(def *api-key* :unset)

(defn api .... use *api-key* )
从调用方的命名空间:

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

这种方法可能不像以前那么流行了,我个人倾向于通过配置映射,尽管这只是我的观点

生成一个不可变的API对象,您将反复使用它:
(使API成为“密钥”。。。(示例加载歌曲api歌曲)
。即使在命令式语言中,它实际上也是一个相当合理的设计。@om nom nom你能用一个简短的例子来解释它吗?
(binding [*api-key* WRITE_API_KEY]
   (api :add-song "foo.mp3"))