Proquint in Kernel, now more scheme-like added by sytse on Fri Jun 22 22:00:08 2018

;; 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)))