Excel 関数の special form [Excel]
前回の記事の続き(というわけでもないが)で小ネタ。
Lisp では define の他にも if や and や or などなどが special form である。
if は第2第3引数を必ずしも評価するわけではない(第1引数の値で決まる)という点で特別であり、 and や or は一方を評価した結果からもう一方を見るまでも無く全体の値が決定できればそのもう一方を評価しないという点で特別である。(以下の例は XLISP-STAT で実行しました)
> (if T (print "true") (print "false")) "true" "true" > (or (print t) (print nil)) T T > (and (print nil) (print t)) NIL NIL
さて Excel の関数にも IF と AND と OR がある。これはどうなんだろうか。
評価の有無を観察する簡便な方法は副作用を持つ式を置くことだが、Excel の関数には副作用のあるものは(多分)ひとつもない。しかしユーザ定義関数は VBA で書けるのでそこでは副作用も自由自在である。そこでこういうユーザ関数を作ってみた。
Function msg(str)
MsgBox str
msg = str
End Function
そしてセルに以下の式を入れると…
=IF(TRUE,msg("true"),msg("false"))
"true" というメッセージボックスしか表示されない。 IF は special form なのだ。では AND と OR はどうか。
=OR(msg(TRUE),msg(TRUE))
=AND(msg(FALSE),msg(FALSE))
この2つの式をセルに入力するとそれぞれ TRUE のメッセージボックスが2つ、FALSE のメッセージボックスが2つ表示される。引数がすべて評価されてから関数適用が行われるということで、この2つは普通の関数なのだ。
他に特別な扱いを受けそうな関数は見当たらないので Excel 関数においては IF が唯一の special form であるといえるだろう。
コメント 0