Shammer's Philosophy

My private adversaria

関数渡しでif-elseを実現する

sort するには注意が必要 - Shammerismで、関数を引数として渡すことができることの可能性を考えてみたが、うまい例がなくそんなにすごいとは思えない感じになってしまった。なので、少しはマシと思える例を考えた。

(defun if-else (value cond yes no)
  (if (funcall cond value)
    (funcall yes)
    (funcall no)))

これを使うと、if-else はこんな感じになる。

? (if-else 100 #'(lambda (x) (< x 500)) #'(lambda () (princ "Yes")) #'(lambda () (princ "No")))
Yes
"Yes"
?

なんか lambda を連呼しているからあまりメリットに感じない。むしろ、コード量は増えている。だが、lambda を使う必要がない場合は効果あるはず。バイナリツリーで右だったら処理Aで左だったら処理B、その処理Aや処理Bでも再帰的に右だったら処理Cで左だったら処理Dで、、、というようなことが続く場合はきっと効果を感じられるに違いないwそういうコードを書くことになる機会はあるだろうか。。。あるとすれば、何かのチェック処理で成功だったら次のチェック、失敗だったら終了、というようなことをする場合だろうか。JavaServlet のフィルター的な処理を書きたいというようなときも有用かもしれない。