diff options
| author | Andrey Orst <andreyorst@gmail.com> | 2020-11-08 21:13:47 +0300 |
|---|---|---|
| committer | Andrey Orst <andreyorst@gmail.com> | 2020-11-08 21:13:47 +0300 |
| commit | 910bfcf768c2305a6885b0d1f491561d09ebd9ca (patch) | |
| tree | cd88174ffdb222df8b61ecf68796452580d9dee4 /macros | |
| parent | cf18cb390b2ba9ac852b52b22beb9fda0d4ab7d2 (diff) | |
feature(macros): add metadata macros, doc, and some tests
Diffstat (limited to 'macros')
| -rw-r--r-- | macros/core.fnl | 25 | ||||
| -rw-r--r-- | macros/fn.fnl | 18 |
2 files changed, 25 insertions, 18 deletions
diff --git a/macros/core.fnl b/macros/core.fnl index b073d27..def2f4c 100644 --- a/macros/core.fnl +++ b/macros/core.fnl @@ -1,7 +1,8 @@ -(import-macros {: fn* : fn&} :macros.fn) +(require-macros :macros.fn) (local core {}) (local unpack (or table.unpack _G.unpack)) (local insert table.insert) +(local meta-enabled (pcall _SCOPE.specials.doc (list (sym :doc) (sym :doc)) _SCOPE _CHUNK)) (fn multisym->sym [s] (if (multi-sym? s) @@ -152,18 +153,22 @@ (fn string? [x] (= (type x) :string)) +(fn& core.when-meta [...] + (when meta-enabled `(do ,...))) + (fn* core.with-meta [val meta] - `(let [val# ,val - (res# fennel#) (pcall require :fennel)] - (if res# - (each [k# v# (pairs ,meta)] - (fennel#.metadata:set val# k# v#))) - val#)) + (if (not meta-enabled) val + `(let [val# ,val + (res# fennel#) (pcall require :fennel)] + (if res# + (each [k# v# (pairs ,meta)] + (fennel#.metadata:set val# k# v#))) + val#))) (fn* core.meta [v] - `(let [(res# fennel#) (pcall require :fennel)] - (if res# - (. fennel#.metadata ,v)))) + (when-meta + `(let [(res# fennel#) (pcall require :fennel)] + (if res# (. fennel#.metadata ,v))))) (fn* core.defmulti [name & opts] diff --git a/macros/fn.fnl b/macros/fn.fnl index 2d4a753..24f909d 100644 --- a/macros/fn.fnl +++ b/macros/fn.fnl @@ -1,14 +1,16 @@ (local unpack (or table.unpack _G.unpack)) (local insert table.insert) (local sort table.sort) +(local meta-enabled (pcall _SCOPE.specials.doc (list (sym :doc) (sym :doc)) _SCOPE _CHUNK)) (fn with-meta [val meta] - `(let [val# ,val - (res# fennel#) (pcall require :fennel)] - (if res# - (each [k# v# (pairs ,meta)] - (fennel#.metadata:set val# k# v#))) - val#)) + (if (not meta-enabled) val + `(let [val# ,val + (res# fennel#) (pcall require :fennel)] + (if res# + (each [k# v# (pairs ,meta)] + (fennel#.metadata:set val# k# v#))) + val#))) (fn gen-arglist-doc [args] (if (list? (. args 1)) @@ -252,8 +254,8 @@ namespaced functions. See `fn*' for more info." (let [docstring (if (string? doc?) doc? nil) (name-wo-namespace namespaced?) (multisym->sym name) arg-list (if (sym? name-wo-namespace) - (if (string? doc?) args doc?) - name-wo-namespace) + (if (string? doc?) args doc?) + name-wo-namespace) arglist-doc (gen-arglist-doc arg-list) body (if (sym? name) (if (string? doc?) |