2019年3月31日日曜日

lisp 高階関数

高階関数のメモ


参考サイト
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 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts