Interpret list splats
This commit is contained in:
parent
9d645e3b4b
commit
7390461f2b
|
@ -387,6 +387,21 @@
|
||||||
(defn- panic [ast ctx]
|
(defn- panic [ast ctx]
|
||||||
(throw (ex-info (show/show (interpret-ast (:expr ast) ctx)) {:ast ast})))
|
(throw (ex-info (show/show (interpret-ast (:expr ast) ctx)) {:ast ast})))
|
||||||
|
|
||||||
|
(defn- list-term [ctx]
|
||||||
|
#(if (= (::ast/type %2) ::ast/splat)
|
||||||
|
(let [splatted (interpret-ast (:expr %2) ctx)
|
||||||
|
splat-list? (and
|
||||||
|
(vector? splatted)
|
||||||
|
(not (= (first splatted) ::data/tuple)))]
|
||||||
|
(if splat-list?
|
||||||
|
(concat %1 splatted)
|
||||||
|
(throw (ex-info "Cannot splat non-list into list" {:ast %2}))))
|
||||||
|
(concat %1 [(interpret-ast %2 ctx)])))
|
||||||
|
|
||||||
|
(defn- interpret-list [ast ctx]
|
||||||
|
(let [members (:members ast)]
|
||||||
|
(into [] (reduce (list-term ctx) [] members))))
|
||||||
|
|
||||||
(defn interpret-ast [ast ctx]
|
(defn interpret-ast [ast ctx]
|
||||||
(case (::ast/type ast)
|
(case (::ast/type ast)
|
||||||
|
|
||||||
|
@ -448,9 +463,7 @@
|
||||||
[(if (:partial ast) ::data/partial ::data/tuple)]
|
[(if (:partial ast) ::data/partial ::data/tuple)]
|
||||||
(map #(interpret-ast % ctx)) members))
|
(map #(interpret-ast % ctx)) members))
|
||||||
|
|
||||||
::ast/list
|
::ast/list (interpret-list ast ctx)
|
||||||
(let [members (:members ast)]
|
|
||||||
(into [] (map #(interpret-ast % ctx)) members))
|
|
||||||
|
|
||||||
::ast/set
|
::ast/set
|
||||||
(let [members (:members ast)]
|
(let [members (:members ast)]
|
||||||
|
@ -487,9 +500,10 @@
|
||||||
|
|
||||||
(def source "
|
(def source "
|
||||||
|
|
||||||
let #{} = #{:foo :bar, :bar nil, :baz 42}
|
let foo = #{:bar [1, 2]}
|
||||||
|
fn bar () -> [3, 4]
|
||||||
|
|
||||||
let [] = []
|
[...foo :bar, ...bar ()]
|
||||||
|
|
||||||
")
|
")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user