summaryrefslogtreecommitdiff
path: root/macros/core.fnl
diff options
context:
space:
mode:
Diffstat (limited to 'macros/core.fnl')
-rw-r--r--macros/core.fnl30
1 files changed, 21 insertions, 9 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