blob: 0a821c15a57fe0640cfdd9053dbb754283ca1a96 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
datatype si_prefix
= QUETTA | RONNA | YOTTA | ZETTA | EXA | PETA | TERA | GIGA | MEGA
| KILO | HECTO | DEKA | DECI | CENTI | MILLI | MICRO | NANO
| PICO | FEMTO | ATTO | ZEPTO | YOCTO | RONTO | QUECTO;
datatype si_function
= DIVISION | MULT;
datatype si_unit
= UNIT of string
| PREFIX of si_prefix * si_unit
| ALGEBRA of si_function * si_unit list
;
fun factor_of_prefix QUETTA = 1e30
| factor_of_prefix RONNA = 1e27
| factor_of_prefix YOTTA = 1e24
| factor_of_prefix ZETTA = 1e21
| factor_of_prefix EXA = 1e18
| factor_of_prefix PETA = 1e15
| factor_of_prefix TERA = 1e12
| factor_of_prefix GIGA = 1e9
| factor_of_prefix MEGA = 1e6
| factor_of_prefix KILO = 1e3
| factor_of_prefix HECTO = 1e2
| factor_of_prefix DEKA = 1e1
| factor_of_prefix DECI = 1e~1
| factor_of_prefix CENTI = 1e~2
| factor_of_prefix MILLI = 1e~3
| factor_of_prefix MICRO = 1e~6
| factor_of_prefix NANO = 1e~9
| factor_of_prefix PICO = 1e~12
| factor_of_prefix FEMTO = 1e~15
| factor_of_prefix ATTO = 1e~18
| factor_of_prefix ZEPTO = 1e~21
| factor_of_prefix YOCTO = 1e~24
| factor_of_prefix RONTO = 1e~27
| factor_of_prefix QUECTO = 1e~30
;
fun apply_function DIVISION (head::[]) = head
| apply_function DIVISION [] = raise Match
| apply_function DIVISION (x::y::rest)
= apply_function DIVISION (x/y::rest)
| apply_function MULT [] = 1.0
| apply_function MULT (head::[]) = head
| apply_function MULT (x::y::rest)
= apply_function MULT (x*y::rest)
;
fun car (x,y) = x;
fun cdr (x,y) = y;
fun remove_prefixes (UNIT x) = (1e0, UNIT x)
| remove_prefixes (PREFIX (prefix, the_unit))
= let val (factor, sub_unit) = remove_prefixes the_unit
in (factor * (factor_of_prefix prefix), sub_unit)
end
| remove_prefixes (ALGEBRA (function, units))
= let val returned = map remove_prefixes units;
val factors = map car returned;
val units = map cdr returned;
in
(apply_function function factors, (ALGEBRA (function, units)))
end
;
|