Shammer's Philosophy

My private adversaria

funcall で引数を合わせて利用する

以前、funcall を使用して、呼び出す関数を変数の値から決定できるようにする例を書いたがその続き。
以前の記事は以下。

前書いたものは引数を必要としない関数だったが、実際には引数が必要な例の方が圧倒的にたくさんありそうだ。まあ、上記の内容があればやってみればすぐにわかりそうな内容だけれども、毎回やってみることになるのも面倒なのでメモしておくことにしよう。
実行例は以下。

? (defun hello (name) (format t "Hello, ~A~%" name))
HELLO
? (hello "sss")
Hello, sss
NIL
? (funcall (intern (string-upcase "hello")) "name")
Hello, name
NIL
?

引数が一つの場合。これは Clozure CL だが、そのまま引数を渡せば実行できそうだ。
念の為、引数が複数の場合もテスト。

? (defun hello (name age) (format t "I'm ~A, I'm ~A." name age))
HELLO
? (hello "Me" 30)
I'm Me, I'm 30.
NIL
? (funcall (intern (string-upcase "hello")) "Me" 30)
I'm Me, I'm 30.
NIL
?

同じかな、、、念の為、引数にリストを含む例も。

? (defun test (x y)
    (format t "This is ~A.~%" x)
    (dolist (i y)
      (format t "~A~%" i)))
TEST
? (test "Okay" '(10 20 30))
This is Okay.
10
20
30
NIL
? (funcall (intern (string-upcase "test")) "Okay" '(0 1 2))
This is Okay.
0
1
2
NIL
? (funcall (intern (string-upcase "test")) "Okay" (list 1 2 3))
This is Okay.
1
2
3
NIL
?

やっぱりこれで問題なさそう。