(require simply.scm)
(define (number-name num)
(name-triples (sub-in-names (make-triples num) namelist)))
(define (name-triples triples)
(cond
((empty? triples) '())
((number? (first triples)) (se (name-triple (first triples)) (name-triples (bf triples))))
(else (se (first triples) (name-triples (bf triples))))))
(define (make-triples num)
(cond
((empty? num) '())
((= (length num) 2) num)
((= (length num) 1) num)
(else
(se (make-triples (bl (bl (bl num)))) (last-three num)))))
(define (length num)
(if (empty? num)
0
(+ 1 (length (bf num)))))
(define (last-three wd)
(word (last (bl (bl wd))) (last (bl wd)) (last wd)))
(define (sub-in-names triples names)
(cond
((<= (length triples) 1) (se triples (first names)))
((> (length triples) 12) '(Overflow, try entering a smaller number))
(else (if (all-zeros? (last triples))
(se (sub-in-names (bl triples) (bf names)) (last triples))
(se (sub-in-names (bl triples) (bf names)) (first names) (last triples))))))
(define (name-triple triple)
(let ((fst (first triple)) (rest (bf triple)))
(cond
((= (length triple) 3)
(if (= fst 0)
(se (name-triple rest))
(se (name-single (first triple)) 'hundred (name-triple (bf triple)))))
((= (length triple) 2)
(if (= fst 0)
(se (name-single rest))
(cond
((= fst 1) (cond
((= triple 10) 'ten)
((= triple 11) 'eleven)
((= triple 12) 'twelve)
((= triple 13) 'thirteen)
((= triple 14) 'fourteen)
((= triple 15) 'fifteen)
((= triple 16) 'sixteen)
((= triple 17) 'seventeen)
((= triple 18) 'eighteen)
(else 'nineteen)))
((= fst 2) (se 'twenty (name-triple rest)))
((= fst 3) (se 'thirty (name-triple rest)))
((= fst 4) (se 'forty (name-triple rest)))
((= fst 5) (se 'fifty (name-triple rest)))
((= fst 6) (se 'sixty (name-triple rest)))
((= fst 7) (se 'seventy (name-triple rest)))
((= fst 8) (se 'eighty (name-triple rest)))
((= fst 9) (se 'ninety (name-triple rest)))
(else (se (name-triple rest))))))
(else
(name-single triple)))))
(define (name-single num)
(if empty? num) '(Whoops)
(cond
((= num 0) '())
((= num 1) 'one)
((= num 2) 'two)
((= num 3) 'three)
((= num 4) 'four)
((= num 5) 'five)
((= num 6) 'six)
((= num 7) 'seven)
((= num 8) 'eight)
(else 'eight)))
(define (name-triples triples)
(cond
((empty? triples) '())
((number? (first triples)) (se (name-triple (first triples)) (name-triples (bf triples))))
(else (se (first triples) (name-triples (bf triples))))))
(define namelist '(thousand million billion trillion quadrillion quintillion
sextillion septillion octillion nonillion decillion))
This was made back a year or so ago, and I still suck at Scheme, but here ya go anyway.
It goes up to about 10^33, and I'm using a few functions that aren't built into scheme (this was a textbook assignment, here's the list if you want to try this;
http://www.cs.berkeley.edu/~bh/ssch27/appendix-simply.html).
There's also a bug that I never bothered fixing
>(number-name 12000123)
'(twelve million thousand one hundred twenty three)
>(number-name 12010123)
'(twelve million ten thousand one hundred twenty three)
>(number-name 1231231352344135)
'(one quadrillion two hundred thirty one trillion two hundred thirty one billion three hundred fifty two
million three hundred forty four thousand one hundred thirty five)
As you can see, it has problems when all three digits of a
"triple" are zeros.