core: move and/or/cond/when-not to the overlay (enabled by expand-once cache)
The hot control macros now live in the Clojure syntax tier. This was blocked before: as interpreted overlay macros they re-expanded on every eval, timing out a battery file (3930->3911). With the expand-once macro cache (prior commit) they expand a single time with zero runtime cost, so moving them is free. conformance 228/228 x3, clojure-test-suite 3930 (9 timeouts, not 10), full suite green, bench flat (overlay vs janet macros within noise).
This commit is contained in:
parent
29a79f34f4
commit
613aaa5451
2 changed files with 25 additions and 54 deletions
|
|
@ -11,3 +11,27 @@
|
|||
|
||||
(defmacro when [test & body]
|
||||
`(if ~test (do ~@body)))
|
||||
|
||||
(defmacro when-not [test & body]
|
||||
`(if (not ~test) (do ~@body)))
|
||||
|
||||
(defmacro and [& exprs]
|
||||
(if (empty? exprs)
|
||||
true
|
||||
(if (empty? (rest exprs))
|
||||
(first exprs)
|
||||
`(let* [and# ~(first exprs)] (if and# (and ~@(rest exprs)) and#)))))
|
||||
|
||||
(defmacro or [& exprs]
|
||||
(if (empty? exprs)
|
||||
nil
|
||||
(if (empty? (rest exprs))
|
||||
(first exprs)
|
||||
`(let* [or# ~(first exprs)] (if or# or# (or ~@(rest exprs)))))))
|
||||
|
||||
;; :else (any truthy value) is just a test, so no special case — (if :else e ...)
|
||||
;; takes e.
|
||||
(defmacro cond [& clauses]
|
||||
(if (empty? clauses)
|
||||
nil
|
||||
`(if ~(first clauses) ~(nth clauses 1) (cond ~@(drop 2 clauses)))))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue