Common Lisp勉強中・・・ (6)
本で言う第7章, 関数と関数データ.
本は, 「やさしいLisp入門」.
関数の定義.
;; 一般的な関数定義 (defun 関数名 (引数 ...) 関数の定義) ;; レスト引数を用いた関数定義 (defun 関数名 (引数 ... ... &rest レスト引数) 関数の定義) ;; レスト引数の例 > (defun average (&rest x) (/ (apply #'+ x) (length x))) AVERAGE > (average 1 2 3 4 5) 3 > (average 1 2 3 4 5 6 7 8 9 10 11 12) 13/2 > (average 1 2 3 4 5 6 7 8 9 10) 11/2
例は, 関数名だけ変えて本のをそのまま.
&restの意味は, 無制限に引数を渡せることを意味する.
キーワード引数を使う関数定義.
;; 構文 (defun 関数名 (引数 ... &key (キーワード引数 省略値) ...) 関数の定義) > (defun myCheckElement (x &key (test #'numberp)) (not (member 'nil (mapcar test x)))) > (myCheckElement '(1 2 3 4 5)) T > (myCheckElement '(a b c)) NIL > (myCheckElement '(a b c) :test #'symbolp) T
:test #'symbolpとして, デフォルトでは, 一致に使用した関数がnumberpだったのをsymbolpに変更している.
関数データの生成.
;; lambda (lambda (引数 ...) 式) ;; 例, 本のをそのまま > (let ((myAdd1 #'(lambda (x) (+ x 1)))) (funcall myAdd1 9)) 10 ;; lambda自身は関数. > ((lambda (x) (+ x 1)) 9) 10
うーん. 難しい. どういうものかは, 例でなんとなく分かったけど,
これで実際に使用できるかっていったら, うーん・・・.
関数データを引数に取る関数を利用する場合, lambdaを使うと便利になる・・・らしい.
ここがもしかしたらLispの肝なのかも.
クロージャとか説明読んでも何となく分かった程度にしか理解できない.
関数定義とともに変数の情報なども1つにまとめたものぉ?