« SketchyPhysicsでの形状設定 Main Firefoxのブックマークfavicon »

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での慣習的なものなのかな?

Leave a comment

Your comment