forth/yuko.fs

272 lines
9.5 KiB
Forth
Executable File

\ yuko.fs -- YUnit KOnverter
\ +JMJ 2013-2014 David Meyer <papa@sdf.org>
\ help-yuko -- Print module help text.
: help-yuko ( -- )
\ ---------1---------2---------3---------4---------5---------6---------7
cr ." YUKO -- YUnit KOnverter"
cr ." YUKO is a Forth module that provides functions for converting between"
cr ." various units of measurement. Most functions take the number of"
cr ." source units of a given quantity as an unsigned integer from the top"
cr ." of the stack and returns the equivalent number of target units."
cr ." Temperature functions take input and output as signed integers."
cr ." See also: HELP-YUKO-LENGTH, HELP-YUKO-MASS, HELP-YUKO-TEMP,"
cr ." HELP-YUKO-TIME, HELP-YUKO-VOLUME, HELP-YUKO-PRICE"
cr
;
\ help-yuko-length -- Print help for length/distance conversions.
: help-yuko-length ( -- )
\ ---------1---------2---------3---------4---------5---------6---------7
cr ." YUKO LENGTH/DISTANCE CONVERSIONS"
cr ." Units: foot (ft), inch (in), kilometer (km), meter (m), mile (mi),"
cr ." millimeter (mm)"
cr ." Conversions: ft>in ft>km ft>m ft>mi ft>mm in>ft in>km in>m in>mi"
cr ." in>mm km>ft km>in km>m km>mi km>mm m>ft m>in m>km m>mi m>mm mi>ft"
cr ." mi>in mi>km mi>m mi>mm mm>ft mm>in mm>km mm>m mm>mi"
cr
;
\ help-yuko-mass -- Print help for mass/weight conversions.
: help-yuko-mass ( -- )
\ ---------1---------2---------3---------4---------5---------6---------7
cr ." YUKO MASS/WEIGHT CONVERSIONS"
cr ." Units: gram (g), kilogram (kg), ounce (oz), pound (lb),"
cr ." troy ounce (ozt)
cr ." Conversions: kg>lb kg>g lb>oz kg>oz g>oz lb>g lb>kg g>kg oz>lb oz>kg"
cr ." oz>g g>lb ozt>g g>ozt"
cr
;
\ help-yuko-temp -- Print help for temperature conversions.
: help-yuko-temp ( -- )
\ ---------1---------2---------3---------4---------5---------6---------7
cr ." YUKO TEMPERATURE CONVERSIONS"
cr ." (Input and output in signed integers.)"
cr ." Units: Celsius degrees (c), Fahrenheit degrees (f)"
cr ." Conversions: c>f f>c"
cr
;
\ help-yuko-time -- Print help for time conversions.
: help-yuko-time ( -- )
\ ---------1---------2---------3---------4---------5---------6---------7
cr ." YUKO TIME CONVERSIONS"
cr ." Units: day, hour (hr), minute (min), second (s), year (yr)"
cr ." Conversions: s>min s>hr s>day min>hr min>day min>yr hr>day hr>yr"
cr ." day>yr min>s hr>s day>s hr>min day>min yr>min day>hr yr>hr yr>day"
cr ." (No second <-> year conversion due to scale difference.)
cr
;
\ help-yuko-volume -- Print help for volume conversions.
: help-yuko-volume ( -- )
\ ---------1---------2---------3---------4---------5---------6---------7
cr ." YUKO VOLUME CONVERSIONS"
cr ." Units: cup, fluid ounce (floz), gallon (gal), liter (l),"
cr ." milliliter (ml), pint (pt), quart (qt), tablespoon (tbsp),"
cr ." teaspoon (tsp)"
cr ." Conversions: cup>floz cup>gal cup>l cup>ml cup>pt cup>qt cup>tbsp"
cr ." cup>tsp floz>cup floz>gal floz>l floz>ml floz>pt floz>qt floz>tbsp"
cr ." floz>tsp gal>cup gal>floz gal>l gal>ml gal>pt gal>qt gal>tbsp"
cr ." gal>tsp l>cup l>floz l>gal l>ml l>pt l>qt l>tbsp l>tsp ml>cup"
cr ." ml>floz ml>gal ml>l ml>pt ml>qt ml>tbsp ml>tsp pt>cup pt>floz pt>gal"
cr ." pt>l pt>ml pt>qt pt>tbsp pt>tsp qt>cup qt>floz qt>gal qt>l qt>ml"
cr ." qt>pt qt>tbsp qt>tsp tbsp>cup tbsp>floz tbsp>gal tbsp>l tbsp>ml"
cr ." tsp>qt tsp>tbsp tbsp>pt tbsp>qt tbsp>tsp tsp>cup tsp>floz tsp>gal"
cr ." tsp>l tsp>ml tsp>pt"
cr
;
\ help-yuko-price -- Print help for price conversions.
: help-yuko-price ( -- )
\ ---------1---------2---------3---------4---------5---------6---------7
cr ." YUKO PRICE CONVERSIONS"
cr ." Units: USD per troy ounce (do), JPY per gram (yg)"
cr ." Conversions: do>yg yg>do"
cr ." (Second argument is JPY:USD exchange rate in JPY per 1000 USD.)"
cr
;
\ LINEAR MEASURE
\ FT foot, IN inch, KM kilometer, M meter, MI mile, MM millimeter
\ All values are unsigned integers.
: ft>in ( u1 -- u2 ) 12 * ;
: ft>km ( u1 -- u2 ) 381 1250000 */ ;
: ft>m ( u1 -- u2 ) 381 1250 */ ;
: ft>mi ( u1 -- u2 ) 5280 / ;
: ft>mm ( u1 -- u2 ) 1524 5 */ ;
: in>ft ( u1 -- u2 ) 12 / ;
: in>km ( u1 -- u2 ) 127 5000000 */ ;
: in>m ( u1 -- u2 ) 127 5000 */ ;
: in>mi ( u1 -- u2 ) 63360 / ;
: in>mm ( u1 -- u2 ) 127 5 */ ;
: km>ft ( u1 -- u2 ) 1250000 381 */ ;
: km>in ( u1 -- u2 ) 5000000 127 */ ;
: km>m ( u1 -- u2 ) 1000 * ;
: km>mi ( u1 -- u2 ) 5000000 8047863 */ ;
: km>mm ( u1 -- u2 ) 1000000 * ;
: m>ft ( u1 -- u2 ) 1250 381 */ ;
: m>in ( u1 -- u2 ) 5000 127 */ ;
: m>km ( u1 -- u2 ) 1000 / ;
: m>mi ( u1 -- u2 ) 5000 8047863 */ ;
: m>mm ( u1 -- u2 ) 1000 * ;
: mi>ft ( u1 -- u2 ) 5280 * ;
: mi>in ( u1 -- u2 ) 63360 * ;
: mi>km ( u1 -- u2 ) 8047863 5000000 */ ;
: mi>m ( u1 -- u2 ) 8047863 5000 */ ;
: mi>mm ( u1 -- u2 ) 1609344 * ;
: mm>ft ( u1 -- u2 ) 5 1524 */ ;
: mm>in ( u1 -- u2 ) 5 127 */ ;
: mm>km ( u1 -- u2 ) 1000000 / ;
: mm>m ( u1 -- u2 ) 1000 / ;
: mm>mi ( u1 -- u2 ) 1609344 / ;
\ MASS/WEIGHT
\ G gram, KG kilogram, LB pound, OZ ounce, OZT troy ounce
\ All values unsigned integers.
\ OZT conversion to/from G only.
: kg>lb ( u1 -- u2 ) 100000000 45359237 */ ;
: kg>g ( u1 -- u2 ) 1000 * ;
: lb>oz ( u1 -- u2 ) 16 * ;
: kg>oz ( u1 -- u2 ) 1600000000 45359237 */ ;
: g>oz ( u1 -- u2 ) 1600000 45359237 */ ;
: lb>g ( u1 -- u2 ) 45359237 100000 */ ;
: lb>kg ( u1 -- u2 ) 45359237 100000000 */ ;
: g>kg ( u1 -- u2 ) 1000 / ;
: oz>lb ( u1 -- u2 ) 16 / ;
: oz>kg ( u1 -- u2 ) 45359237 1600000000 */ ;
: oz>g ( u1 -- u2 ) 45359237 1600000 */ ;
: g>lb ( u1 -- u2 ) 100000 45359237 */ ;
: g>ozt ( u1 -- u2 ) 10000000 311034768 */ ;
: ozt>g ( u1 -- u2 ) 311034768 10000000 */ ;
\ TEMPERATURE
\ C degrees Celsius, F degrees Fahrenheit
\ All values signed integers
: c>f ( n1 -- n2 ) 9 5 */ 32 + ;
: f>c ( n1 -- n2 ) 32 - 5 9 */ ;
\ TIME
\ S second, MIN minute, HR hour, DAY, YR year
\ (No s<->yr conversion due to scale diff.)
\ All values unsigned integers.
: s>min ( u1 -- u2 ) 60 / ;
: s>hr ( u1 -- u2 ) 3600 / ;
: s>day ( u1 -- u2 ) 86400 / ;
: min>hr ( u1 -- u2 ) 60 / ;
: min>day ( u1 -- u2 ) 1440 / ;
: min>yr ( u1 -- u2 ) 525960 / ;
: hr>day ( u1 -- u2 ) 24 / ;
: hr>yr ( u1 -- u2 ) 8766 / ;
: day>yr ( u1 -- u2 ) 4 1461 */ ;
: min>s ( u1 -- u2 ) 60 * ;
: hr>s ( u1 -- u2 ) 3600 * ;
: day>s ( u1 -- u2 ) 86400 * ;
: hr>min ( u1 -- u2 ) 60 * ;
: day>min ( u1 -- u2 ) 1440 * ;
: yr>min ( u1 -- u2 ) 525960 * ;
: day>hr ( u1 -- u2 ) 24 * ;
: yr>hr ( u1 -- u2 ) 8766 * ;
: yr>day ( u1 -- u2 ) 1461 4 */ ;
\ VOLUME (LIQUIDS)
\ ML milliliter TSP teaspoon TBSP tablespoon FLOZ fluid ounce
\ CUP PT pint QT quart L liter GAL gallon
\ All values unsigned integers.
: ml>tsp ( u1 -- u2 ) 9600000 47317723 */ ;
: ml>tbsp ( u1 -- u2 ) 3200000 47317723 */ ;
: ml>floz ( u1 -- u2 ) 1600000 47317723 */ ;
: ml>cup ( u1 -- u2 ) 200000 47317723 */ ;
: ml>pt ( u1 -- u2 ) 100000 47317723 */ ;
: ml>qt ( u1 -- u2 ) 50000 47317723 */ ;
: ml>l ( u1 -- u2 ) 1000 / ;
: ml>gal ( u1 -- u2 ) 12500 47317723 */ ;
: tsp>ml ( u1 -- u2 ) 47317723 9600000 */ ;
: tsp>tbsp ( u1 -- u2 ) 3 / ;
: tsp>floz ( u1 -- u2 ) 6 / ;
: tsp>cup ( u1 -- u2 ) 48 / ;
: tsp>pt ( u1 -- u2 ) 96 / ;
: tsp>qt ( u1 -- u2 ) 192 / ;
: tsp>l ( u1 -- u2 ) 47317723 9600000000 */ ;
: tsp>gal ( u1 -- u2 ) 768 / ;
: tbsp>ml ( u1 -- u2 ) 47317723 3200000 */ ;
: tbsp>tsp ( u1 -- u2 ) 3 * ;
: tbsp>floz ( u1 -- u2 ) 2 / ;
: tbsp>cup ( u1 -- u2 ) 16 / ;
: tbsp>pt ( u1 -- u2 ) 32 / ;
: tbsp>qt ( u1 -- u2 ) 64 / ;
: tbsp>l ( u1 -- u2 ) 47317723 3200000000 */ ;
: tbsp>gal ( u1 -- u2 ) 256 / ;
: floz>ml ( u1 -- u2 ) 47317723 1600000 */ ;
: floz>tsp ( u1 -- u2 ) 6 * ;
: floz>tbsp ( u1 -- u2 ) 2 * ;
: floz>cup ( u1 -- u2 ) 8 / ;
: floz>pt ( u1 -- u2 ) 16 / ;
: floz>qt ( u1 -- u2 ) 32 / ;
: floz>l ( u1 -- u2 ) 47317723 1600000000 */ ;
: floz>gal ( u1 -- u2 ) 128 / ;
: cup>ml ( u1 -- u2 ) 47317723 200000 */ ;
: cup>tsp ( u1 -- u2 ) 48 * ;
: cup>tbsp ( u1 -- u2 ) 16 * ;
: cup>floz ( u1 -- u2 ) 8 * ;
: cup>pt ( u1 -- u2 ) 2 / ;
: cup>qt ( u1 -- u2 ) 4 / ;
: cup>l ( u1 -- u2 ) 47317723 200000000 */ ;
: cup>gal ( u1 -- u2 ) 16 / ;
: pt>ml ( u1 -- u2 ) 47317723 100000 */ ;
: pt>tsp ( u1 -- u2 ) 96 * ;
: pt>tbsp ( u1 -- u2 ) 32 * ;
: pt>floz ( u1 -- u2 ) 16 * ;
: pt>cup ( u1 -- u2 ) 2 * ;
: pt>qt ( u1 -- u2 ) 2 / ;
: pt>l ( u1 -- u2 ) 47317723 100000000 */ ;
: pt>gal ( u1 -- u2 ) 8 / ;
: qt>ml ( u1 -- u2 ) 47317723 50000 */ ;
: qt>tsp ( u1 -- u2 ) 192 * ;
: qt>tbsp ( u1 -- u2 ) 64 * ;
: qt>floz ( u1 -- u2 ) 32 * ;
: qt>cup ( u1 -- u2 ) 4 * ;
: qt>pt ( u1 -- u2 ) 2 * ;
: qt>l ( u1 -- u2 ) 47317723 50000000 */ ;
: qt>gal ( u1 -- u2 ) 4 / ;
: l>ml ( u1 -- u2 ) 1000 * ;
: l>tsp ( u1 -- u2 ) 9600000000 47317723 */ ;
: l>tbsp ( u1 -- u2 ) 3200000000 47317723 */ ;
: l>floz ( u1 -- u2 ) 1600000000 47317723 */ ;
: l>cup ( u1 -- u2 ) 200000000 47317723 */ ;
: l>pt ( u1 -- u2 ) 100000000 47317723 */ ;
: l>qt ( u1 -- u2 ) 50000000 47317723 */ ;
: l>gal ( u1 -- u2 ) 12500000 47317723 */ ;
: gal>ml ( u1 -- u2 ) 47317723 12500 */ ;
: gal>tsp ( u1 -- u2 ) 768 * ;
: gal>tbsp ( u1 -- u2 ) 256 * ;
: gal>floz ( u1 -- u2 ) 128 * ;
: gal>cup ( u1 -- u2 ) 16 * ;
: gal>pt ( u1 -- u2 ) 8 * ;
: gal>qt ( u1 -- u2 ) 4 * ;
: gal>l ( u1 -- u2 ) 47317723 12500000 */ ;
\ PRICE
\ For precious metal price comparisons
\ DO usd per troy oz., YG jpy per g
\ (2nd argument is JPY per 1000 USD)
: do>yg ( u1 u2 -- u3 ) 10000 * 311034768 */ ;
: yg>do ( u1 u2 -- u3 ) 311034768 swap 10000 * */ ;
cr ." Type 'help-yuko' for help"