xyzzyのcalcに科学定数
emacsのfact.txtよろしくxyzzy電卓でも定数を使えればいいな、ということででっちあげてみた。
calc-consts.l
; default (defconstant calc::Pi pi) (defconstant calc::pi pi) (defconstant calc::E (exp 1.0d0)) ;units (defconstant calc::J 1) (defconstant calc::eV (* 1.60217646e-19 calc::J)) (defconstant calc::rad 1) (defconstant calc::deg (* calc::rad (/ calc::Pi 180))) (defconstant calc::sec 1) (defconstant calc::s calc::sec) (defconstant calc::minute (* 60 calc::sec)) (defconstant calc::hour (* 3600 calc::sec)) (defconstant calc::day (* 86400 calc::sec)) (defconstant calc::kg 1) (defconstant calc::g (/ calc::kg 1000)) (defconstant calc::u (* 1.66053886e-27 calc::kg)) ; atomic mass unit (defconstant calc::meter 1) (defconstant calc::m calc::meter) (defconstant calc::km (* 1000 calc::meter)) (defconstant calc::nm (* 1e-9 calc::meter)) (defconstant calc::ampere 1) (defconstant calc::A calc::ampere) (defconstant calc::Coulomb (* 1 calc::ampere calc::s)) (defconstant calc::mol 1) (defconstant calc::K 1) ; Kelvin ;sci. consts. in MKSA (defconstant calc::e (* 1.60217646e-19 calc::Coulomb)) (defconstant calc::c (* 299792458 (/ calc::meter calc::sec))) (defconstant calc::h (* 6.626068e-34 (* calc::J calc::sec))) (defconstant calc::hbar (/ calc::h 2 calc::Pi)) (defconstant calc::G (* 6.67300e-11 (* (expt calc::m 3) (expt calc::kg -1) (expt calc::sec -2)))) (defconstant calc::g (* 9.80665 (/ calc::m calc::sec calc::sec))) (defconstant calc::kB (* 1.3806503e-23 (/ calc::J calc::K))) (defconstant calc::NA (* 6.0221415e23 (/ calc::mol)))
「calc::」「calc::」うっとうしいのがちょっとあれだ。
自然対数の底のeと電荷素量のeがコンフリクトするので使うには$xyzzy$/lisp/calc.lの該当部分を削除する必要がある(Mathematicaにならって自然対数の底は大文字にしてみた)。ついでに↑のがパスのとおったところにあるとして読ませるようにすると
calc.lの
(defconstant calc::pi pi) (defconstant calc::e (exp 1.0d0))
を削除して
(require 'calc-consts)
とする。
あとcalc-ext.lを入れると履歴機能とか使えて便利、というより入れないと不便なので入れましょう。
ex) 3eVの光の波長をナノメートルで
$ h c / (3.0 eV nm) 413.2805771093349
有効数字とか全く考えてません、電卓だし。