; ASCII text literal construction belongs to the Bel bootstrap compiler. ; Runtime inputs and interned symbol names may contain any Unicode scalar. (def wasm-text-char (c) (if (id c \tab) "(i32.const 74)" (id c \lf) "(i32.const 82)" (id c \cr) "(i32.const 106)" (id c \sp) "(i32.const 258)" (id c \!) "(i32.const 266)" (id c \") "(i32.const 274)" (id c \#) "(i32.const 282)" (id c \$) "(i32.const 290)" (id c \%) "(i32.const 298)" (id c \&) "(i32.const 306)" (id c \') "(i32.const 314)" (id c \() "(i32.const 322)" (id c \)) "(i32.const 330)" (id c \*) "(i32.const 338)" (id c \+) "(i32.const 346)" (id c \,) "(i32.const 354)" (id c \-) "(i32.const 362)" (id c \.) "(i32.const 370)" (id c \/) "(i32.const 378)" (id c \0) "(i32.const 386)" (id c \1) "(i32.const 394)" (id c \2) "(i32.const 402)" (id c \3) "(i32.const 410)" (id c \4) "(i32.const 418)" (id c \5) "(i32.const 426)" (id c \6) "(i32.const 434)" (id c \7) "(i32.const 442)" (id c \8) "(i32.const 450)" (id c \9) "(i32.const 458)" (id c \:) "(i32.const 466)" (id c \;) "(i32.const 474)" (id c \<) "(i32.const 482)" (id c \=) "(i32.const 490)" (id c \>) "(i32.const 498)" (id c \?) "(i32.const 506)" (id c \@) "(i32.const 514)" (id c \A) "(i32.const 522)" (id c \B) "(i32.const 530)" (id c \C) "(i32.const 538)" (id c \D) "(i32.const 546)" (id c \E) "(i32.const 554)" (id c \F) "(i32.const 562)" (id c \G) "(i32.const 570)" (id c \H) "(i32.const 578)" (id c \I) "(i32.const 586)" (id c \J) "(i32.const 594)" (id c \K) "(i32.const 602)" (id c \L) "(i32.const 610)" (id c \M) "(i32.const 618)" (id c \N) "(i32.const 626)" (id c \O) "(i32.const 634)" (id c \P) "(i32.const 642)" (id c \Q) "(i32.const 650)" (id c \R) "(i32.const 658)" (id c \S) "(i32.const 666)" (id c \T) "(i32.const 674)" (id c \U) "(i32.const 682)" (id c \V) "(i32.const 690)" (id c \W) "(i32.const 698)" (id c \X) "(i32.const 706)" (id c \Y) "(i32.const 714)" (id c \Z) "(i32.const 722)" (id c \[) "(i32.const 730)" (id c \\) "(i32.const 738)" (id c \]) "(i32.const 746)" (id c \^) "(i32.const 754)" (id c \_) "(i32.const 762)" (id c \`) "(i32.const 770)" (id c \a) "(i32.const 778)" (id c \b) "(i32.const 786)" (id c \c) "(i32.const 794)" (id c \d) "(i32.const 802)" (id c \e) "(i32.const 810)" (id c \f) "(i32.const 818)" (id c \g) "(i32.const 826)" (id c \h) "(i32.const 834)" (id c \i) "(i32.const 842)" (id c \j) "(i32.const 850)" (id c \k) "(i32.const 858)" (id c \l) "(i32.const 866)" (id c \m) "(i32.const 874)" (id c \n) "(i32.const 882)" (id c \o) "(i32.const 890)" (id c \p) "(i32.const 898)" (id c \q) "(i32.const 906)" (id c \r) "(i32.const 914)" (id c \s) "(i32.const 922)" (id c \t) "(i32.const 930)" (id c \u) "(i32.const 938)" (id c \v) "(i32.const 946)" (id c \w) "(i32.const 954)" (id c \x) "(i32.const 962)" (id c \y) "(i32.const 970)" (id c \z) "(i32.const 978)" (id c \{) "(i32.const 986)" (id c \|) "(i32.const 994)" (id c \}) "(i32.const 1002)" (id c \~) "(i32.const 1010)" (wasm-reject))) (def wasm-text-build (text) (if text (list "(call $join " (wasm-text-char (car text)) " " (wasm-text-build (cdr text)) ")") "(i32.const 0)")) (def wasm-text-reserved () (list (list "(drop (call $register (i32.const 0) " (wasm-text-build "nil") "))") (list "(drop (call $register (i32.const 1) " (wasm-text-build "t") "))") (list "(drop (call $register (i32.const 9) " (wasm-text-build "pair") "))") (list "(drop (call $register (i32.const 17) " (wasm-text-build "symbol") "))") (list "(drop (call $register (i32.const 25) " (wasm-text-build "char") "))") )) ; Check literal character lists with primitive type/id, avoiding the general ; published structural-equality helpers in this bootstrap traversal. (def wasm-text-string (x) (if (id x nil) t (if (id (type x) 'pair) (if (id (type (car x)) 'char) (wasm-text-string (cdr x)) nil) nil)))