Clojure中的模式匹配函数?

mik*_*kom 28 design-patterns clojure matching

我过去使用过erlang,它有一些非常有用的东西,比如模式匹配函数或"函数守卫".erlang文档的示例是:

fact(N) when N>0 -> 
    N * fact(N-1); 
fact(0) ->      
    1.    
Run Code Online (Sandbox Code Playgroud)

但是这可以扩展到一个更复杂的例子,其中的参数和值的形式是匹配的.

在clojure中有类似的东西吗?

gil*_*esc 30

目前正在努力通过core.match(https://github.com/clojure/core.match)库中的统一来实现这一目标.

根据您想要做的事情,另一种常见的方法是使用defmulti/defmethod来调度任意函数.请参阅http://clojuredocs.org/clojure_core/clojure.core/defmulti(该页面底部是阶乘示例)

  • core.match几乎就是我在代码级别上寻找的东西,这是1.3的核心部分(我不完全理解clojure包装是如何工作的)?对于一些宏,我认为可以将语法扩展到函数(在erlang中的恕我直言,最清晰的代码可以用带有警卫的模式匹配函数编写) (3认同)

小智 15

我想介绍defun,它是一个宏来定义函数与模式匹配就像erlang一样,它基于core.match.以上事实函数可写入:

(use 'defun)
(defun fact
  ([0] 1)
  ([(n :guard #(> % 0))] 
    (* n (fact (dec n)))))
Run Code Online (Sandbox Code Playgroud)

另一个例子,从零到正数n的累加器:

(defun accum
  ([0 ret] ret)
  ([n ret] (recur (dec n) (+ n ret)))
  ([n] (recur n 0)))
Run Code Online (Sandbox Code Playgroud)

更多信息请参阅https://github.com/killme2008/defun

  • 那好美丽!该项目祝您好运,我相信它会帮助很多人,因为模式匹配功能是编程中最被低估的功能之一。 (2认同)

Dav*_*Ray 9

core.match是Clojure的全功能和可扩展模式匹配库.有一点宏观魔法,你可能会得到一个非常接近你正在寻找的东西.