Skip to content

Commit 188a3ab

Browse files
committed
wip
1 parent 85795a7 commit 188a3ab

4 files changed

Lines changed: 44 additions & 39 deletions

File tree

bb/tasks.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,5 +121,5 @@
121121
(defn libtests []
122122
#_(build-squint-npm-package)
123123
;; temporarily disabled because of not= bug
124-
#_(eucalypt-test)
124+
(eucalypt-test)
125125
(clojure-mode-test))

src/squint/compiler.cljc

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,40 @@
309309
(str/join ", " (emit-args (expr-env env) expr)))
310310
env))
311311

312+
(defn- make-get-expander [env]
313+
(when (:anf env)
314+
(fn [op env]
315+
(when (symbol? op)
316+
(let [ns-state (some-> (:ns-state env) deref)
317+
current (:current ns-state)
318+
current-ns-state (get ns-state current)
319+
excluded? (contains? current-ns-state op)
320+
head (strip-core-symbol op)]
321+
(when-not (or (:squint.compiler/skip-macro (meta op))
322+
excluded?)
323+
(case head
324+
let (fn [form env & args]
325+
(let [result (core-let env (first args) (rest args))]
326+
;; core-let returns (cljs.core/let* ...), normalize
327+
(if (and (seq? result) (= 'cljs.core/let* (first result)))
328+
(cons 'let* (rest result))
329+
result)))
330+
fn (fn [form _env & sigs]
331+
(apply core-fn form {} sigs))
332+
(or (built-in-macros head)
333+
(let [ns (namespace head)
334+
nm (name head)
335+
nms (symbol nm)]
336+
(if ns
337+
(let [nss (symbol ns)]
338+
(or
339+
(some-> env :macros (get nss) (get nms))
340+
(let [resolved-ns (get-in current-ns-state [:aliases nss] nss)]
341+
(get-in ns-state [:macros resolved-ns nms]))))
342+
(let [refers (:refers current-ns-state)]
343+
(when-let [macro-ns (get refers nms)]
344+
(get-in ns-state [:macros macro-ns nms])))))))))))))
345+
312346
(defn transpile-form
313347
([f] (transpile-form f nil))
314348
([f env]
@@ -331,40 +365,7 @@
331365
::cc/keyword emit-keyword
332366
::cc/set emit-set
333367
::cc/special emit-special}
334-
::anf/get-expander
335-
(fn [op env]
336-
(when (symbol? op)
337-
(let [ns-state (some-> (:ns-state env) deref)
338-
current (:current ns-state)
339-
current-ns-state (get ns-state current)
340-
excluded? (contains? current-ns-state op)
341-
head (strip-core-symbol op)]
342-
(when-not (or (:squint.compiler/skip-macro (meta op))
343-
excluded?)
344-
(case head
345-
let (fn [form env & args]
346-
(let [result (core-let env (first args) (rest args))]
347-
;; core-let returns (cljs.core/let* ...), normalize
348-
(if (and (seq? result) (= 'cljs.core/let* (first result)))
349-
(cons 'let* (rest result))
350-
result)))
351-
fn (fn [form _env & sigs]
352-
(apply core-fn form {} sigs))
353-
(or (built-in-macros head)
354-
(let [ns (namespace head)
355-
nm (name head)
356-
nms (symbol nm)]
357-
(if ns
358-
(let [nss (symbol ns)]
359-
(or
360-
(some-> env :macros (get nss) (get nms))
361-
(let [resolved-ns (get-in current-ns-state [:aliases nss] nss)]
362-
(get-in ns-state [:macros resolved-ns nms]))))
363-
(let [refers (:refers current-ns-state)]
364-
(when-let [macro-ns (get refers nms)]
365-
(get-in ns-state [:macros macro-ns nms])))))))))))
366-
} env))))))
367-
368+
::anf/get-expander (make-get-expander env)} env))))))
368369
(def ^:dynamic *jsx* false)
369370

370371
(defn jsx [form]

src/squint/internal/cli.cljs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ Use squint <subcommand> --help to show more info.")))
128128
Options:
129129
130130
--no-run: do not run compiled expression
131-
--show: print compiled expression")
131+
--show: print compiled expression
132+
--anf: enable ANF transformation (eliminates IIFEs)")
132133
(let [e e #_(if (:repl opts)
133134
(str/replace "(do %s\n)" "%s" e)
134135
e)
@@ -226,7 +227,8 @@ Options:
226227
(cli/dispatch table
227228
(.slice js/process.argv 2)
228229
{:aliases {:h :help}
229-
:coerce {:elide-exports :boolean
230+
:coerce {:anf :boolean
231+
:elide-exports :boolean
230232
:elide-imports :boolean
231233
:output-dir :string
232234
:repl :boolean

test/squint/test_utils.cljs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,13 @@
5353
(if (string? expr)
5454
(let [{:keys [pragmas body]}
5555
(squint/compile-string* expr (merge {:elide-imports true
56-
:core-alias "squint_core"}
56+
:core-alias "squint_core"
57+
:anf true}
5758
opts))]
5859
(str pragmas body))
5960
(squint/transpile-form expr (merge {:elide-imports true
60-
:core-alias "squint_core"}
61+
:core-alias "squint_core"
62+
:anf true}
6163
opts)))))
6264

6365
(defn js!

0 commit comments

Comments
 (0)