2024-06-05 17:01:43 +00:00
|
|
|
(import spork/json :as j)
|
2024-06-05 21:47:41 +00:00
|
|
|
(try (os/cd "janet") ([_] nil))
|
2024-06-05 17:01:43 +00:00
|
|
|
(import /base :as b)
|
|
|
|
|
2024-06-05 19:52:03 +00:00
|
|
|
(defn- get-line [source line]
|
|
|
|
((string/split "\n" source) (dec line)))
|
|
|
|
|
2024-06-05 21:47:41 +00:00
|
|
|
(defn scan-error [e] (pp e) e)
|
2024-06-05 17:01:43 +00:00
|
|
|
|
2024-06-05 19:52:03 +00:00
|
|
|
(defn parse-error [e]
|
|
|
|
(def msg (e :msg))
|
|
|
|
(def line-num (get-in e [:token :line]))
|
|
|
|
(def source (get-in e [:token :source]))
|
|
|
|
(def source-line (get-line source line-num))
|
|
|
|
(print "Parsing error: " msg)
|
|
|
|
(print "On line " line-num ":")
|
2024-06-05 21:47:41 +00:00
|
|
|
(print source-line)
|
|
|
|
e)
|
2024-06-05 19:52:03 +00:00
|
|
|
|
2024-06-05 17:01:43 +00:00
|
|
|
|
2024-06-05 19:52:03 +00:00
|
|
|
(defn validation-error [e]
|
|
|
|
(def msg (e :msg))
|
|
|
|
(def line-num (get-in e [:node :token :line]))
|
|
|
|
(def source (get-in e [:node :token :source]))
|
|
|
|
(def source-line (get-line source line-num))
|
|
|
|
(case msg
|
|
|
|
"unbound name"
|
|
|
|
(do
|
|
|
|
(print "Validation error: " msg " " (get-in e [:node :data]))
|
|
|
|
(print "on line " line-num)
|
2024-06-05 21:47:41 +00:00
|
|
|
(print source-line))
|
|
|
|
(do
|
|
|
|
(print "Validation error: " msg)
|
|
|
|
(print "on line " line-num)
|
|
|
|
(print source-line)))
|
|
|
|
e)
|
|
|
|
|
|
|
|
(defn- fn-no-match [e]
|
|
|
|
(print "Ludus panicked! no match")
|
|
|
|
(def line-num (get-in e [:node :token :line]))
|
|
|
|
(def source (get-in e [:node :token :source]))
|
|
|
|
(def source-line (get-line source line-num))
|
|
|
|
(print "on line " line-num)
|
|
|
|
(def called (e :called))
|
|
|
|
(print "calling " (b/show called))
|
|
|
|
(def value (e :value))
|
|
|
|
(print "with " (b/show value))
|
|
|
|
(print "expecting to match one of")
|
|
|
|
(print (b/pretty-patterns called))
|
2024-06-06 00:16:29 +00:00
|
|
|
(print source-line)
|
2024-06-05 21:47:41 +00:00
|
|
|
)
|
|
|
|
|
2024-06-06 00:16:29 +00:00
|
|
|
(defn- let-no-match [e]
|
|
|
|
(print "Ludus panicked! no match")
|
|
|
|
(def line-num (get-in e [:node :token :line]))
|
|
|
|
(def source (get-in e [:node :token :source]))
|
|
|
|
(def source-line (get-line source line-num))
|
|
|
|
(print "on line " line-num)
|
|
|
|
(print "binding " (b/show (e :value)))
|
|
|
|
(def pattern (get-in e [:node :data 0]))
|
|
|
|
(print "to " (b/show-patt pattern))
|
|
|
|
(print source-line))
|
|
|
|
|
2024-06-05 21:47:41 +00:00
|
|
|
(defn- generic-panic [e]
|
|
|
|
(def msg (e :msg))
|
|
|
|
(def line-num (get-in e [:node :token :line]))
|
|
|
|
(def source (get-in e [:node :token :source]))
|
|
|
|
(def source-line (get-line source line-num))
|
|
|
|
(print "Ludus panicked! " msg)
|
|
|
|
(print "on line " line-num)
|
|
|
|
(print source-line)
|
2024-06-05 19:52:03 +00:00
|
|
|
)
|
2024-06-05 17:01:43 +00:00
|
|
|
|
2024-06-06 00:16:29 +00:00
|
|
|
(defn- unbound-name [e]
|
|
|
|
(def {:line line-num :source source :lexeme name} (get-in e [:node :token]))
|
|
|
|
(def source-line (get-line source line-num))
|
|
|
|
(print "Ludus panicked! unbound name " name)
|
|
|
|
(print "on line " line-num)
|
|
|
|
(print source-line)
|
|
|
|
)
|
|
|
|
|
2024-06-05 21:47:41 +00:00
|
|
|
(defn runtime-error [e]
|
2024-06-06 00:16:29 +00:00
|
|
|
(when (= :string (type e)) (print e) (break e))
|
2024-06-05 21:47:41 +00:00
|
|
|
(def msg (e :msg))
|
|
|
|
(case msg
|
|
|
|
"no match: function call" (fn-no-match e)
|
2024-06-06 00:16:29 +00:00
|
|
|
"no match: let binding" (let-no-match e)
|
|
|
|
"unbound name" (unbound-name e)
|
|
|
|
(generic-panic e))
|
2024-06-05 21:47:41 +00:00
|
|
|
e)
|