人気ブログランキング | 話題のタグを見る
On Lisp 第14章 アナフォリックマクロ
 アナフォリックって何かと思ったら、要は Perl の $_ に相当するものだとのこと。考え方自体は割と単純。試しに、aif を Ruby でそれっぽく実装してみると、こんな感じか。
def aif(test, &then_form)
@it = test
if @it
then_form.call
end
end

aif 'a' do
puts @it #=> a
end

ただ、else は簡単には再現できそうにない。この辺りでマクロの強力さを思い知る。

  - アナフォラ => 「それ」、「it」、Perl の $_
- 意図的にシンボル it を補足する
- 意図的に変数補足を行うマクロのエクスポート
=> 補足されるシンボルのエクスポートも必要
* パッケージ foo 内の (捕捉される) it は、フルネームでは foo:it

14.1 アナフォリックな変種オペレータ
- アナフォリックな if, when, while, and, cond, lambda, block の例

14.2 失敗
- 真、偽、失敗の判別
=> 多値を利用する
* gethash は、第一返り値がデータ、第二返り値が成功 or 失敗の表現
3通りの場合を判別するイディオム (マクロによる隠蔽が有効)
(defun edible? (x)
(multiple-value-bind (val found?) (gethash x edible)
(if found?
(if val 'yes 'no)
'maybe)))


# 関数をクロージャとして使うテクニック (イディオム?)
# 図14.4 で gensym の複数回評価を避けるために使用
(let ((x 0))
(defun inc ()
(setq x (1+ x))))
(inc) ;=> 1
(inc) ;=> 2
(inc) ;=> 3


14.3 参照の透明性
- Gelernter と Jagannathan の (プログラミング言語に対する) 定義
1. どの部分式も、値の等しい別の式に置き換えることができる
2. 同一コンテキスト内では、同じ式はどこで何回使われても同じ値を返す



On Lisp
Paul Graham

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

Amazonで詳しく見る
by G-Tools
# by fkmn | 2009-12-02 23:55 | 一人読書会
On Lisp 第13章 コンパイル時の計算処理
 コンパイル時にできる事をできるだけやってしまうことで、高速化をはかることができる。
 ベジエ曲線の例はちょっとついていけなかった。ついていく必要も無い気がするけどw
 もう少し実用的な例は、後の章で出てくるらしい。
 
13.1 新しいユーティリティ
- 引数の一部がコンパイル時に分かっているときは、
マクロを使って効率の良いコードを生成できる。



On Lisp
Paul Graham

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

Amazonで詳しく見る
by G-Tools
# by fkmn | 2009-12-01 23:55 | 一人読書会
Shibuya.pm #TT 12 に行ってきた
 Shibuya.pm TT #12 に行ってきました。スタッフ&関係者の皆様、おつかれさまでした&ありがとうございました。

 気になったところのちょっとした感想をば。

miyagawa さん - "Tatsumaki" I/O bound HTTP clients in web frameworks
 PSGI 関係のプロジェクトって、割と最近始まったばかりの気がするんだけど、ずいぶんと周囲の対応が速い事に驚いた。有名どころの WAF は、ほとんど対応済みらしい。
 Tatsumaki を使った chat アプリは見ていて楽しい。ハックしたくなる気持ちがわかる。

NoSQL vs. NoKVS ライトニングディスカッション
 普段 KVS なんて使わないもんで、いろいろと新鮮な話ばっかり。

mikio さん - Tokyo (Cabinet|Tyrant)
 KVS としてはメジャーどころなんでしょか?名前はちょくちょく聞くけれど。
 Tokyo Tyrant の運用事例の中に「バイオ」ってあったけど、具体的にはどこで使われてるんだろ?勉強不足で知りませんが。

halt さん - 毎秒11万回更新できるのはRedisだけ
 Redis という初心者向け (?) の KVS について。
 「KVS 使った事無い人?」という質問に対して、手を挙げたのは、会場の半分も居ない感じだった。KVS って、そんなに普及してるのか・・・。
 話を聞いていると、確かに取っ付きやすそうな感じを受けた。お試しで遊んでみるのにはよさそう。

kzk さん - Hadoop/hBase を動かしてみた
 hBase は、これから利用実績が伸びてきそうな印象を受けた。けど、Column Store という特徴ををうまく使うのはコツがいりそう。他の KVS と比べて、少し独特な感じ。

kazuho さん - NoKVS な RDBMS sharding 作ってみた
 KVS じゃなくて、RDBMS sharding のためのツールのお話。質問が他と比べて活発だったのは、なんだかんだ言ってみんな RDBMS になじみが深いからじゃないかと勘ぐってみたり。

LT - tokuhirom さん
 PL_keyword_plugin は、なんとなく Lisp のリードマクロっぽい気がする。いろいろ面白いことができそう。


 といったところで、21時ぴったりに終了。takesako さんは、自身のトークだけではなく、TT 全体も時間ぴったりに終わらせることのできる特殊な能力をお持ちのようです :-)。
# by fkmn | 2009-11-30 23:55 | 日記
On Lisp 第12章 汎変数
 setf に絡むマクロの章。
 何となく基本テクニックっぽい感じがするのは気のせいか。

12.1 汎変数という概念
- インバージョン: 値を求める式からアサーションへの変換
- アサーション: 成り立つべき条件
- Common Lisp で頻繁に使われるアクセス関数 (car, cdr, nth, aref, etc...) には、
インバージョンに当たるものがあらかじめ定義されている
- 汎変数: setf の第一引数として機能する式

12.2 複数回の評価に関わる問題
- define-modify-macro
- arg1, 定義したいマクロの名前
- arg2, 汎変数以外に取る付加的な引数
- arg3, 汎変数の新しい値を返す関数 (名)

12.3 さらに複雑なユーティリティ
- get-setf-method, 汎変数の値をいじくるための情報を返す関数
# 注、ANSI Common Lisp の標準は、get-setf-expansion
# 参考: 代入を簡略化するマクロ
- (get-setf-method '(aref a (incf i))
;;=> (#:G3430 #:G3431) ; 一時変数のリスト
;; (A (INCF I)) ; 一時変数にそれぞれ代入すべき値のリスト
;; (#:G3432) ; 変更後の値を入れるための一時変数
;; (SYSTEM::STORE #:G3430 #:G3431 #:G3432) ; この束縛のもとで行うべき代入操作
;; (AREF #:G3430 #:G3431) ; 変更前の汎変数の値を返す式

12.5 インバージョンを定義する
- defsetf, インバージョン定義マクロ
defmacro と違い、引数のために自動的に gensym を生成する
- defun でも、setf に対するインバージョンを直接定義できる (CLTL2 準拠の場合)
- 非対称なインバージョンも定義可能
- アクセス用の式とそのインバージョンは、同じデータに対して働く必要は無い



On Lisp
Paul Graham

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

Amazonで詳しく見る
by G-Tools
# by fkmn | 2009-11-25 23:55 | 一人読書会
On Lisp 第11章 古典的なマクロ
 だんだんマクロの規模が大きくなってきた。がんばってついていこう。

 ちなみに、最近、仕事でコードを書いていて、「あ、これマクロでやれそう (やりたい)」と考える事が多くなってきた。徐々に洗脳が進んでいるらしい。

よく使われる種類のマクロ
- コンテキストを作るマクロ
- 条件付き評価のためのマクロ
- 反復評価のためのマクロ

11.1 コンテキストの生成
- コンテキストの種類
1. レキシカル環境
2. 世界の状態
- スペシャル変数の値
- データ構造の内容
- Lisp外部の状態
- etc...

11.2 with-系マクロ
- コンテキスト生成マクロの名前は with- で始めることが多い
- unwind-protect
- 複雑なマクロは、関数とマクロの組み合わせで書く方が実用的
# dynamic-extent宣言ってなに??
# あとで読む: Common Lisp のスコープとエクステント (PDF)

11.3 条件付き評価
- 定石のうち、明確なものと効率的なものとの選択に直面したときに、
前者を後者に変換するマクロを書く事で、切り抜けられる

11.4 反復
- 本体となる指揮を執って、それを反復評価するオペレータ
=> マクロでのみ表現可能

11.5 複数の値にわたる反復
# ちょっとでかいマクロが多くて、あまりついていけなかった・・・
# 要復習

11.6 マクロの必要性
- 引数をクロージャで括って、評価から保護する方法があるよ
* でも、マクロで書いた方がすっきりする場合多数



On Lisp
Paul Graham

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

Amazonで詳しく見る
by G-Tools
# by fkmn | 2009-11-20 19:27 | 一人読書会


とある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