Add use
to language
This commit is contained in:
parent
6070b6512e
commit
252b9af358
|
@ -251,7 +251,7 @@
|
||||||
(zero+ struct-entry)
|
(zero+ struct-entry)
|
||||||
(quiet :rbrace)])
|
(quiet :rbrace)])
|
||||||
|
|
||||||
(defp use-expr group order-1 [:use :word])
|
(defp use-expr group order-1 [(quiet :use) :word])
|
||||||
|
|
||||||
(defp toplevel flat choice [import-expr
|
(defp toplevel flat choice [import-expr
|
||||||
ns-expr
|
ns-expr
|
||||||
|
|
|
@ -613,6 +613,27 @@
|
||||||
; interpret-result))
|
; interpret-result))
|
||||||
; ))))
|
; ))))
|
||||||
|
|
||||||
|
(defn- kw->str [kw] (apply str (rest (str kw))))
|
||||||
|
|
||||||
|
(defn- str->word [wordstr] {:type :word :data [wordstr]})
|
||||||
|
|
||||||
|
(defn- interpret-use [ast ctx]
|
||||||
|
(let [data (:data ast)
|
||||||
|
word (first data)
|
||||||
|
ns (resolve-word word ctx)]
|
||||||
|
(println "use: " ns)
|
||||||
|
(if (not (= (::data/type ns) ::data/ns))
|
||||||
|
(throw (ex-info (str "`use` may only use namespaces; " (-> word :data first) " is not a namespace") {:ast ast}))
|
||||||
|
(let [ns-entries (dissoc ns ::data/type ::data/name ::data/struct)
|
||||||
|
ns-keys (map kw->str (keys ns-entries))
|
||||||
|
ns-words (map str->word ns-keys)
|
||||||
|
implied-pattern {:type :struct-pattern :data ns-words}
|
||||||
|
sugared-let {:type :let-expr :data [implied-pattern ns]}]
|
||||||
|
(interpret-let sugared-let ctx)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
(defn- interpret-ref [ast ctx]
|
(defn- interpret-ref [ast ctx]
|
||||||
(let [data (:data ast)
|
(let [data (:data ast)
|
||||||
name (-> data first :data first)
|
name (-> data first :data first)
|
||||||
|
@ -779,6 +800,8 @@
|
||||||
|
|
||||||
:ns-expr (interpret-ns ast ctx)
|
:ns-expr (interpret-ns ast ctx)
|
||||||
|
|
||||||
|
:use-expr (interpret-use ast ctx)
|
||||||
|
|
||||||
;; :import-expr (interpret-import ast ctx)
|
;; :import-expr (interpret-import ast ctx)
|
||||||
|
|
||||||
:ref-expr (interpret-ref ast ctx)
|
:ref-expr (interpret-ref ast ctx)
|
||||||
|
@ -885,3 +908,27 @@
|
||||||
(println "Ludus panicked!")
|
(println "Ludus panicked!")
|
||||||
(println (ex-message e))
|
(println (ex-message e))
|
||||||
{:result :error :ctx (volatile! orig-ctx)})))))
|
{:result :error :ctx (volatile! orig-ctx)})))))
|
||||||
|
|
||||||
|
(defn interpret-safe [source parsed ctx]
|
||||||
|
(try
|
||||||
|
(let [base-ctx (volatile! {::parent (volatile! (merge prelude/prelude ctx))})]
|
||||||
|
(interpret-ast parsed base-ctx))
|
||||||
|
(catch Throwable e
|
||||||
|
(println "Ludus panicked!")
|
||||||
|
(println "On line" (get-in (ex-data e) [:ast :token :line]))
|
||||||
|
(println ">>> " (get-line source (get-in (ex-data e) [:ast :token :line])))
|
||||||
|
(println (ex-message e))
|
||||||
|
(pp/pprint (ex-data e)
|
||||||
|
))))
|
||||||
|
|
||||||
|
;; repl
|
||||||
|
(do
|
||||||
|
|
||||||
|
(def source "@{foo}")
|
||||||
|
|
||||||
|
(def tokens (-> source scanner/scan :tokens))
|
||||||
|
|
||||||
|
(def ast (p/apply-parser g/struct-pattern tokens))
|
||||||
|
(println ast)
|
||||||
|
;; (interpret-safe source ast {})
|
||||||
|
)
|
|
@ -25,6 +25,7 @@
|
||||||
"ref" :ref ;; impl
|
"ref" :ref ;; impl
|
||||||
"then" :then ;; impl
|
"then" :then ;; impl
|
||||||
"true" :true ;; impl -> literal word
|
"true" :true ;; impl -> literal word
|
||||||
|
"use" :use ;; wip
|
||||||
"with" :with ;; impl
|
"with" :with ;; impl
|
||||||
"when" :when ;; impl, replaces cond
|
"when" :when ;; impl, replaces cond
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user