From a730948601407e2be84e09df833d4265d895f9d8 Mon Sep 17 00:00:00 2001 From: Andrey Orst Date: Wed, 21 Oct 2020 04:43:32 +0300 Subject: implement Clojure's defn --- fn.fnl | 42 ------------------------------------------ 1 file changed, 42 deletions(-) delete mode 100644 fn.fnl (limited to 'fn.fnl') diff --git a/fn.fnl b/fn.fnl deleted file mode 100644 index e937878..0000000 --- a/fn.fnl +++ /dev/null @@ -1,42 +0,0 @@ -(fn string? [x] - (= (type x) "string")) - -(fn has-amp? [args] - (var res false) - (each [_ s (ipairs args)] - (when (= (tostring s) "&") - (set res true))) - res) - -(fn gen-arity [[args & body]] - (assert-compile (sequence? args) "fn* expects vector as it's parameter list. -Try wrapping arguments in square brackets." args) - (let [arg-length (if (has-amp? args) (sym "_") (length args)) - body (list 'let [args [(sym "...")]] (unpack body))] - (list arg-length body))) - -(fn fn* [name doc? ...] - (assert-compile (not (string? name)) "fn* expects symbol as function name" name) - (let [docstring (if (string? doc?) doc? nil) - args (if (sym? name) - (if (string? doc?) [...] [doc? ...]) - [name doc? ...]) - [x & xs] args] - (if (sequence? x) - ;; Ordinary function - (let [[args & body] args] - (if (sym? name) - `(fn ,name ,args ,docstring ,(unpack body)) - `(fn ,args ,docstring ,(unpack body)))) - ;; Multi-arity function - (list? x) - (let [bodies []] - (each [_ arity (ipairs args)] - (let [[arity body] (gen-arity arity)] - (table.insert bodies arity) - (table.insert bodies body))) - `(fn ,name [...] ,docstring (match (length [...]) ,(unpack bodies))))))) - -{: fn*} - -;; (import-macros {: fn*} :fn) (macrodebug (fn* f ([a] a))) -- cgit v1.2.3