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つにまとめたものぉ?