source: project/release/4/unitconv/trunk/unitconv.scm @ 14575

Last change on this file since 14575 was 14575, checked in by Ivan Raikov, 11 years ago

unitconv ported to Chicken 4.

File size: 21.1 KB
Line 
1;;
2;; Based on code by  Dmitry A. Kazakov  and Gordon S. Novak
3;;
4;; TODO: implement non-strict conversion (e.g. mass <-> energy, mass <-> weight)
5;;
6
7(module unitconv
8
9        (unit-factor-eval
10         (define-quantity quantity-expr-eval)
11         (define-unit unit-factor-eval)
12         make-unit-prefix
13
14         unitconv:error
15         make-quantity 
16         quantity?
17         quantity-name
18         quantity-int
19         make-unit
20         unit?
21         unit-equal?
22         unit-name
23         unit-factor
24         unit-prefix
25         unit-convert
26
27         Unity       
28         Length     
29         Time       
30         Temperature 
31         Mass       
32         Current     
33         Luminosity 
34         Substance   
35         Currency   
36         Information
37
38         ;;
39         ;; Geometry
40         ;;
41         Area
42         Volume
43
44         ;;
45         ;; Mechanics
46         ;;
47         Velocity
48         Acceleration
49         Force
50         Pressure
51         Energy
52         Power
53
54         ;;
55         ;; Electricity
56         ;;
57         Charge
58         Potential
59         Capacitance
60         Resistance
61         Conductance
62         Inductance
63
64         ;;
65         ;; Chemistry
66         ;;
67         Concentration
68         Density
69
70         ;;
71         ;; Optic
72         ;;
73         Luminance
74
75         ;;
76         ;; Other
77         ;;
78         Frequency
79
80
81         unitless
82         
83         ;; SI unit prefixes
84         yocto
85         zepto
86         atto
87         femto
88         pico
89         nano
90         micro
91         milli
92         centi
93         deci
94         deca
95         hecto
96         kilo
97         mega
98         giga
99         tera
100         peta
101         exa
102         zetta
103         yotta
104
105         ;; Time multiples
106         twelve
107         sixty
108
109         ;; Angles (dimensionless ratio)
110         radian
111         degree
112
113         ;; Units of length
114         meter
115         inch
116         foot
117         angstrom
118         parsec
119         millimeter
120         micrometer
121         micron
122
123         ;; Units of area and volume
124         square-meter
125         square-inch
126         square-micron
127         square-millimeter
128         cubic-meter
129         liter
130
131         ;; Units of mass
132         kilogram
133         gram
134         milligram
135         pound
136         slug
137         atomic-mass-unit
138
139         ;; Units of time
140         second
141         hour
142
143         ;; Units of acceleration
144         meters-per-second-squared
145
146         ;; Units of frequency
147         hertz
148
149         ;; Units of force
150         newton
151         pound-force
152
153         ;; Units of power
154         watt
155         horsepower
156
157         ;; Units of energy
158         joule
159         electron-volt
160         kilowatt-hour
161         calorie
162         erg
163         british-thermal-unit
164
165         ;; Units of current
166         ampere
167
168         ;; Units of electric charge
169         coulomb
170
171         ;; Units of electric potential
172         volt
173
174         ;; Units of resistance
175         ohm
176
177         ;; Units of capacitance
178         farad
179         microfarad
180         picofarad
181
182         ;; Units of conductance
183         siemens
184
185         ;; Units of inductance
186         henry
187         millihenry
188         microhenry
189
190         ;; Units of substance
191         mole
192
193         ;; Units of density
194         rho
195
196         ;; Units of concentration
197         molarity
198         parts-per-million
199
200         ;; Units of temperature
201         degK
202
203         ;; Units of information quantity, evidence, and information entropy
204
205         ;; bit = log_2(p)     (Shannon)
206         bit
207
208         ;; byte = 8 bits
209         byte
210
211         ;; nat = log_e(p)     (Boulton and Wallace)
212         nat
213
214         ;; ban = log_10(p)    (Hartley, Turing, and Good)
215         ban
216
217         ;; The deciban is the smallest weight of evidence discernible by a human
218         ;; deciban = 10*log_10(p)
219         deciban
220
221         ;; bits
222         kilobit
223         megabit
224         gigabit
225         terabit
226         petabit
227         exabit
228         zettabit
229         yottabit
230         kibibit
231         mebibit
232         gibibit
233         tebibit
234         pebibit
235         exbibit
236         zebibit
237         yobibit
238
239         ;; bytes
240         kilobyte
241         megabyte
242         gigabyte
243         terabyte
244         petabyte
245         exabyte
246         zettabyte
247         yottabyte
248         kibibyte
249         mebibyte
250         gibibyte
251         tebibyte
252         pebibyte
253         exbibyte
254         zebibyte
255         yobibyte
256
257         ;; bit rates
258         bits-per-second
259         kilobits-per-second
260         megabits-per-second
261         gigabits-per-second
262         terabits-per-second
263         petabits-per-second
264         exabits-per-second
265         zettabits-per-second
266         yottabits-per-second
267
268         ;; byte rates
269         bytes-per-second
270         kilobytes-per-second
271         megabytes-per-second
272         gigabytes-per-second
273         terabytes-per-second
274         petabytes-per-second
275         exabytes-per-second
276         zettabytes-per-second
277         yottabytes-per-second
278         
279         )
280       
281
282   (import scheme chicken data-structures extras srfi-4)
283
284   (require-extension datatype matchable srfi-4)       
285   (import-for-syntax matchable chicken)       
286
287(define pi 3.14159265358979)
288
289
290(define (unitconv:error x . rest)
291  (let ((port (open-output-string)))
292    (let loop ((objs (cons x rest)))
293      (if (null? objs)
294          (begin
295            (newline port)
296            (error 'unitconv (get-output-string port)))
297          (begin (display (car objs) port)
298                 (display " " port)
299                 (loop (cdr objs)))))))
300
301
302(define-record quantity name int)
303
304(define-record-printer (quantity x out)
305  (if (zero? (quantity-int x))
306      (fprintf out "#(quantity Unity)")
307      (fprintf out "#(quantity ~S ~S)"
308               (quantity-name x)
309               (quantity-int x))))
310
311
312;; The number of base quantities defined
313(define Q 9)
314
315(define dref s32vector-ref)
316
317;; The sizes of the field assigned to each base quantity; a field size
318;; of 20 allows a value range of +-9 for the power of that quantity
319(define dimsizes  (s32vector 20 20 20 10 10 10 10 10 20))
320
321;; Multipliers that can be used to move a vector value to its proper
322;; field position; defined as follows:
323;;
324;;  dimvals_{0} = 1
325;;  dimvals_{i} = dimvals_{i-1} * dimsizes_{i-1}   i > 0
326;;
327(define dimvals  (let loop ((i 1) (lst (list 1)))
328                   (if (< i Q)
329                       (let ((x  (* (car lst) (dref dimsizes (- i 1)))))
330                         (loop (+ 1 i) (cons x lst)))
331                       (list->s32vector (reverse lst)))))
332
333;; (s32vector 1 20 400 8000 80000 800000 8000000 80000000))
334
335;; A value that, when added to a dimension integer will make it
336;; positive and will bias each vector component within its field by
337;; half the size of the field; defined as:
338;;
339;;  dimbias = sum_{i=0}^{7}\frac{dimvals_{i} * dimsizes_{i}}{2}
340;;
341
342(define dimbias  (let loop ((i 0)  (sum 0))
343                   (if (< i Q)
344                       (loop (+ i 1) (+ sum (/ (* (dref dimvals i) (dref dimsizes i)) 2)))
345                       sum)))
346                       
347
348;; 444444210
349
350;; Compute a dimension integer from a dimension vector
351;;
352;; For example, the dimension integer for force can be calculated as
353;; follows:
354;;
355;; force = length * time^{-2} * mass
356;;
357;; (dimint (s32vector 1 -2 0 1 0 0 0 0))
358;; => 7961
359;;
360(define (dimint v)
361  (let loop ((i (- Q 1)) (sum 0))
362    (if (fx<= 0 i)
363        (loop (fx- i 1)  (+ sum (* (dref dimvals i) (dref v i))))
364        sum)))
365
366
367(define-syntax define-base-quantity
368  (lambda (x r c)
369    (let ((name   (cadr x))
370          (value  (caddr x))
371          (%define (r 'define)))
372      `(,%define ,name (make-quantity ',name ,value)))))
373
374
375(define-base-quantity  Unity          0)
376(define-base-quantity  Length         (dref dimvals 0))
377(define-base-quantity  Time           (dref dimvals 1))
378(define-base-quantity  Temperature    (dref dimvals 2))
379(define-base-quantity  Mass           (dref dimvals 3))
380(define-base-quantity  Current        (dref dimvals 4))
381(define-base-quantity  Luminosity     (dref dimvals 5))
382(define-base-quantity  Substance      (dref dimvals 6))
383(define-base-quantity  Currency       (dref dimvals 7))
384(define-base-quantity  Information    (dref dimvals 8))
385
386
387(define-record unit name dims factor abbrevs)
388
389(define (unit-equal? x y)
390  (and (= (quantity-int (unit-dims x)) (quantity-int (unit-dims y)))
391       (= (unit-factor x) (unit-factor y))))
392 
393(define-record-printer (unit x out)
394  (let ((dims     (unit-dims x))
395        (abbrevs  (unit-abbrevs x)))
396    (if (null? abbrevs)
397        (fprintf out "#(unit ~S " (unit-name x))
398        (fprintf out "#(unit ~S ~S " (unit-name x) (unit-abbrevs x)))
399    (fprintf out "[~S] ~S)"
400           (quantity-name (unit-dims x))
401           (unit-factor x))))
402
403(define (unit-prefix prefix u abbrevs)
404  (or (and (unit? prefix) (unit? u)) 
405      (unitconv:error 'unit-prefix ": invalid unit: " u))
406  (if (not (= 0 (quantity-int (unit-dims prefix))))
407      (unitconv:error 'unit-prefix ": prefix must be dimensionless: " prefix))
408  (if (zero? (quantity-int (unit-dims u)))
409      (unitconv:error 'unit-prefix ": unit must not be dimensionless: " u))
410  (make-unit (string->symbol
411              (string-append (symbol->string (unit-name prefix))
412                             (symbol->string (unit-name u))))
413             (unit-dims u)
414             (* (unit-factor prefix) (unit-factor u))
415             abbrevs))
416     
417
418;;
419;; Unit conversion
420;;
421(define (unit-convert src dest . vals)
422  (or (and (unit? src) (unit? dest)) 
423      (unitconv:error 'unit-convert ": invalid unit: " src dest))
424  (if (= (quantity-int (unit-dims src)) (quantity-int (unit-dims dest)))
425      (let ((f  (/ (unit-factor src) (unit-factor dest))))
426        (if (null? vals)  f
427            ((lambda (x) (if (null? (cdr x)) (car x) x)) (map (lambda (x) (* f x)) vals))))
428      (unitconv:error 'unit-convert ": given units are of different dimensions: source=" src "; dest= " dest)))
429
430
431(define-syntax quantity-expr-eval
432  (lambda (x r c)
433    (let ((expr       (cadr x))
434          (left?      (caddr x))
435          (%let       (r 'let))
436          (%cond      (r 'cond))
437          (%else      (r 'else))
438          (integer?   (r 'integer?))
439          (not        (r 'not))
440          (and        (r 'and))
441          (x1         (r 'x1))
442          (y1         (r 'y1))
443          (quantity-expr-eval    (r 'quantity-expr-eval))
444          (quantity?       (r 'quantity?))
445          (quantity-int    (r 'quantity-int)))
446         
447      (match expr 
448             ((op x y)
449              `(,%let ((,x1  (,quantity-expr-eval ,x #t))
450                       (,y1  (,quantity-expr-eval ,y ,left?)))
451                 ,(case op 
452                    ((**)    `(* ,x1 ,y1))
453                    ((*)     `(+ ,x1 ,y1))
454                    ((/)     `(- ,x1 ,y1))
455                    (else (unitconv:error 'quantity-expr-eval ": unknown quantity operation " op)))))
456             
457             (x
458              `(,%cond ((,quantity? ,x)    (,quantity-int ,x))
459                       ((,and (,not ,left?) (,integer? ,x)) ,x)
460                       ((,and ,left? (,integer? ,x))     
461                        (unitconv:error 'quantity-expr-eval 
462                                        "integers are not allowed as the left operand of quantity expression"))
463                       (,%else  (unitconv:error 'quantity-expr-eval ": unknown quantity " ,x))))))))
464         
465 
466
467(define-syntax define-quantity
468  (lambda (x r c)
469    (let ((name (cadr x))
470          (expr (caddr x))
471          (%define (r 'define))
472          (make-quantity (r 'make-quantity))
473          (quantity-expr-eval (r 'quantity-expr-eval)))
474      `(,%define ,name (,make-quantity ',name (,quantity-expr-eval ,expr #f))))))
475
476
477(define-for-syntax (binop-fold op lst)
478  (if (null? lst) lst
479      (match lst
480             ((x)   x)
481             ((x y) `(,op ,x ,y))
482             ((x y . rest) `(,op (,op ,x ,y) ,(binop-fold op rest)))
483             ((x . rest) `(,op ,x ,(binop-fold op rest))))))
484
485
486(define-syntax unit-factor-eval
487  (lambda (x r c)
488    (let ((expr (cadr x))
489          (%let       (r 'let))
490          (%cond      (r 'cond))
491          (%else      (r 'else))
492          (x1         (r 'x1))
493          (y1         (r 'y1))
494          (unit?        (r 'unit?))
495          (unit-factor  (r 'unit-factor))
496          (number?      (r 'number?)))
497      (match expr 
498             ((op x y) 
499              `(,%let ((,x1  (unit-factor-eval ,x))
500                       (,y1  (unit-factor-eval ,y)))
501                 ,(case op 
502                    ((*)     `(* ,x1 ,y1))
503                    ((/)     `(/ ,x1 ,y1))
504                    (else (unitconv:error 'unit-factor-eval ": unknown unit factor operation " op)))))
505             
506             ((op x . y) 
507              `(unit-factor-eval ,(binop-fold op (cons x y))))
508             
509             (x         `(cond ((,unit? ,x)   
510                                (,unit-factor ,x))
511                               ((,number? ,x)  ,x)
512                               (else  (unitconv:error 'unit-factor-eval ": unknown unit " ,x))))))))
513         
514 
515
516(define-syntax define-unit
517  (lambda (x r c)
518    (let ((name (cadr x))
519          (dims (caddr x))
520          (factor (cadddr x))
521          (abbrevs (cddddr x))
522          (%define (r 'define)))
523      `(,%define ,name (make-unit ',name ,dims (unit-factor-eval ,factor) ',abbrevs)))))
524
525
526(define-syntax make-unit-prefix
527  (lambda (x r c)
528    (let ((prefix (cadr x))
529          (unit (caddr x))
530          (abbrevs (cdddr x)))
531      `(unit-prefix ,prefix ,unit ',abbrevs))))
532
533
534;;
535;; Geometry
536;;
537(define-quantity   Area     (** Length 2))
538(define-quantity   Volume   (** Length 3))
539
540;;
541;; Mechanics
542;;
543(define-quantity   Velocity      (/ Length Time))
544(define-quantity   Acceleration  (/ Length (** Time 2)))
545(define-quantity   Force         (* Mass Acceleration))
546(define-quantity   Pressure      (/ Force Area))
547(define-quantity   Energy        (* Force Length))
548(define-quantity   Power         (/ Energy Time))
549
550;;
551;; Electricity
552;;
553(define-quantity   Charge         (* Current Time))
554(define-quantity   Potential      (/ Energy Charge))
555(define-quantity   Capacitance    (/ Charge Potential))
556(define-quantity   Resistance     (/ Potential Current))
557(define-quantity   Conductance    (/ Current Potential))
558(define-quantity   Inductance     (/ (* Potential Time) Current))
559
560;;
561;; Chemistry
562;;
563(define-quantity   Concentration  (/ Substance Volume))
564(define-quantity   Density        (/ Mass Volume))
565
566;;
567;; Optic
568;;
569(define-quantity    Luminance     (/ Luminosity Area))
570
571;;
572;; Other
573;;
574(define-quantity    Frequency     (/ Unity Time))
575
576;;
577;; Information
578;;
579(define-quantity    Rate          (/ Information Time))
580
581
582(define-unit unitless Unity 1.0)
583       
584;; SI unit prefixes
585(define-unit yocto  Unity 1.0e-24)
586(define-unit zepto  Unity 1.0e-21)
587(define-unit atto   Unity 1.0e-18)
588(define-unit femto  Unity 1.0e-15)
589(define-unit pico   Unity 1.0e-12)
590(define-unit nano   Unity 1.0e-9)
591(define-unit micro  Unity 1.0e-6)
592(define-unit milli  Unity 1.0e-3)
593(define-unit centi  Unity 1.0e-2)
594(define-unit deci   Unity 1.0e-1)
595(define-unit deca   Unity  1.0e1)
596(define-unit hecto  Unity  1.0e2)
597(define-unit kilo   Unity  1.0e3)
598(define-unit mega   Unity  1.0e6)
599(define-unit giga   Unity  1.0e9)
600(define-unit tera   Unity  1.0e12)
601(define-unit peta   Unity  1.0e15)
602(define-unit exa    Unity  1.0e18)
603(define-unit zetta  Unity  1.0e21)
604(define-unit yotta  Unity  1.0e24)
605
606;; IEC standard prefixes
607(define-unit kibi   Unity  1024)
608(define-unit mebi   Unity  1048576)
609(define-unit gibi   Unity  1073741824)
610(define-unit tebi   Unity  1099511627776)
611(define-unit pebi   Unity  1125899906842624)
612(define-unit exbi   Unity  1152921504606846976)
613(define-unit zebi   Unity  1180591620717411303424)
614(define-unit yobi   Unity  1208925819614629174706176)
615
616;; Time multiples
617(define-unit twelve Unity 12)
618(define-unit sixty  Unity 60)
619
620;; Angles (dimensionless ratio)
621(define-unit radian    Unity  1.0  rad radians)
622(define-unit degree    Unity  (/ pi 180)  deg degrees)
623
624;; Units of length
625(define-unit meter     Length 1.0       m meters)
626(define-unit inch      Length 0.0254    in inches)
627(define-unit foot      Length 0.3048    ft feet)
628(define-unit angstrom  Length 1.0e-10   ang angstroms)
629(define-unit parsec    Length 3.083e16  parsecs)
630(define millimeter     (make-unit-prefix  milli meter mm millimeters))
631(define micrometer     (make-unit-prefix  micro meter um micron microns micrometers))
632(define micron         micrometer)
633
634;; Units of area and volume
635(define-unit square-meter  Area (* meter meter) m^2 m2 meter-squared meters-squared square-meters)
636(define-unit square-inch   Area  (* inch inch) in^2 inch-squared inches-squared square-inches)
637(define-unit square-micron Area (* micrometer micrometer) um^2 micrometer-squared
638                                micrometers-squared micron-squared microns-squared square-microns)
639(define-unit square-millimeter Area (* millimeter millimeter) mm^2 millimeter-squared millimeters-squared
640                                                              square-millimeters)
641
642(define-unit cubic-meter   Volume  (* meter (* meter meter)) m^3 meter-cubed meters-cubed cubic-meters )
643(define-unit liter         Volume  (* 0.001 cubic-meter) L litre liters)
644
645;; Units of mass
646(define-unit kilogram     Mass  1.0       kg kilograms)
647(define-unit gram         Mass  1e-3      g grams)
648(define milligram         (make-unit-prefix  milli gram mg milligrams))
649(define-unit pound        Mass  (* gram 453.59237) lb pounds)
650(define-unit slug         Mass  (* pound 32.17405) slugs)
651(define-unit atomic-mass-unit Mass 1.6605402e-27 amu atomic-mass-units)
652
653;; Units of time
654(define-unit second       Time  1.0       s seconds)
655(define-unit hour         Time  (* sixty (* sixty second)) h hrs hours)
656
657;; Units of acceleration
658(define-unit meters-per-second-squared Acceleration (/ meter (* second second)) m/s2 m/s^2 m/sec2 m/sec^2)
659
660;; Units of frequency
661(define-unit hertz Frequency 1.0 hz)
662
663;; Units of force
664(define-unit newton       Force (/ (* kilogram meter) (* second second)) nt newtons)
665(define-unit pound-force  Force (/ (* slug foot) (* second second)) lbf)
666
667
668;; Units of power
669(define-unit watt         Power (/ (* kilogram meter meter)
670                                   (* second second second))  W watts)
671(define-unit horsepower   Power (* 550 (/ (* foot pound-force) second)) hp)
672
673;; Units of energy
674(define-unit joule Energy  (* newton meter) J joules)
675(define-unit electron-volt Energy  (* 1.60217733e-19 joule) ev electron-volts)
676(define-unit kilowatt-hour Energy  (* kilo (* watt hour)) kwh kilowatt-hours)
677(define-unit calorie       Energy  (* 4.184 joule) cal calories)
678(define-unit erg           Energy  (* 1.0e-7 joule) ergs)
679(define-unit british-thermal-unit Energy (* 1055.056 joule) btu btus)
680
681;; Units of current
682(define-unit ampere  Current 1.0 A amp amps amperes)
683
684;; Units of electric charge
685(define-unit coulomb Charge  (* ampere second) C coulombs)
686
687;; Units of electric potential
688(define-unit volt Potential  (/ (* kilogram meter meter)
689                                (* ampere second second second)) V volts)
690
691;; Units of resistance
692(define-unit ohm Resistance  (/ volt ampere) ohms)
693
694;; Units of capacitance
695(define-unit farad Capacitance  (/ coulomb volt) F farads)
696(define microfarad (make-unit-prefix micro farad uF microfarads))
697(define picofarad  (make-unit-prefix pico farad pF picofarads))
698
699;; Units of conductance
700(define-unit siemens Conductance (/ ampere volt) S mho)
701
702;; Units of inductance
703(define-unit henry Inductance  (/ (* meter meter kilogram)
704                                  (* ampere ampere second second)) H)
705(define millihenry (make-unit-prefix milli henry mH))
706(define microhenry (make-unit-prefix micro henry uH))
707
708;; Units of substance
709(define-unit mole Substance 1.0 mol moles)
710
711;; Units of density
712(define-unit rho Density (/ kilogram cubic-meter))
713
714;; Units of concentration
715(define-unit molarity Concentration (/ mole liter) M mol/L)
716(define-unit parts-per-million Concentration (/ milligram kilogram) ppm)
717
718;; Units of temperature
719(define-unit degK       Temperature  1.0       K)
720
721;; Units of information quantity, evidence, and information entropy
722
723;; bit = log_2(p)     (Shannon)
724(define-unit bit      Information  1                 b bits
725  shannon shannons Sh)
726
727;; byte = 8 bits
728(define-unit byte     Information  8                 B bytes)
729
730;; nat = log_e(p)     (Boulton and Wallace)
731(define-unit nat      Information  1.44269504088896  nats
732  nit nits
733  nepit nepits)
734
735;; ban = log_10(p)    (Hartley, Turing, and Good)
736(define-unit ban      Information  3.32192809488736  bans
737  hartley hartleys
738  Hart Harts
739  dit dits)
740
741;; The deciban is the smallest weight of evidence discernible by a human
742;; deciban = 10*log_10(p)
743(define-unit deciban  Information  (/ ban 10)        db decibans)
744
745;; bits
746(define kilobit   (make-unit-prefix kilo  bit   kb kilobits))
747(define megabit   (make-unit-prefix mega  bit   Mb megabits))
748(define gigabit   (make-unit-prefix giga  bit   Gb gigabits))
749(define terabit   (make-unit-prefix tera  bit   Tb terabits))
750(define petabit   (make-unit-prefix peta  bit   Pb petabits))
751(define exabit    (make-unit-prefix exa   bit   Eb exabits))
752(define zettabit  (make-unit-prefix zetta bit   Zb zettabits))
753(define yottabit  (make-unit-prefix yotta bit   Yb yottabits))
754(define kibibit   (make-unit-prefix kibi  bit   Kib kibibits))
755(define mebibit   (make-unit-prefix mebi  bit   Mib mebibits))
756(define gibibit   (make-unit-prefix gibi  bit   Gib gibibits))
757(define tebibit   (make-unit-prefix tebi  bit   Tib tebibits))
758(define pebibit   (make-unit-prefix pebi  bit   Pib pebibits))
759(define exbibit   (make-unit-prefix exbi  bit   Eib exbibits))
760(define zebibit   (make-unit-prefix zebi  bit   Zib zebibits))
761(define yobibit   (make-unit-prefix yobi  bit   Yib yobibits))
762
763;; bytes
764(define kilobyte  (make-unit-prefix kilo  byte  kB kilobytes))
765(define megabyte  (make-unit-prefix mega  byte  MB megabytes))
766(define gigabyte  (make-unit-prefix giga  byte  GB gigabytes))
767(define terabyte  (make-unit-prefix tera  byte  TB terabytes))
768(define petabyte  (make-unit-prefix peta  byte  PB petabytes))
769(define exabyte   (make-unit-prefix exa   byte  EB exabytes))
770(define zettabyte (make-unit-prefix zetta byte  ZB zettabytes))
771(define yottabyte (make-unit-prefix yotta byte  YB yottabytes))
772(define kibibyte  (make-unit-prefix kibi  byte  KiB kibibytes))
773(define mebibyte  (make-unit-prefix mebi  byte  MiB mebibytes))
774(define gibibyte  (make-unit-prefix gibi  byte  GiB gibibytes))
775(define tebibyte  (make-unit-prefix tebi  byte  TiB tebibytes))
776(define pebibyte  (make-unit-prefix pebi  byte  PiB pebibytes))
777(define exbibyte  (make-unit-prefix exbi  byte  EiB exbibytes))
778(define zebibyte  (make-unit-prefix zebi  byte  ZiB zebibytes))
779(define yobibyte  (make-unit-prefix yobi  byte  YiB yobibytes))
780
781;; bit rates
782(define-unit       bits-per-second  Rate  (/ bit       second)  bps)
783(define-unit   kilobits-per-second  Rate  (/ kilobit   second)  kbps)
784(define-unit   megabits-per-second  Rate  (/ megabit   second)  Mbps)
785(define-unit   gigabits-per-second  Rate  (/ gigabit   second)  Gbps)
786(define-unit   terabits-per-second  Rate  (/ terabit   second)  Tbps)
787(define-unit   petabits-per-second  Rate  (/ petabit   second)  Pbps)
788(define-unit    exabits-per-second  Rate  (/ exabit    second)  Ebps)
789(define-unit  zettabits-per-second  Rate  (/ zettabit  second)  Zbps)
790(define-unit  yottabits-per-second  Rate  (/ yottabit  second)  Ybps)
791
792;; byte rates
793(define-unit      bytes-per-second  Rate  (/ byte      second)  Bps)
794(define-unit  kilobytes-per-second  Rate  (/ kilobyte  second)  kBps)
795(define-unit  megabytes-per-second  Rate  (/ megabyte  second)  MBps)
796(define-unit  gigabytes-per-second  Rate  (/ gigabyte  second)  GBps)
797(define-unit  terabytes-per-second  Rate  (/ terabyte  second)  TBps)
798(define-unit  petabytes-per-second  Rate  (/ petabyte  second)  PBps)
799(define-unit   exabytes-per-second  Rate  (/ exabyte   second)  EBps)
800(define-unit zettabytes-per-second  Rate  (/ zettabyte second)  ZBps)
801(define-unit yottabytes-per-second  Rate  (/ yottabyte second)  YBps)
802
803)
Note: See TracBrowser for help on using the repository browser.