Common Lisp勉強中・・・ (9)

本で言う第10章, その他の機能.
本は「やさしいLisp入門」.
もう終わりだな.



局所関数.

;; 構文
(flet ((局所関数1 引数リスト1
         局所関数定義1 ...)
       (局所関数2 引数リスト2
         局所関数定義2 ...)
       ...
       (局所関数N 引数リストN
         局所関数定義N ...))
  実行式)

;; letに対するlet*みたいな位置付けの関数.
;; labelsは, fletとほぼ同じだが, 同時に定義する局所関数を相互に呼びだすことができる.
(labels ((局所関数1 引数リスト1
           局所関数定義1 ...)
         (局所関数2 引数リスト2
           局所関数定義2 ...)
         ...
         (局所関数N 引数リストN
           局所関数定義N ...))
    実行式)


多値.

;; floorは小数点以下切捨ててくれる関数.
;; この関数では余りも通常, 発生している.
> (floor 11/3)
3 ;
2/3

;; 関数multiple-value-listを使って, floorの余りを明示的に受け取ってみる.
;; 結果は, リストで返される.
> (multiple-value-list (floor 11/3))
(3 2/3)

;; 多値の生成.
;; 最初の10が主となる値. 15は多値の残りである.
> (values 10 15)
10 ;
15

;; 関数で多値を返す.
;; - リストを関数の最後で返す(もしかしたら多値と言っちゃまずいかも).
;; - 関数valuesを使って複数の値を返す.
;; valuesに何も引数を与えないと, 値を何1つ返さない関数が定義できる.
> (defun test-tachi () '(1 2))
TEST-TACHI
> (test-tachi)
(1 2)
> (defun test-tachi () (values))
TEST-TACHI
> (test-tachi)

> (defun test-tachi () (values 5 4))
TEST-TACHI
> (test-tachi)
5 ;
4

;; リストを多値として返す.
> (values-list '(a b))
A ;
B



大域脱出.

;; 構文
(catch タグ 式 ...)   ; 設定したタグへthrowされた大域脱出を捕まえる.
(throw タグ 値 ...)   ; 指定したタグを持つcatchに向かって大域脱出を行う.

;; 本のサンプルをまんま.
;; 与えられたリストに数値以外のものがあったならば, nilを返す式.
;; リスト(1 2 3 f 5)の中に数字以外のもの「f」があるので, 例外が投げられてnilが返る.
> (catch 'myerror
        (mapcar #'(lambda (mydata)
                    (if (numberp mydata)
                        (+ 1 mydata)
                      (throw 'myerror nil)))
                '(1 2 3 f 5)))
NIL

;; どんなことがあろうと確実に処理させたことを記述する
;; 「保護する式」の途中でthrowされようと, 「特別な処理」は確実に実行される.
(unwind-protect 保護する式 特別な処理 ... )


これで「やさしいLisp入門」はおしまい.
11章は読んだけど, 特にメモることはないなあ. clispの使い方だし.
あとは, どうすればいいんだろう?
標準で含まれている関数の使い方とか書いてあるマニュアルないのかな. 全容が見えない.