core: move defn and defn- to the syntax tier
defn drops an optional leading docstring/attr-map then emits (def name (fn* ...)). Single- and multi-arity both reduce to (fn* ~@body) so no arity branching is needed. map? is true for symbol forms in Jolt, so the attr-map strip is guarded with symbol?. defn- delegates to defn (privacy isn't enforced, as in Clojure's own defn-). Placed before fresh-sym, which is itself a defn- now. All five fundamental macros (fn/let/loop/defn/defn-) are now in the overlay. conformance 228x3, fixpoint, clojure-test-suite 3930, full suite green.
This commit is contained in:
parent
4eb2cf5c46
commit
08c796c145
2 changed files with 16 additions and 37 deletions
|
|
@ -80,6 +80,21 @@
|
|||
(defmacro loop [bindings & body]
|
||||
`(loop* ~bindings ~@body))
|
||||
|
||||
;; defn: drop an optional leading docstring and attr-map, then (def name (fn* ...)).
|
||||
;; Both single- and multi-arity reduce to (fn* ~@body) — fn* takes either a params
|
||||
;; vector + body or a sequence of ([params] body) clauses, so no arity branching is
|
||||
;; needed. (map? is true for symbol forms too, so guard the attr-map with symbol?.)
|
||||
;; Defined before fresh-sym below, which is a defn-.
|
||||
(defmacro defn [fn-name & body]
|
||||
(let [body (if (and (seq body) (string? (first body))) (rest body) body)
|
||||
body (if (and (seq body) (map? (first body)) (not (symbol? (first body))))
|
||||
(rest body) body)]
|
||||
`(def ~fn-name (fn* ~@body))))
|
||||
|
||||
;; Jolt doesn't enforce privacy, so defn- is just defn (matching how Clojure's own
|
||||
;; defn- delegates to defn with :private metadata).
|
||||
(defmacro defn- [fn-name & body] `(defn ~fn-name ~@body))
|
||||
|
||||
;; A fresh jolt symbol inside a macro body (a bare (gensym) returns a Janet symbol
|
||||
;; the destructurer rejects). This defn compiles fine: by the time a tier triggers
|
||||
;; the analyzer build the kernel is in place (the build is gated until then).
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue