;; https://arxiv.org/html/0901.4016
($define! $define!
($vau (definee . rest) env
($if (symbol? definee)
(eval (cons* $set! env definee rest) env)
($let (((name . arguments) definee))
(eval (list $set! env name
(cons* $λ arguments rest))
env)))))
($define! (ip a b c d)
(+ d (* #x100 (+ c (* #x100 (+ b (* #x100 a)))))))
($define! (proquint number)
($let* ((fn ($λ (chars)
($let ((modulus (string-length chars)))
($λ (k)
($λ (in out)
($let (((quo idx) (truncate/ in modulus)))
(k quo (cons (string-ref chars idx) out))))))))
(consonant (fn "bdfghjklmnprstvz"))
(vowel (fn "aiou")))
($let loop ((number number)
(out ()))
($let* ((do-rest
($λ (in out)
($if (zero? in)
(list->string out)
(loop in (cons #\- out)))))
(do-word
(consonant (vowel (consonant (vowel (consonant do-rest)))))))
(do-word number out)))))
(list (proquint (ip 127 0 0 1))
(proquint (ip 63 84 220 193))
(proquint (ip 63 118 7 35)))