Lisp 哪种clojure库界面设计最好?

Lisp 哪种clojure库界面设计最好?,lisp,clojure,Lisp,Clojure,我想提供消息读写器的多个实现。最好的方法是什么 以下是我目前想法的一些伪代码: 只要有一组所有实现都必须提供的函数,并让调用者掌握正确的流即可 (ns x-format) (read-message [stream] ...) (write-message [stream message] ...) 返回一个映射,其中两个关闭的函数保留在流上 (ns x-format) (defn make-formatter [socket] {:read (fn [] (.read (.getIn

我想提供消息读写器的多个实现。最好的方法是什么

以下是我目前想法的一些伪代码:

  • 只要有一组所有实现都必须提供的函数,并让调用者掌握正确的流即可

    (ns x-format)
    (read-message [stream] ...)
    (write-message [stream message] ...)
    
  • 返回一个映射,其中两个关闭的函数保留在流上

    (ns x-format)
    (defn make-formatter [socket]
      {:read (fn [] (.read (.getInputStream socket))))
       :write (fn [message] (.write (.getOutputStream socket) message)))})
    
  • 还有别的吗


    • 我认为读消息和写消息是实用功能。您需要做的是将函数封装在with-宏中。请参阅CommonLisp中的“将输出转换为字符串”以了解我的意思

      编辑:
      使用with-宏时,可以在宏扩展中进行错误处理和资源分配。

      我认为第一个选项更好。它更具可扩展性,这取决于这些对象的使用方式。如果函数和对象是分开的,那么添加或更改在现有对象上工作的新函数会更容易。在Clojure中,通常没有太多的理由将函数与它们所处理的对象捆绑在一起,除非您真的想对代码的用户隐藏实现细节

      如果你正在编写一个你期望很多实现的接口,也可以考虑使用。您可以让缺省值抛出“未实现”异常,以强制实现者实现您的接口

      正如您所说,如果您考虑第二个选项的唯一原因是允许人们不必在每个函数调用上键入一个参数,那么您可以考虑让所有的函数都使用一些var作为默认套接字对象,并使用Socket < /Cord>宏编写一个<代码>,宏使用<代码>绑定< /代码>来设置VAR的值。请参见默认使用

      *out*
      值作为输出流的内置打印方法,以及将
      *out*
      绑定到字符串编写器的
      with out str
      ,作为Clojure示例


      也许你会感兴趣;它将一些OOP习惯用法与Clojure的等价用法进行了比较和对比。

      我选择第一种方法,并将所有这些函数变成多方法