人気ブログランキング | 話題のタグを見る
On Lisp 第2章 関数
まだ小手調べ。Common Lisp の紹介といったところ。
といいつつ、Common Lisp と Scheme は、異なる部分が結構多いので、少し戸惑い中。


2.1 データとしての関数
- 関数は Lisp のオブジェクト

2.2 関数の定義
- #' オペレータ
=> 指定した名前の関数オブジェクトを取得

- 変数と関数の名前空間が別

2.4 属性としての関数
(defun behave (animal)
(funcall (get animal 'behavior)))

(setf (get 'dog 'behavior)
#'(lambda ()
(wag-tail)
(bark)))

(behave 'dog) ;;=> wag-tail と bark を実行

- OOP のメソッドの概念に対応

2.5 スコープ
- Common Lisp はレキシカルスコープ

2.7 ローカル関数
- labels 式
=> - ローカルに束縛された関数を作る
- let と違い、labels 式の中で定義された関数を参照可能
(defun count-instances (obj lsts)
(labels ((instances-in (lst)
(if (consp lst)
(+ (if (eq (car lst) obj) 1 0)
(instances-in (cdr lst)))
0)))
(mapcar #'instances-in lsts)))

# defun の中に defun じゃだめなの?
# とおもったら、defun は宣言する場所に関係なく、
# グローバルスコープに関数を定義してしまうらしい。
# flet と labels の動作確認 - ポロポロ

2.8 末尾再帰
- 末尾再帰を最適化するかどうかは、実装依存
# CLISP はそのままでは最適化しない
# => (proclaim '(optimize speed)) が必要

2.9 コンパイル
- (compiled-function-p #'foo)
# コンパイルされているかどうかの判定

- 関数単位のコンパイル
- (compile 'foo)
- (compile nil '(lambda (x) (+ x 2)))
# compile を陽に呼ぶのは、eval を呼ぶのに匹敵するほど過激な方法

- ファイル単位のコンパイル
- compile-file


On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
by fkmn | 2009-10-28 23:55 | 一人読書会
<< 「Prezi」に衝撃を受けた Carbon Emacs に ... >>


とあるWebアプリケーションエンジニアの日記

by fkmn
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX