diff --git a/prelude.ld b/prelude.ld index 584f960..4df1a83 100644 --- a/prelude.ld +++ b/prelude.ld @@ -339,6 +339,29 @@ fn join { ) } +fn split { + "Takes a string, and turns it into a list of strings, breaking on the separator." + (str as :string, break as :string) -> base :split (break, str) +} + +fn trim { + "Trims whitespace from a string. Takes an optional argument, `:left` or `:right`, to trim only on the left or right." + (str as :string) -> base :trim (str) + (str as :string, :left) -> base :triml (str) + (str as :string, :right) -> base :trimr (str) +} + +fn upcase { + "Takes a string and returns it in all uppercase. Works only for ascii characters." + (str as :string) -> base :upcase (str) +} + +fn downcase { + "Takes a string and returns it in all lowercase. Works only for ascii characters." + (str as :string) -> base :downcase (str) +} + + & in another prelude, with a better actual base language than Java (thanks, Rich), counting strings would be reasonable but complex: count/bytes, count/points, count/glyphs. Java's UTF16 strings make this unweildy. & TODO: add trim, trim/left, trim/right; pad/left, pad/right @@ -618,6 +641,8 @@ fn slice { base :into ([], slice) } } + (str as :string, end as :number) -> base :str_slice (str, 0, end) + (str as :string, start as :number, end as :number) -> base :str_slice (str, start, end) } &&& keywords: funny names @@ -1326,6 +1351,7 @@ pkg Prelude { div/0 div/safe doc! + downcase each! empty? eq? @@ -1413,6 +1439,7 @@ pkg Prelude { slice some some? + split square store! string @@ -1421,6 +1448,7 @@ pkg Prelude { sum_of_squares tan tau + trim tuple? turn/deg turn/rad @@ -1431,6 +1459,7 @@ pkg Prelude { unbox unwrap! unwrap_or + upcase update update! values diff --git a/src/base.janet b/src/base.janet index c48b195..f5a8352 100644 --- a/src/base.janet +++ b/src/base.janet @@ -281,6 +281,13 @@ "range" range "unbox" unbox "store!" store! + "split" string/split + "upcase" string/ascii-upper + "downcase" string/ascii-lower + "trim" string/trim + "trimr" string/trimr + "triml" string/triml + "str_slice" string/slice }) (def base (let [b @{}] diff --git a/src/ludus.janet b/src/ludus.janet index 428fd41..561dd5f 100644 --- a/src/ludus.janet +++ b/src/ludus.janet @@ -36,7 +36,7 @@ # (set (out :errors) (validated :errors)) (each err (validated :errors) (e/validation-error err)) - (break out)) + (break (-> out j/encode string))) (setdyn :out console) (try (set result (i/interpret (parsed :ast) ctx)) @@ -55,6 +55,13 @@ # (comment (do -(-> (ludus ` -doc! (mod) -`))) +(def source `let foo = foo bar baz`) +(def out (-> source + ludus + j/decode)) +(def console (out "console")) +(print console) +(def result (out "result")) +(print result) +) + diff --git a/src/scanner.janet b/src/scanner.janet index da7323b..b7371cd 100644 --- a/src/scanner.janet +++ b/src/scanner.janet @@ -202,7 +202,7 @@ "{" (recur (advance scanner) (buffer/push buff char) true) # allow multiline strings "\n" (recur (update (advance scanner) :line inc) (buffer/push buff char) interpolate?) - "\"" (add-token (advance scanner) (if interpolate? :interpolated :string)(string buff)) + "\"" (add-token (advance scanner) (if interpolate? :interpolated :string) (string buff)) "\\" (let [next (next-char scanner)] (if (= next "{") (do