Proquint in Kernel added by sytse on Fri Jun 22 21:45:02 2018

;; https://arxiv.org/html/0901.4016
($define! ip
  ((a b c d)
    (+ d (* #x100 (+ c (* #x100 (+ b (* #x100 a))))))))

($define! proquint
  ($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")))
    ((number)
      ($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)))