2009年1月12日月曜日

一年後

翻訳版の読んでみています。(計算機とその周辺)

原書と翻訳書の両方を読むという体験はあまりしたことがありません。また、同じ本を一年たってから通読するというもあまりありません。そういう意味で楽しんでいます。

2008年7月18日金曜日

さらに、その後

テーマ毎にわかれているのもなんだな、ということで、一箇所に集約しつつあります。

計算機とその周辺

ブログのやり方も、まだいまひとつ飲み込めていないので、そのうち考えてみようと思います。

2008年5月7日水曜日

その後

Common Lisp の習得を目指していますが、ちょっと寄り道というか回り道をしています。

まず、実際にプログラムを組もうとすると、組むための開発環境だとかパーシステンスのあり様だとかで、数理論理の基礎を勉強しなければ、と思いました。飛躍している、とつっこまないでください。一応つながっているのです。

あと業務の関係でRubyを使う必要がでてきたので、これも脇道で、ウサギ本を読んでいます。

Lispは基礎を固める、ということで次の2冊をちょっとずつ読んでいます。

あと、いろいろな本を読んでいると、やはりC言語とJavaは知らないと、例とかでわからないことが多いです。そこで、C言語から勉強しようと思います。

なんか、この読書の連鎖のアルゴリズムは、無停止なような気がしてきましたが、楽しんでやっているのでいいかな、と。
そうだ、本当はアルゴリズムとデータ構造の勉強がしたいのです。それはもう少し片付いたところで。

2008年1月24日木曜日

Chapter 32 Conclusion: What's Next?

前説
Finding Lisp Libraries
Interfacing with Other Laguages
Make It Work, Make It Right, Make It Fast
Delivering Applications
Where to Go Next

特になし。

読了。

Chapter 31 Practical: An HTML Generation Library, the Compiler

前説

FOO言語においては、InterpreterとくらべてCompilerが最適化しているのは、テキストをできるだけまとめて出力するようにすること。


The Compiler


  • The compilerのアーキテクチャ。
  • html-compilerクラス。このオブジェクトにbackendの総称関数へ成されたopsを集積させる。
  • backendの総称関数は、前項へのops書き込み機能を持つ。
  • opsを最適化する関数にわたし、最適化される。
  • 最適化されたops vectorをgenerate-code関数が受け取り、CLのコードを吐く。


  • compilerがhtml-compilerのときのprocessor interface(メソッド)は、html-compilerへのopsの集積処理とする。
  • 関数sexp->opsを定義する。これは、前項を順次S式に適用してopsのvectorを作成する。
  • 関数optimize-static-outputを導入する。これは前項のvectorについて、raw-stringを合成する。
  • 関数generate-codeを導入する。これはopsに対して逐次総称関数op->codeを適用するだけ。
  • 総称関数op->codeを定義する。これが、それぞれのopを対応するLisp codeに変換する。
  • op->codeの定義でポイントは2つ。embed-valueとembed-code。
  • embed-valueは、Lispの変数の埋め込みに対応する。これは(princ-to-string value)が本質である。
  • embed-codeは、Lispのコードの埋め込みに対応する。これは、入力のコードをそのまま使える。



FOO Special Operators


  • Special Operatorは、CL本体と同じように、言語の通常の評価ルールでは実現できないことを実現するためのものである。
  • まず、現在のembed-codeの実装(そのまま)では、(p: (random 10))などで、(random 10)の値はすてられ、出力は

    となる。値が欲しいときもある。
  • そのために、:print、:formatを導入する。
  • :printは、embe-codeで検知され、そのbodyをembed-valueに渡す実装とする。
  • :formatは、それの引数がself-evaluatingであれば、それをemit-htmlに渡せる(Interpreterで使える)。Compilerのときは、引数はどんなLisp expressionsでもよい。


  • Special Operatorの実装方法。
  • まず、関数processの第一分岐としてprocess-special-formを呼ぶようにする。
  • Special formは、'html-special-operator(plist)に格納する。名前とlambdaの組で格納。
  • 個々のSpecial formの定義はマクロdefine-html-special-operatorで簡略化する。
  • 関数process-special-formは、plistからlambdaを取得して、formに適用するだけ。
  • これによって、Special Operatorの拡張をモジュール化できている。



FOO Macros


  • Special Operatorの実装方法と類似。
  • 'html-macro plistにマクロ名と処理lambdaを登録する。
  • ただし、ユーザはそのlambdaを直接書くのではなく、そのlambdaを作るための関数generate-macro-with-attributesなど(define-html-macroから呼ばれる構造とする。
  • generate-macro...は、ユーザから受け取ったマクロ定義(args and body)を、DISTRUCTURING-BINDに渡して、argsの置換をおこなうようにする。
  • 関数processの第二分岐にexpand-macor-form関数を登録する。これがマクロ展開を実行する。



The Public API


  • あり? なぜここで急にXHTML? *xhtml*がnil or t。
  • マクロin-html-styleを定義。
  • マクロhtmlを導入。
  • マクロhtmlはそれ自身ネスト可能であるし、その中身は*pretty*の値によって振舞が違うので、コード分岐を含んでもいる。すなわち単純な実装だとネストによって指数関数的にコードが増大してしまう。
  • それはmacroletで回避可能。


The End of the Line

JavaScriptのS式表現をつくる元気はありません。。。

Chapter 30 Practical: An HTML Generation Library, the Interpreter

気をとりなおして。
30章と31章については、各節のエッセンスをメモしていく形にします。


前説


  • Interpreter : FOOプログラムを受け取って、HTMLを生成する。
  • Compiler : FOOプログラム(CL埋め込みあり)を受け取って、CLのコードを生成する。



Designing a Domain-Specific Language

DSL設計は2段階。

  • DSLの構文というか書きぶりを決める。
  • それの処理系を実装する。


DSLの設計のポイントは、DSLによっていかに表現が「圧縮」されるかということ。


The FOO Language


  • Lisp objectsを基礎におく。
  • self-evaluating lisp objectsは、PRINC-TO-STRINGで変換したものをFOOでは出力する。このとき<>などのエスケープも行う。
  • HTMLの要素名をキーワードシンボルとする。キーワードシンボルを第一要素とするリストを、HTMLの要素に対応させる。
  • 属性は次の2つの表現が可能とする。
    表現1 (:p :id "x" "Foo")
    表現2 ((:p :id "x") "Foo")


Character Escaping


  • 要素と属性でエスケープ対象文字が異なる。
  • 対象文字を、*element-escape*, *attribute-escape*に格納する。
  • *escape*に場所場所でどちらかを割り当てるなどの運用をする。



Indenting Printer


  • indenting-printerというクラスに情報を格納してindentを制御する。
  • ただし、indenting-printerのindentation slotに入っている値に対応してindentするというだけの機構。
  • 文字列をindentして出力するための基本関数を定義。

    (defun emit (ip string) ...)
    (defun emit/no-newlines (ip string &key (start 0) end) ...)
    (defun indent-if-necessary (ip) ...)
    (defun emit-newline (ip) ...)
    (defun emit-freshline (ip) ...)




HTML Processor Interface


  • HTML Processorのインターフェイスは総称関数で定義する。
  • これはInterpreterとCompilerの両方に対応するため。
  • 総称関数は次の8つ。

    (defgeneric raw-string (processor string &optional newlines-p))
    (defgeneric newline (processor))
    (defgeneric freshline (processor))
    (defgeneric indent (processor))
    (defgeneric unindent (processor))
    (defgeneric toggle-indenting (processor))
    (defgeneric embed-value (processor value))
    (defgeneric embed-code (processor code))




The Pretty Printer Backend


  • html-pretty-printerというクラスを導入する。これは、slotにindenting-printerとtab-widthをもつ。
  • 前章の総称関数に対するメソッドの定義をする。そのとき、Indenting-printer節で定義した基本関数が使える。
  • embed-valueとembed-codeとは、Compilerのみで使用する。Interpreterではerrorとなるようにする。



The Basic Evaluation Rule


  • 評価としては、まずself-evaluatingならば、raw-string関数にわたす。
  • そうでなければ、それはFOO言語のcons-sexp形式となる。
  • process-cons-sexp-html関数を導入する。
  • この関数は、HTMLタグ出力、その中身の出力、インデントの管理、改行の管理を担当する。
  • これの振舞の観点から、HTML要素は3つに分類できる。

    (defparameter *block-elements* '(:body :colgroup ...))
    (defparameter *paragraph-elements* '(:area :base :blockquote ...))
    (defparameter *inline-elements* '(:a :abbr ...))

  • この他に2つの補足的分類がある。

    (defparameter *empty-elements* '(:area :base :br ...))
    (defparameter *preserve-whitespace-elements* '(:pre :script ...))

  • この分類を利用して、process-cons-sexp-htmlを実装する。
  • process関数を直に呼ぶのでは手間なので、emit-html関数を導入して省く。
  • *html-ouput*自身をAPIとして公開したくはないので、with-html-ouputマクロを導入して隠蔽する。



What's Next?

特になし。

2008年1月23日水曜日

Chapter 29 Practical: An MP3 Browser

前説

特になし。


Playlists

SHOUTcastの情報がなかなかみつからない。IcecastはSHOUTcastから派生したものらしい。

あとPlaylistの情報。



Playlists As Song Sources

著者がちゃんと説明しないので、私家版整理。

  • MP3をストリーム配信する場合、提供の仕方は2種類ある。ラジオ的なエンドレスなものと、アーカイブス的に指定した曲を提供するものである。
  • いずれにしても、SHOUTcastの仕組みとPlaylistは関係ない。MP3プレーヤに直にラジオ(チャンネル)や曲のURLを直に入力してもよい。
  • PlaylistはSHOUTcastを使ったサービスを便利にするための補完的なものである。
  • MP3 client(の一部)は(Nullsoftの)Playlistを読み込むことができる。
  • ラジオの場合は、Playlistの中のLengthが-1となっている。
  • 曲の場合は、その曲の秒数がLengthに入る。
  • ラジオの場合は、通常Playlistは単にそのチャンネルの聴取する入口の機能のみを担い、Playlistをユーザが編集するなどの機能はない。
  • 曲の場合は、Playlistからユーザが曲を選択して聴取することができるので、サーバ側がPlaylistの編集機能などを提供することによって便利になることもある。ただし、一度ダウンロードしたPlaylistをclient側でカスタマイズするというのもありなので、それしかやりようがないわけではない。
  • この本では、次の設計方針としている。

    • ラジオではなくアーカイブスとするが、曲毎のURLはもたない。
    • ユーザをIPアドレスで識別する。
    • それと相俟って、IPアドレスひとつにつきPlaylistをひとつサーバ上にもてるようにする。このPlaylistはNullsoftのPlaylistではない。
    • サーバ上のPlaylistをユーザがWebブラウザからカスタマイズできるようにする。
    • MP3 clientは単一のURL(ストリーミングフィード)にアクセスし、そのフィードから出る曲をWebブラウザからPlaylistという形で操作する。



Manipulating the Playlist
Query Parameter Types
Boilerplate HTML
The Browse Page
The Playlist
Finding a Playlist
Running the App

特になし。

この章楽しめませんでした。
CLの本ですから、作るアプリのドメイン情報やアーキテクチャについて、詳細に触れる必要はありませんが、説明がいいかげんに思えます。また、題材となっているSHOUTcastやPlaylistはNullsoftの勝手仕様なものであり、その仕様を自助努力で調べようにも入手可能な情報自体が不足しています。著者のCLのコードをみて仕様を想像するのでは、それが正しい実装なのか判断できません。