summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--macros/core.fnl30
-rw-r--r--macros_test.fnl11
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)