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(该页面底部是阶乘示例)
小智 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
| 归档时间: |
|
| 查看次数: |
16319 次 |
| 最近记录: |