From 5c32d32f245f7407316467b5da097550e5e925b8 Mon Sep 17 00:00:00 2001 From: Scott Richmond Date: Sun, 14 Jul 2024 13:48:47 -0400 Subject: [PATCH] add `chars` to prelude --- prelude.ld | 14 ++++++++++++++ src/base.janet | 17 +++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/prelude.ld b/prelude.ld index 28ad049..211726f 100644 --- a/prelude.ld +++ b/prelude.ld @@ -386,6 +386,19 @@ fn downcase { (str as :string) -> base :downcase (str) } +fn chars { + "Takes a string and returns its characters as a list. Works only for strings with only ascii characters. Panics on any non-ascii characters." + (str as :string) -> match base :chars (str) { + (:ok, chrs) -> chrs + (:err, msg) -> panic! msg + } +} + +fn chars/safe { + "Takes a string and returns its characters as a list, wrapped in a result tuple. Works only for strings with only ascii characters. Returns an error tuple on any non-ascii characters." + (str as :string) -> base :chars (str) +} + fn ws? { "Tells if a string is a whitespace character." (" ") -> true @@ -1386,6 +1399,7 @@ pkg Prelude { box? & boxes butlast & lists strings tuples ceil & math + chars & strings clear! & turtles coll? & dicts lists sets tuples colors & turtles diff --git a/src/base.janet b/src/base.janet index c026c07..93cd89a 100644 --- a/src/base.janet +++ b/src/base.janet @@ -235,6 +235,19 @@ (defn mod [x y] (% x y)) +(defn- byte->ascii [c i] + (if (< c 128) + (string/from-bytes c) + (error (string "non-ASCII character at index" i)))) + +(defn chars [str] + (def out @[]) + (try + (for i 0 (length str) + (array/push out (byte->ascii (str i) i))) + ([e] (break [:err e]))) + [:ok out]) + (def ctx { "add" + "and" ludus/and @@ -243,6 +256,7 @@ "atan_2" math/atan2 "bool" bool "ceil" math/ceil + "chars" chars "concat" concat "conj!" conj! "conj" conj @@ -298,10 +312,9 @@ "upcase" string/ascii-upper }) -(def base (let [b @{}] +(def base (let [b @{:^type :dict}] (each [k v] (pairs ctx) (set (b (keyword k)) v)) b)) -(set (base :^type) :dict)