core: move if-let/if-some/when-some/while/dotimes macros to overlay
Phase 3 batch 2 (jolt-1j0), 5 user-facing macros as defmacro + syntax-quote. The conditional-binding macros use the auto-gensym temp# idiom so the name binds only in the taken branch (the else/empty branch sees the outer scope, carrying forward the earlier scope fix). when-let stays in Janet for now — 20-coll uses it, so it must remain available before the macro tier loads. Note: gensym in a macro body resolves to Janet's 0-arity builtin, so explicit (gensym "prefix") fails — use template auto-gensym (foo#) instead. conformance 228/228 x3, full suite green (incl. the if-let scope regression spec, now exercising the overlay macro), clojure-test-suite 3930, bench A/B flat.
This commit is contained in:
parent
330a3a23d9
commit
e611034550
3 changed files with 38 additions and 68 deletions
|
|
@ -16,3 +16,30 @@
|
|||
;; via rest-destructuring.
|
||||
(defmacro if-not [test then & [else]]
|
||||
`(if (not ~test) ~then ~else))
|
||||
|
||||
;; Conditional binding macros: the name is bound ONLY in the taken branch (the
|
||||
;; auto-gensym temp# tests the value; the else/empty branch sees the surrounding
|
||||
;; scope). temp# is a single template-local gensym — referenced twice, same symbol.
|
||||
(defmacro if-let [bindings then & [else]]
|
||||
(let [form (bindings 0) tst (bindings 1)]
|
||||
`(let [temp# ~tst]
|
||||
(if temp# (let [~form temp#] ~then) ~else))))
|
||||
|
||||
(defmacro if-some [bindings then & [else]]
|
||||
(let [form (bindings 0) tst (bindings 1)]
|
||||
`(let [temp# ~tst]
|
||||
(if (some? temp#) (let [~form temp#] ~then) ~else))))
|
||||
|
||||
(defmacro when-some [bindings & body]
|
||||
(let [form (bindings 0) tst (bindings 1)]
|
||||
`(let [temp# ~tst]
|
||||
(if (some? temp#) (let [~form temp#] ~@body) nil))))
|
||||
|
||||
(defmacro while [test & body]
|
||||
`(loop [] (when ~test ~@body (recur))))
|
||||
|
||||
(defmacro dotimes [bindings & body]
|
||||
(let [i (bindings 0) n (bindings 1)]
|
||||
`(let [n# ~n]
|
||||
(loop [~i 0]
|
||||
(when (< ~i n#) ~@body (recur (inc ~i)))))))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue