print-str, print-i64, print-f64, print-bytes, print-line and newline leave the prelude. print and println are the whole printing surface now, and print is the better call at every one of the sites that used them: it is the same structural walk without the newline, so the no-newline case the family was kept for is covered, and it takes the value as it is. The old print-i64 forced an explicit (i64 x) at every call site, because this language widens nothing implicitly; that cast is gone from 127 places. Dropping it moves one answer. hash-grid returns u64, and the cast through the signed printer showed sand-headless's hash as -2851001042534928384. print routes a u64 through flan_u64_to_bytes, so it now prints 15595743031174623232 — the same 64 bits, read as the unsigned number they are. The pinned expectation follows the correction. test-flan-dev.el and test_session.ml both reached for print-line as "a name the prelude has"; they reach for rand-seed instead.
84 lines
3.5 KiB
Plaintext
84 lines
3.5 KiB
Plaintext
;;;; 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-byte (bytes "banana") \a) (Some i) i None -1))
|
|
(print " ")
|
|
(print (match (index-of-byte (bytes "banana") \z) (Some i) i None -1))
|
|
(print " ")
|
|
(print (match (index-of-byte (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)
|