core: move cond->>/assert/delay/future/letfn macros to overlay
Phase 3 batch 4 (jolt-1j0), 5 macros. cond->> (thread-last) is safe; cond-> stays (compiler uses it). delay/future expand to make-delay/future-call host fns; letfn builds its fn* binding via a template (cons/list in a macro body make a plist the evaluator can't call as a form). conformance 228/228 x3, clojure-test-suite 3930, full suite green, bench flat.
This commit is contained in:
parent
31a257ce70
commit
24b217d314
3 changed files with 36 additions and 56 deletions
|
|
@ -82,3 +82,27 @@
|
|||
(let [g (fresh-sym)
|
||||
steps (map (fn [f] `(if (nil? ~g) nil (->> ~g ~f))) forms)]
|
||||
`(let [~g ~expr ~@(thread-binds g steps)] ~(if (empty? steps) g (last steps)))))
|
||||
|
||||
;; cond-> stays in Janet (the compiler uses it); cond->> (thread-last) is safe.
|
||||
(defmacro cond->> [expr & clauses]
|
||||
(let [g (fresh-sym)
|
||||
steps (map (fn [pair] `(if ~(first pair) (->> ~g ~(second pair)) ~g))
|
||||
(partition 2 clauses))]
|
||||
`(let [~g ~expr ~@(thread-binds g steps)] ~(if (empty? steps) g (last steps)))))
|
||||
|
||||
(defmacro assert [x & [message]]
|
||||
(let [msg (if message message (str "Assert failed: " (pr-str x)))]
|
||||
`(when-not ~x (throw (ex-info ~msg {})))))
|
||||
|
||||
(defmacro delay [& body]
|
||||
`(make-delay (fn [] ~@body)))
|
||||
|
||||
(defmacro future [& body]
|
||||
`(future-call (fn [] ~@body)))
|
||||
|
||||
;; Build the fn* form via a template (a reader-list array): cons/list in a macro
|
||||
;; body produce a plist the evaluator can't call as a form.
|
||||
(defmacro letfn [fnspecs & body]
|
||||
(let [binds (reduce (fn [acc spec] (conj (conj acc (first spec)) `(fn* ~@(rest spec))))
|
||||
[] fnspecs)]
|
||||
`(let* [~@binds] ~@body)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue