Interpret splats in sets

This commit is contained in:
Scott Richmond 2022-05-20 19:01:13 -04:00
parent 6e4fd22fd4
commit b1284f3338

View File

@ -6,7 +6,8 @@
[ludus.prelude :as prelude] [ludus.prelude :as prelude]
[ludus.data :as data] [ludus.data :as data]
[ludus.show :as show] [ludus.show :as show]
[clojure.pprint :as pp])) [clojure.pprint :as pp]
[clojure.set]))
;; right now this is not very efficient: ;; right now this is not very efficient:
;; it's got runtime checking ;; it's got runtime checking
@ -403,12 +404,23 @@
(let [members (:members ast)] (let [members (:members ast)]
(into [] (reduce (list-term ctx) [] members)))) (into [] (reduce (list-term ctx) [] members))))
(defn- set-term [ctx]) (defn- set-term [ctx]
(fn [set member]
(if (= (::ast/type member) ::ast/splat)
(let [splatted (interpret-ast (:expr member) ctx)
splat-set? (set? splatted)]
(if splat-set?
(clojure.set/union set splatted)
(throw (ex-info "Cannot splat non-set into set" {:ast member}))))
(conj set (interpret-ast member ctx)))))
(defn- interpret-set [ast ctx]) (defn- interpret-set [ast ctx]
(let [members (:members ast)]
(reduce (set-term ctx) #{} members)))
(defn- hash-term [ctx] (defn- hash-term [ctx]
(fn [hash member] (if (= (::ast/type member) ::ast/splat) (fn [hash member]
(if (= (::ast/type member) ::ast/splat)
(let [splatted (interpret-ast (:expr member) ctx) (let [splatted (interpret-ast (:expr member) ctx)
splat-map? (and splat-map? (and
(map? splatted) (map? splatted)
@ -489,8 +501,7 @@
::ast/list (interpret-list ast ctx) ::ast/list (interpret-list ast ctx)
::ast/set ::ast/set
(let [members (:members ast)] (interpret-set ast ctx)
(into #{} (map #(interpret-ast % ctx)) members))
::ast/hash (interpret-hash ast ctx) ::ast/hash (interpret-hash ast ctx)
@ -521,9 +532,8 @@
(def source " (def source "
let foo = #{:a 1} fn foo () -> ${1, 2, 3}
let bar = #{:b 2, ...foo} let bar = ${1, ...foo (), 3}
let baz = #{...bar, :a -1}
") ")