diff --git a/src/jolt/core.janet b/src/jolt/core.janet index e3796db..4645ea3 100644 --- a/src/jolt/core.janet +++ b/src/jolt/core.janet @@ -2069,6 +2069,18 @@ @[{:jolt/type :symbol :ns nil :name "for"} bindings for-body]] nil]) +# assert — (assert x) / (assert x message). Throws when x is falsy. +(defn core-assert [x & more] + (def msg-form + (if (> (length more) 0) + (first more) + (let [b @""] (pr-render b x) (string "Assert failed: " (string b))))) + @[{:jolt/type :symbol :ns nil :name "if"} + x + nil + @[{:jolt/type :symbol :ns nil :name "throw"} + @[{:jolt/type :symbol :ns nil :name "ex-info"} msg-form {}]]]) + # resolve stub — returns nil (symbols not found in Jolt's clojure.core) (defn core-resolve [sym] nil) @@ -2481,6 +2493,7 @@ "format" core-format "letfn" core-letfn "doseq" core-doseq + "assert" core-assert "first" core-first "rest" core-rest "next" core-next @@ -2746,7 +2759,7 @@ (defn core-macro-names "Set of core binding names that are macros." [] - @{"and" true "or" true "cond" true "case" true "for" true "when" true "when-not" true "if-let" true "when-let" true "if-some" true "when-some" true "doto" true "defn" true "defn-" true "declare" true "fn" true "let" true "loop" true "defrecord" true "defprotocol" true "extend-type" true "extend-protocol" true "extend" true "reify" true "proxy" true "definterface" true "comment" true "binding" true "lazy-seq" true "lazy-cat" true "if-not" true "when-first" true "condp" true "dotimes" true "while" true "some->" true "some->>" true "cond->" true "cond->>" true "as->" true "->" true "->>" true "letfn" true "doseq" true "delay" true}) + @{"and" true "or" true "cond" true "case" true "for" true "when" true "when-not" true "if-let" true "when-let" true "if-some" true "when-some" true "doto" true "defn" true "defn-" true "declare" true "fn" true "let" true "loop" true "defrecord" true "defprotocol" true "extend-type" true "extend-protocol" true "extend" true "reify" true "proxy" true "definterface" true "comment" true "binding" true "lazy-seq" true "lazy-cat" true "if-not" true "when-first" true "condp" true "dotimes" true "while" true "some->" true "some->>" true "cond->" true "cond->>" true "as->" true "->" true "->>" true "letfn" true "doseq" true "delay" true "assert" true}) (def init-core! (fn [& args] diff --git a/src/jolt/main.janet b/src/jolt/main.janet index 4be0dc5..cd359c1 100644 --- a/src/jolt/main.janet +++ b/src/jolt/main.janet @@ -167,7 +167,11 @@ (cond (string? err) err (and (or (table? err) (struct? err)) (= :jolt/exception (get err :jolt/type))) - (let [v (get err :value)] (if (string? v) v (string/format "%q" v))) + (err-message (get err :value)) + (and (or (table? err) (struct? err)) (= :jolt/ex-info (get err :jolt/type))) + (let [m (get err :message) d (get err :data)] + (if (and d (not (empty? d))) (string m " " (string/format "%q" d)) (string m))) + (string? err) err (string/format "%q" err))) (defn- report-error [err fib]