;; ============================================================
;; R4RS-Compatible Dice Code System (Proper Lists Only)
;; Two user-facing functions:
;; (encode->dice "ABC123")
;; (dice->binary '(D1 D2 D13))
;; ============================================================
;; ------------------------------------------------------------
;; 1. Proper list: character → dice code
;; ------------------------------------------------------------
define.. char->dice '(
1.D11 2.D12 3.D13 4.D14 5.D15 6.D16
7.D21 8.D22 9.D23 0.D24 A.D25 B.D26
C.D31 D.D32 E.D33 F.D34 G.D35 H.D36
I.D41 J.D42 K.D43 L.D44 M.D45 N.D46
O.D51 P.D52 Q.D53 R.D54 S.D55 T.D56
U.D61 V.D62 W.D63 X.D64 Y.D65 Z.D66)
;; ------------------------------------------------------------
;; 2. Proper list: dice code → binary string
;; ------------------------------------------------------------
define.. dice->bin '(
D11."000000" D12."000001" D13."00001" D14."00010" D15."000110" D16."000111"
D21."001000" D22."001001" D23."00101" D24."00110" D25."001110" D26."001111"
D31."01000" D32."01001" D33."0101" D34."0110" D35."01110" D36."01111"
D41."10000" D42."10001" D43."1001" D44."1010" D45."10110" D46."10111"
D51."110000" D52."110001" D53."11001" D54."11010" D55."110110" D56."110111"
D61."111000" D62."111001" D63."11101" D64."11110" D65."111110" D66."111111")
;; ------------------------------------------------------------
;; Utility: lookup in a proper-list association list
;; Each entry is (key value), not (key . value)
;; ------------------------------------------------------------
define.. [lookup key alist
let..(
[p [assoc key alist
)
or..
and..p [cadr p
;; second element of the list
[error "No mapping for key" key
;; ------------------------------------------------------------
;; USER-FACING FUNCTION 1:
;; Convert letters/digits → dice code list
;; ------------------------------------------------------------
define.. [encode->dice str
map.. lambda.. (ch) [lookup ch char->dice
[string->list str
;; ------------------------------------------------------------
;; USER-FACING FUNCTION 2:
;; Convert dice code list → binary string
;; ------------------------------------------------------------
define.. [dice->binary dice-list
apply.. string-append
map.. lambda.. (d) [lookup d dice->bin
dice-list
;; ------------------------------------------------------------
;; Example:
;; (encode->dice "ZEL")
;; → (D66 D33 D44)
;;
;; (dice->binary '(D66 D33 D44))
;; → "11111101011010"
;; ------------------------------------------------------------
define.. [rotate2-right s
let*..(
[len [string-length s
[first2 [substring s 0 2
[rest [substring s 2 len
)
[string-append rest first2