Shammer's Philosophy

My private adversaria

実行関数のマッピングリストを用意する

結局引数で渡すしかないのか? - Shammerismのやり方では、呼び出す側があらかじめ関数名を規定しておく必要があった。だが、関数名を規定するだけでは、一つの処理しか定義できない。そこで、あるキーワードごとの実行関数を呼び出す、というようにしてみる。

? (defparameter fun-map '(("hello" . "HELLO")))
URI-MAP
? (cdar fun-map)
"HELLO"
? (defun hello () (format t "Hello!~%"))
HELLO
? (funcall (intern (cdar fun-map)))
Hello!
NIL
? (defun hello (x) (format t "Hello, ~A!~%" x))
HELLO
? (funcall (intern (cdar fun-map)) "Taro")
Hello, Taro!
NIL
? 

いい感じだ。上の例だと、fun-map が一つしかないので、(caar fun-map) で取り出すことができる "hello" の使い道がないが、fun-map が複数の場合は find とかでこの caar がマッチング条件として使用される想定。とりあえず cdar で実行関数を取り出すようにしているが、これはマッチングの処理を省略するためのもの。複雑に入り組んだリストから自在に目的の要素を取り出すスキルは非常に重要だ。