高階関数のメモ
参考サイト
Common Lisp 入門
高階関数とラムダ式
http://www.nct9.ne.jp/m_hiroi/xyzzy_lisp/abclisp05.html
以下参照
シンボルは変数の値と関数を別々に格納しています。この場合、シンボル
func に定義されている関数を実行しようとします。ところが、シンボル func
には関数が定義されていないのでエラーとなるのです。ここで実行しようとす
る関数は変数 func に値として格納されているので、リストの先頭に func を
書いてはいけません。変数 func に格納された関数を実行する場合は funcall
を使います。
List 4 : 高階関数の定義(正解)
(defun execfunc (func arg1 arg2)
(funcall func arg1 arg2))
これで、変数 func に格納されている値(関数)が取り出され、それが funcall に渡されるので正常に動作します。
(execfunc #'+ 1 2) => 3
これがわかりにくかったので以下のコードを考えました。
(defun func () (print "hello"))
(defun exef (func m &optional (n 0))
;(setq n 0)
(loop
(incf n)
(if (> n m) (return m))
(funcall func )
)
)
(exef #'func 2)
実行結果
(CL-USER> (exef #'func 2)
"hello"
"hello"
2
ようするに関数を引数にする時は、funcall をつければいいだけ
0 件のコメント:
コメントを投稿