(import /src/base :as b) (defn- get-line [source line] ((string/split "\n" source) (dec line))) (defn scan-error [e] (pp e) e) (defn parse-error [e] (def msg (e :msg)) (def {:line line-num :input input :soure source} (e :token)) (def source-line (get-line source line-num)) (print "Parsing error: " msg) (print "On line " line-num " in " input) (print source-line) e) (defn validation-error [e] (def msg (e :msg)) (def {:line line-num :input input :source source} (get-in e [:node :token])) (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 " in " input) (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 line-num :source source :input input} (get-in e [:node :token])) (def source-line (get-line source line-num)) (print "on line " line-num " in " input) (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)) (print source-line)) (defn- let-no-match [e] (print "Ludus panicked! no match") (def {:line line-num :source source :input input} (get-in e [:node :token])) (def source-line (get-line source line-num)) (print "on line " line-num " in " input) (print "binding " (b/show (e :value))) (def pattern (get-in e [:node :data 0])) (print "to " (b/show-patt pattern)) (print source-line)) (defn- generic-panic [e] (def msg (e :msg)) (def {:line line-num :source source :input input} (get-in e [:node :token])) (def source-line (get-line source line-num)) (print "Ludus panicked! " msg) (print "on line " line-num " in " input) (print source-line)) (defn- unbound-name [e] (def {:line line-num :source source :lexeme name :input input} (get-in e [:node :token])) (def source-line (get-line source line-num)) (print "Ludus panicked! unbound name " name) (print "on line " line-num " in " input) (print source-line)) (defn runtime-error [e] (when (= :string (type e)) (print (string "Internal Ludus error: " e)) (break e)) (def msg (e :msg)) (case msg "no match: function call" (fn-no-match e) "no match: let binding" (let-no-match e) "unbound name" (unbound-name e) (generic-panic e)) e)