Neocities / Hodgepodge / Programming / Rebol Ohms

(this is just a screenshot; code is below that)



The code (ohm.r):
rebol[title: "Georg Simon Ohm in a Can"] ; still has a bug when calculating r to be infinite ohms ; it'll show it as zero ohms r: none ; resistance i: none ; current v: none ; voltage p: none ; power in watts hp: none ; horsepower iph: none ; amps per phase ;fallback: func[a b][unless attempt a [error-response b] ] to-number: func[s /local n][ either attempt [n: to-decimal s][n][0] ] HP_to_W: does [p: hp * 746] W_to_HP: does [hp: p / 746] IPH_to_I: does [i: iph * (square-root 3)] I_to_IPH: does [iph: i / (square-root 3)] calcVI: does [ unless attempt [ r: v / i p: v * i ] [r: 0 p: 0] ] calcVR: does [ unless attempt [ i: v / r p: v * i ] [i: 0 p: 0] ] calcVP: does [ unless attempt [ i: p / v r: v / i ] [i: 0 r: 0] ] calcIR: does [ v: i * r p: v * i ] calcIP: does [ unless attempt [ v: p / i r: v / i ] [v: 0 r: 0] ] calcRP: does [ unless attempt [ v: square-root(p * r) i: square-root(p / r) ][ v: 0 i: 0 ] ] calc: does[ if hp[HP_to_W] if iph[IPH_to_I] ; get watts or DC amps case[ all[v i][calcVI] all[v r][calcVR] all[v p][calcVP] all[i r][calcIR] all[i p][calcIP] all[r p][calcRP] true[exit] ; need TWO values to calc so don't do what's below ] W_to_HP I_to_IPH ; set horsepower and amps/phase ] metricVals: ["m" 1E-3 "u" 1E-6 "n" 1E-9 "" 1 "k" 1E+3 "M" 1E+6 "g" 1E+9] suf2plain: func[n /local s][ unless attempt[s: to-string last n][return 0] either(find "munkMg" s)[ n: to-number copy/part n (length? n) - 1 return n * select/case metricVals s ][ return to-number n ] ] plain2suf: func[n /local a s /ohms][ if n = none [return ""] a: abs n case[ a = 0 [s: " "] a < 1E-6 [n: n * 1E9 s: " nano"] a < 1E-3 [n: n * 1E6 s: " micro"] a < 1 [n: n * 1E3 s: " milli"] a >= 1E9 [n: n / 1E9 s: " giga"] a >= 1E6 [n: n / 1E6 s: either ohms[" meg"][" mega"]] a >= 1E3 [n: n / 1E3 s: either ohms["k "][" kilo"]] true [s: " "] ] if n = to-integer n [n: to-integer n] ; changes type, leaves same value return join (to-string n) s ] pr: func[c s][c/text: to-string s show c] ; convenience setTtext e: does[suf2plain ent/text] ; what you just entered, with suffix processed fillForm: does[ pr lhp either(hp = none)[""][join (plain2suf hp) "Hp"] pr lwatt either(p = none)[""][join (plain2suf p) "watts"] pr lohm either(r = none)[""][join (plain2suf/ohms r) "ohms"] pr lvolt either(v = none)[""][join (plain2suf v) "volts"] pr lamp either(i = none)[""][join (plain2suf i) "amps"] pr lcpp either(iph = none)[""][join (plain2suf iph) "amps"] pr ent "" ] ; right. It fills out the form. cfc: does [calc fillForm clr] keyW: does[p: e cfc] keyV: does[v: e cfc] keyR: does[r: e cfc] keyI: does[i: e cfc] keyHP: does[hp: e cfc] keyIPH: does[iph: e cfc] clr: does[ if any[all[r i] all[r v] all[r p] all[i v] all[i p] all[v p]][r: i: v: p: hp: iph: none] ] ; resets'em all to none, IF calc has been done clrF: does[ r: i: v: p: hp: iph: none pr lhp "" pr lwatt "" pr lohm "" pr lvolt "" pr lamp "" pr lcpp "" ] bkc: 235.255.225 helpbox: layout[ tt "Type into the only text-entry field it has." tt "type a number, which can contain single-letter suffixes:" tt "m(=milli), k(=kilo), u(=micro)," tt "M(=mega), g(=giga), n(=nano) ." tt "End the field with one of the ohm's-laws units:" tt "h(=horsepower), o(=ohms), a(=amps, DC or singlephase)," tt "v(=volts), w(=watts), p(=amps/phase on 3-phase line)" ] h: does[view/new center-face helpbox] view/new layout[ style ttg tt right style ttr tt 180 right style ttp tt 200 origin 5x5 space 5x5 across backdrop bkc ttr "Type here->" ent: field 120 btn 40 "?" keycode[#"?"][h] lkt: ttg 44 "keys" keycode[#"^["][clrF] return ttr "Horsepower :" lhp: ttp lk8: ttg "h" keycode[#"h"][keyHP] return ttr "Power (watts) :" lwatt: ttp lk7: ttg "w" keycode[#"w"][keyW] return ttr "Resistance :" lohm: ttp lk6: ttg "o" keycode[#"o"][keyR] return ttr "Voltage :" lvolt: ttp lk5: ttg "v" keycode[#"v"][keyV] return ttr "Current (dc or 1phase) :" lamp: ttp lk4: ttg "a" keycode[#"a"][keyI] return ttr "Current (if 3-phase) :" lcpp: ttp lk3: ttg "p" keycode[#"p"][keyIPH] ] focus ent do-events quit