Elisp: pow関数作成
xyzzyでpow関数を使おうとしたら「関数が定義されていません」のエラー。
log関数を使えば作成できるだろうと、算出してみた。
c=pow(a, b)ということは、log_a(c)=log(c)/log(a)=b
これより、log(c)=log(a)*bとなり、両辺の指数をとると、c=exp(log(a)*b)
ということで、目的の関数は以下のようになる。
(defun pow (a b) (exp (* (log a) b))) (defun log10 (x) (/ (log x) (log 10)))
(log10関数もなかったので一緒に作成した)
[追記]
Mule (Emacs, ELisp) にもpow関数はなかった。
[追記]
関数名はpowでなく、exptとしてxyzzyでもMuleでも標準で用意されていたようだ。xyzzyの電卓モードに累乗機能があり、その大元のcalc.lに記述があった。電卓モードでは^での簡易表記も用意されている。
(setf (symbol-function 'calc::expt) #'expt) (setf (symbol-function 'calc::pow) #'expt) (setf (symbol-function 'calc::log10) #'(lambda (x) (log (float x 0d0) 10d0))) (defconstant *calc-token-alist* '((#\^ . expt)))
関数名がなぜこの名称なのか不明だが、Common Lispでの慣習的なものなのかな?
- Calc-modeのManual – XyzzyWiki
- xyzzy電卓半端移植 – Nosの日記
- Common Lisp:算術演算 – 俺式ネッ!と –
- Scheme 入門 2. Scheme を電卓代わりに使う
- Common Lisp Extensions: Numbers
- 数の関数 – Common Lisp拡張