The goal of MAGIC is to compile all of Clojure into MSIL bytecode. To do this, it must provide symbolizers and tests for every Clojure AST node. This list will be kept in sync with progress on the library.
Node | Example | Impl. | Tests |
---|---|---|---|
:static-method |
(Foo/Bar a b c) |
✔ | ✔ |
:instance-method |
(.Bar foo a b c) |
✔ | ✔ |
:static-field |
Foo/Baz |
✔ | |
:instance-field |
(.baz foo)
(.-baz foo)
|
✔ | |
:static-property |
Foo/Qux |
✔ | |
:instance-property |
(.qux foo)
(.-qux foo)
|
✔ | ✔ |
:dynamic-method |
(.quz x a b c)
|
✔ | ✔ |
:dynamic-zero-arity |
(.quz x)
|
✔ | ✔ |
:dynamic-field |
(.-quz x)
|
||
:with-meta |
^{:meta "data"} [1 2 3] |
||
:const |
7
"7"
|
✔ | ✔ |
:vector |
[1 2 3] |
✔ | ✔ |
:map |
{:foo "bar"} |
✔ | ✔ |
:set |
#{1 2 3 4} |
✔ | ✔ |
:local |
(let [a 5] a) |
✔ | ✔ |
:var |
(str 5) |
✔ | |
:do |
(do a b c) |
✔ | ✔ |
:if |
(if true then else) |
✔ | ✔ |
:new |
(Type.)
(Type. 1 2)
(ValueType. 1 2)
|
✔ | |
:initobj |
(ValueType.)
(new ValueType)
|
✔ | |
:quote |
(quote (+ 6 7)) |
||
:set! |
(set! (.foo bar) 5) |
✔ | ✔ |
:try |
(try (foo) (catch System.Exception e e)) |
✔ | ✔ |
:catch |
(try (foo) (catch System.Exception e e)) |
✔ | ✔ |
:throw |
(throw (System.Exception. "foo")) |
✔ | ✔ |
:letfn |
(letfn [(foo [a] a)] (foo 2)) |
||
:let |
(let [a 5] a) |
✔ | ✔ |
:loop |
(loop [a 1] (recur (inc a))) |
✔ | ✔ |
:recur |
(loop [a 1] (recur (inc a))) |
✔ | ✔ |
:binding |
(let [a 5] a) |
✔ | |
:fn |
(fn [x] x) |
✔ | ✔ |
:fn-method |
(fn ([x] x)) |
✔ | ✔ |
:def |
(def a 1) |
||
:invoke |
(str 1 2) |
✔ | ✔ |
:the-var |
(var clojure.core/str) |
✔ | |
:reify |
(reify IInterface (foo [a b] ...)) |
||
:deftype |
(deftype Foo [a b] IInterface (Bar [this x] ...)) |
||
:proxy |
(proxy [Type IInterface] [a b] (Foo [ this x] a ...)) |
||
:case |
(case foo 1 :one 2 :two) |
||
:import |
(import Type [Namespace Type]) |
||
:monitor-enter |
(monitor-enter lock) |
✔ | |
:monitor-exit |
(monitor-exit lock) |
✔ |