;;;; The prelude's byte predicates, parse-i64, and the two number helpers. ;;;; ;;;; The cases are chosen so a wrong implementation fails one: a prefix longer ;;;; than the string (which must answer false, not trap), the empty prefix and ;;;; the whole string as its own prefix, a prefix that matches at the wrong ;;;; end, and for parse-i64 every shape strtoll answers 0 for — "", "abc", ;;;; "12x", "-" — each of which a caller could not tell from a real 0. (defn show-bool [b bool] () (print (if b "t" "f"))) (defn main [] i32 (show-bool (bytes=? (bytes "abc") (bytes "abc"))) ; t (show-bool (bytes=? (bytes "abc") (bytes "abd"))) ; f same length (show-bool (bytes=? (bytes "abc") (bytes "ab"))) ; f prefix, not equal (show-bool (bytes=? (bytes "") (bytes ""))) ; t (println "") (show-bool (starts-with? (bytes "hello") (bytes "hel"))) ; t (show-bool (starts-with? (bytes "hello") (bytes "llo"))) ; f matches the end (show-bool (starts-with? (bytes "hi") (bytes "hiya"))) ; f longer, no trap (show-bool (starts-with? (bytes "hello") (bytes ""))) ; t (show-bool (starts-with? (bytes "hello") (bytes "hello"))) ; t (println "") (show-bool (ends-with? (bytes "hello") (bytes "llo"))) ; t (show-bool (ends-with? (bytes "hello") (bytes "hel"))) ; f matches the start (show-bool (ends-with? (bytes "hi") (bytes "hiya"))) ; f longer, no trap (show-bool (ends-with? (bytes "hello") (bytes ""))) ; t (show-bool (ends-with? (bytes "hello") (bytes "hello"))) ; t (println "") ;; First occurrence, and None for a byte that is not there. (print (match (index-of (bytes "banana") \a) (Some i) i None -1)) (print " ") (print (match (index-of (bytes "banana") \z) (Some i) i None -1)) (print " ") (print (match (index-of (bytes "") \a) (Some i) i None -1)) (println "") ;; Accepted. (print (match (parse-i64 (bytes "0")) (Some v) v None -999)) (print " ") (print (match (parse-i64 (bytes "42")) (Some v) v None -999)) (print " ") (print (match (parse-i64 (bytes "-42")) (Some v) v None -999)) (print " ") (print (match (parse-i64 (bytes "+7")) (Some v) v None -999)) (print " ") (print (match (parse-i64 (bytes "9007199254740993")) (Some v) v None -999)) (println "") ;; Refused. Each of these is a 0 out of strtoll, which is the point. (print (match (parse-i64 (bytes "")) (Some v) v None -999)) (print " ") (print (match (parse-i64 (bytes "abc")) (Some v) v None -999)) (print " ") (print (match (parse-i64 (bytes "12x")) (Some v) v None -999)) (print " ") (print (match (parse-i64 (bytes "-")) (Some v) v None -999)) (print " ") (print (match (parse-i64 (bytes " 1")) (Some v) v None -999)) (println "") (print (sign-f32 3.5)) (print " ") (print (sign-f32 -3.5)) (print " ") (print (sign-f32 0.0)) (println "") ;; t = 1.0 must return b exactly, which a + t*(b - a) does not always do. (print (lerp 0.0 10.0 0.0)) (print " ") (print (lerp 0.0 10.0 0.25)) (print " ") (print (lerp 0.0 10.0 1.0)) (print " ") (print (lerp 2.0 -2.0 0.5)) (println "") ;; The RNG ranges, off a fixed seed, so the numbers are the sequence and not ;; just "something in range". An empty range answers lo and must not divide. (rand-seed 7) (dotimes [i 5] (when (> i 0) (print " ")) (print (rand-i32-range 10 20))) (println "") (print (rand-i32-range 5 5)) (print " ") (print (rand-i32-range 5 -5)) (println "") (rand-seed 7) (dotimes [i 3] (when (> i 0) (print " ")) (print (rand-f32-range 0.0 1.0))) (println "") 0)