95 lines
2.2 KiB
Text
95 lines
2.2 KiB
Text
#!/usr/local/bin/shale
|
|
|
|
maths library
|
|
|
|
0 ones:: dup var "zero" =
|
|
1 ones:: dup var "one" =
|
|
2 ones:: dup var "two" =
|
|
3 ones:: dup var "three" =
|
|
4 ones:: dup var "four" =
|
|
5 ones:: dup var "five" =
|
|
6 ones:: dup var "six" =
|
|
7 ones:: dup var "seven" =
|
|
8 ones:: dup var "eight" =
|
|
9 ones:: dup var "nine" =
|
|
10 teens:: dup var "ten" =
|
|
11 teens:: dup var "eleven" =
|
|
12 teens:: dup var "twelve" =
|
|
13 teens:: dup var "thirteen" =
|
|
14 teens:: dup var "fourteen" =
|
|
15 teens:: dup var "fifteen" =
|
|
16 teens:: dup var "sixteen" =
|
|
17 teens:: dup var "seventeen" =
|
|
18 teens:: dup var "eighteen" =
|
|
19 teens:: dup var "nineteen" =
|
|
2 tens:: dup var "twenty" =
|
|
3 tens:: dup var "thirty" =
|
|
4 tens:: dup var "forty" =
|
|
5 tens:: dup var "fifty" =
|
|
6 tens:: dup var "sixty" =
|
|
7 tens:: dup var "seventy" =
|
|
8 tens:: dup var "eighty" =
|
|
9 tens:: dup var "ninety" =
|
|
|
|
say dup var {
|
|
commaFlag dup var swap =
|
|
andFlag dup var swap =
|
|
n dup var swap =
|
|
h dup var n 100 / =
|
|
t dup var n 100 % =
|
|
o dup var n 10 % =
|
|
|
|
h 0 > {
|
|
commaFlag { "," print commaFlag false = } ifthen
|
|
h.value ones:: " %s hundred" printf
|
|
} ifthen
|
|
|
|
h 0 > t 0 > and t 0 > andFlag and or { " and" print commaFlag false = } ifthen
|
|
|
|
t 9 > {
|
|
t 19 > {
|
|
commaFlag { "," print commaFlag false = } ifthen
|
|
t 10 / tens:: " %s" printf
|
|
o 0 > { o.value ones:: "-%s" printf } ifthen
|
|
} {
|
|
t 9 > { commaFlag { "," print } ifthen t.value teens:: " %s" printf } ifthen
|
|
} if
|
|
} {
|
|
o 0 > { commaFlag { "," print } ifthen o.value ones:: " %s" printf } ifthen
|
|
} if
|
|
} =
|
|
|
|
speak dup var {
|
|
n dup var swap =
|
|
m dup var n 1000000 / =
|
|
t dup var n 1000 / 1000 % =
|
|
h dup var n 1000 % =
|
|
|
|
n "%10d ->" printf
|
|
m 0 > { m.value false false say() " million" print } ifthen
|
|
t 0 > { t.value false m 0 > say() " thousand" print } ifthen
|
|
h 0 > m 0 == t 0 == and or { h.value m 0 > t 0 > or dup say() } ifthen
|
|
"" println
|
|
} =
|
|
|
|
"Stock numbers" println
|
|
1 speak()
|
|
10 speak()
|
|
100 speak()
|
|
1000 speak()
|
|
1001 speak()
|
|
100001000 speak()
|
|
100001001 speak()
|
|
123456789 speak()
|
|
987654321 speak()
|
|
100200300 speak()
|
|
10020030 speak()
|
|
|
|
"" println
|
|
"Randomly generated numbers" println
|
|
i var
|
|
i 0 =
|
|
{ i 10 < } {
|
|
random maths::() 1000000000 % speak() // Cap it to less than 1 billion.
|
|
i++
|
|
} while
|