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

有効数字とか全く考えてません、電卓だし。