Add Curry module.

This commit is contained in:
Paul Tagliamonte 2014-01-28 20:27:39 -05:00
parent b58befa2dd
commit 54da3f08dd
4 changed files with 46 additions and 0 deletions

12
eg/curry/ski.hy Normal file
View File

@ -0,0 +1,12 @@
(require hy.contrib.curry)
(defnc s [x y z] ((x z) (y z))) ; λxyz.xz(yz)
(defnc k [x] (fn [y] x)) ; λx.λy.x
(defnc i [x] x) ;; λx.x
(defnc succ [n] (+ n 1))
(print (((((s ((((k s) k) i) i)) (i i)) ((i (i i))
((((k s) i) ((s (k s)) k)) i))) succ) 0))

20
hy/contrib/curry.hy Normal file
View File

@ -0,0 +1,20 @@
(import inspect functools sys)
(defn curry [func]
(let [[sig (.getargspec inspect func)]
[count (len sig.args)]]
(fn [&rest args]
(if (< (len args) count)
(apply functools.partial (+ [(curry func)] (list args)))
(apply func args)))))
(defmacro fnc [args &rest body]
`(do (import hy.contrib.curry)
(with-decorator hy.contrib.curry.curry (fn [~@args] ~@body))))
(defmacro defnc [name args &rest body]
`(def ~name (fnc [~@args] ~@body)))

View File

@ -19,3 +19,4 @@ from .native_tests.contrib.loop import * # noqa
from .native_tests.contrib.meth import * # noqa
from .native_tests.contrib.walk import * # noqa
from .native_tests.contrib.multi import * # noqa
from .native_tests.contrib.curry import * # noqa

View File

@ -0,0 +1,13 @@
(require hy.contrib.curry)
(defnc s [x y z] ((x z) (y z))) ; λxyz.xz(yz)
(defnc k [x] (fn [y] x)) ; λx.λy.x
(defnc i [x] x) ;; λx.x
(defnc succ [n] (+ n 1))
(defn test-curry []
(assert (= 16 (((((s ((((k s) k) i) i)) (i i)) ((i (i i))
((((k s) i) ((s (k s)) k)) i))) succ) 0))))