diff options
| -rw-r--r-- | macros/core.fnl | 30 | ||||
| -rw-r--r-- | macros_test.fnl | 11 |
2 files changed, 29 insertions, 12 deletions
diff --git a/macros/core.fnl b/macros/core.fnl index f300dbd..31ac1ae 100644 --- a/macros/core.fnl +++ b/macros/core.fnl @@ -184,16 +184,28 @@ multifn#)) (fn* core.def - [name expr] - (let [(s m) (multisym->sym name)] - (if m - `(local ,s (do (local ,s ,expr) (set ,name ,s) ,s)) - `(local ,name ,expr)))) + ([name expr] (def {} name expr)) + ([attr-map name expr] + (if (not (or (table? attr-map) + (string? attr-map))) + (error "def: expected keyword or literal table as first argument" 2)) + (let [(s multi) (multisym->sym name) + f (if (if (table? attr-map) + (. attr-map :dynamic) + (if (= attr-map :dynamic) + true + (error (.. "unsupported attribute keyword: :" attr-map) 2))) + 'var 'local)] + (if multi + `(,f ,s (do (,f ,s ,expr) (set ,name ,s) ,s)) + `(,f ,name ,expr))))) (fn* core.defonce - [name expr] - (if (in-scope? name) - nil - (def name expr))) + ([name expr] + (defonce {} name expr)) + ([attr-map name expr] + (if (in-scope? (if (table? attr-map) name attr-map)) + nil + (def attr-map name expr)))) core diff --git a/macros_test.fnl b/macros_test.fnl index b8556e8..3ed5ad1 100644 --- a/macros_test.fnl +++ b/macros_test.fnl @@ -94,16 +94,21 @@ (deftest def-macros (testing def - (def a 10) + (def {:dynamic true} a 10) (assert-eq a 10) + (set a 20) + (assert-eq a 20) (def a {}) (assert-eq a {}) (def a.b 10) (assert-eq a.b 10) - (assert-eq b 10)) + (assert-eq b 10) + (def :dynamic c 10) + (set c 15) + (assert-eq c 15)) (testing defonce - (defonce a 10) + (defonce {:dynamic true} a 10) (assert-eq a 10) (defonce a {}) (assert-eq a 10) |