ラベル ANSI-CL の投稿を表示しています。 すべての投稿を表示
ラベル ANSI-CL の投稿を表示しています。 すべての投稿を表示

2008年11月9日日曜日

【ANSI-CL】付録A デバッグ

PGによるCLでよくあるバグパターン。そうそう、あるある、という感じ。CLは言語仕様の規格なので、ANSI Common Lispについて語るときはどうしてもデバッグについてはこういう感じになる。これ以上の詳細は処理系のマニュアルをどうぞ、ということで。

さて、なんとか一週間でPGのANSI Common Lispを通読できた。

通読完了直後の感想をいくつか。

  • CL入門でCLtL1というかCLの基本をやっていたので、それをベースとしてANSI CLのポイントをつかむにはとてもよかった。
  • ただし例えば、setqやsetの説明はなく、setf一本でいっているところなど割り切りがある。
  • また、labels, flet, macroletとかの説明がなかったりとかの割り切りもある。
  • なるほどCLの書きぶりってこういうものなんだ、と、はっとさせられる部分がいくつかあるのがいい感じ。
  • なので、入門書というよりは、PG的なポイント集と思った方がよいかな。(Amazon.co.jpのレビューと同意見)


さあ、この次どうするか。ちょっと考えたい。

【ANSI-CL】17 例:オブジェクト指向言語 (その2)


  • 完全には習得していないが、写経しつつ、イメージはわかった。自分なりに少しまとめてみる。

  • ある特定の問題を解くプログラムではなく、言語内言語のようなものを作る作業である。Fowler風に言えば内部DSL。
  • 同じものをC言語でつくることを想像してみる。

    • ちょっとうまく想像できない。。。
    • まずLisp的マクロはないので、関数が書きぶりのメインになるのだろう。
    • データ構造的な部分は、基本型、配列、構造体などの基本的なものとポインタで大抵いけるだろう。
    • methodcall (&obj &method &method_params) 的な呼び出し構造があふれそうな。
    • これ、先々やってみると面白いかも。


これにて最終章完了。付録は「付録A デバッグ」のみやることにする。

【ANSI-CL】17 例:オブジェクト指向言語

最終章。

  • 17.2 多重継承

    • 優先リストを作るところのmapcanがすごいな。どうしたらこういうのがほいほい書けるようになるか。。。

      (defun precedence (obj)
      (labels ((traverse (x)
      (cons x
      (mapcan #'traverse
      (gethash :parents x)))))
      (delete-duplicates (traverse obj))))



残念ながら力尽きて、17.4 関数構文までとなった。今日中に残りをやれば、なんとか目標は達成できるからよしとして寝ることにする。おやすみなさい。

2008年11月8日土曜日

【ANSI-CL】16 例:HTML生成


  • 16.2 HTMLユーティリティ

    • ここのマクロは、マクロとはコードを代わりに書いてくれるもの、という感覚を捉えやすい。

  • 16.3 反復ユーティリティ

    • ユーティリティmap3は頭いいなぁ。こういうのがすいすいかけるようになるとCL使いこなしてるという感じがする。

      (defun map3 (fn lst)
      (labels ((rec (curr prev next left)
      (funcall fn curr prev next)
      (when left
      (rec (car left)
      curr
      (cadr left)
      (cdr left)))))
      (when lst
      (rec (car lst) nil (cadr lst) (cdr lst)))))

      (map3 #'(lambda (&rest args) (princ args))
      '(a b c d))
      ;; (A NIL B)(B A C)(C B D)(D C NIL)
      ;; => NIL

      (map3 #'(lambda (c p n)
      (princ c)
      (if n (princ " | ")))
      '(a b c d))
      ;; A | B | C | D
      ;; => NIL


  • 実践CLでのHTMLの取り扱いは、HTMLタグを表すのにキーワードシンボルを使いつつ、HTML自身をS式で表した上でそれの操作をやっていた。ANSI-CLでの取り扱いは、HTMLタグを書き出す関数やマクロを用意して、それらを使えば何を出力するかはCLで述できるから柔軟でしょ、という方式だ。ANSI-CLの方がライトにいろいろ使える感じで、本腰いれるなら実践CL的な感じかな。

こつこつ。

【ANSI-CL】15 例:推論

写経しつつ、雰囲気はわかった。詳細を理解するには結構ごりごり調べる必要があるな。それは二周目。
こつこつ。

【ANSI-CL】14 進んだ話題から


  • 14.4 パッケージ

    • 「パッケージが分かりにくいとしたら、主な理由はこれである。パッケージは、オブジェクトではなく名前に基づいて作られているのである」 なるほど。自分としてはパッケージの理解に困難はないが、このようにコンパクトに表現されているとためになる。

  • 14.5 loopの機能

    • PGは拡張loop否定派なのですね。
    • 拡張loopの整形についてemacsがちょっと変。C-jで書いていくときに整形が奇妙だ。C-M-qまたはC-]ではそこそこきれい。ただし、意図通りになっていないこともある。拡張loopの構文の複雑さからかな。これ実践CLを写経したときと同じことを考えているような。進歩なし?
    • 拡張loopに括弧がないから嫌だ、というのではなくて、仕様が曖昧だからやめとけ、というPGの意見はまっとうに感じる。


  • この「進んだ話題から」にてPGは、「これらの機能はユーザはほとんど使わないが」というようなコメントをつけつつ説明している。実践CLは、PGのこの姿勢に対するアンチテーゼとして書かれたと思える。

次回からチュートリアルな章へ。まずは「15 例:推論」。
こつこつ。

【ANSI-CL】13 スピード


  • ACLでは型指定しないほうがコンパイルしてもしなくても若干速かった。ほぼ変わらない、かな。型指定なしでも最適化がされているのか、型指定ありでも最適化がされていないのか。二周目にしらべるかなぁ。
  • そうか。CLでの関数の多さというのは、柔軟性と高速性の両立のための選択肢として、なのか。このような取組みはSchemeではないな。しかし、それらの一部は、処理系が成熟していくにあたって不要になりつつあるものもある。なので、V8とかがでてきている状況ではCLのようなケアは不要になりつつあるのかもしれない。
  • 「仕様があいまいでないとしたら、それは仕様ではない」 おおきく同意。

こつこつ。

【ANSI-CL】12 データの構造

さすがに疲れてきたが、がんばってみる。めったに使わないが、気合というのを入れてみよう。

  • 定数的データ構造を保全せよ、というのは目から鱗。ひとつ賢くなった。
  • この章おもしろいな。二周目でごりごりいじってみるのが楽しみ。

こつこつ。

2008年11月7日金曜日

【ANSI-CL】11 CLOS

要点を押えたいい感じの説明。新しい話題はないのでさくっと完了。

【ANSI-CL】10 マクロ


  • 10.5 マクロ設計

    • 「コンパイラに渡る内容に変更を加えられるというのは、コンパイラを書き換えられるのとほとんど一緒である。」なるほど。

  • define-modify-macro、初めて知ったか失念していたか。ひとつ賢くなった。

こつこつ。

【ANSI-CL】9 数値


  • 数値計算はCL入門で結構やったので食傷ぎみ。。。
  • レイトレーサも二周目おくりに。

今日どこまでいけるかな?

【ANSI-CL】8 シンボル


  • 前の方で心配したシンボルと変数の関係の説明が、「8.7 シンボルと変数」でちゃんと書いてあった。
  • シンボルとパッケージはあっさり、だな。
  • 例をあじわうのは2周目ということで写経。

こつこつ。

【ANSI-CL】7 入出力


  • ストリング置換を完全には理解できていない。Cでアルゴリズムやったときに出てきたやつなのはわかるのだが。これは二周目にちゃんと理解することにする。
  • read macroはえらいあっさりだな。

こつこつ。

2008年11月6日木曜日

【ANSI-CL】6 関数

昨日は昼間はセミナーに強制参加。セミナー自体は簡単なものだったので、暇な時間は有効活用しようとANSI-CLのコピーをもっていった。しかし、手を動かしながらじゃないと、まったく頭に入ってこないことに気付いた。進化しているのか、退化しているのか。

  • Dylanの関数ビルダっておもしろい。

次回は、7 入出力。こつこつ。

2008年11月4日火曜日

【ANSI-CL】5 制御構造

ANSI-CLくらいの難易度ならば、仕事の合間にちょこちょこできる。インターリーブ。

最後の「5.7 例:日付計算」が多少ぐだぐだになったが、なんとか5章がおわった。今日、一章進めたのは大きい。こつこつ。

【ANSI-CL】4 特別なデータ構造 (その2)

仕事の休憩時間に。

  • CLでのBST、勉強になるなぁ。さきざき時間があったらCのBSTとかとじっくり比較検討したいなぁ。

というわけで、次回は5 制御構造。こつこつ。

【ANSI-CL】4 特別なデータ構造


  • ここまでで、CL入門とくらべると、紹介されている関数の数が倍くらい多い感じ。そういや実践CLでやったなぁ、と思い出すものも多い。CLtL1とANSIとの差なのかな? CL入門が入門書として配慮したたのかな? いずれにしても、CL入門はその分本質に集中できてよかったな、という感慨。ANSI-CLは、そういう意味でCL入門とかぶらないところがけっこうあるので、続いて読んでお得な感じ。
  • 二分探索木だけ残して完了。なぜか今日はBSTの気分じゃない。不思議なもんだ。

今日は連休明けで仕事がパンパン。しかし今週一週間で、なんとかANSI-CLの通読をおえたいなぁ。

とりあえず、寝よう!

2008年11月3日月曜日

【ANSI-CL】3 リスト


  • なんとなくPG調、というのがわかってきた。これはこれで軽快な感じでいいなぁ。

  • 3.3 なぜLispにはポインタがないか

    • ここの変数とポインタの説明はちょとあやうい。まちがいではないが。
    • 例では大域環境(の中の動的環境)を使っているので、symbolがその環境で変数として機能するとして、その値たるオブジェクトへの参照をsymbol objectが保持しているという意味ではそうなんだけど、それはレキシカルではまた話が違うので。

  • 広さ優先探索のコードを追うのにちょっと手間どったが、traceがいい感じにやくだった。

【ANSI-CL】2 Lispの世界へようこそ


  • うーん。説明が粗い。。。
  • これで初心者が理解できるのかなぁ。少なくとも私はCL入門をやったから、ひとつひとつ読み替えて理解できる。この本から入った人は入った人で、これで理解できのかも?
  • 「関数プログラミングの最も重要なメリットは、対話的テストができることである。」そうだったんだ。
  • lambdaなんぞや? というところの説明がいまいち理解できない。これは後の関数の章で考えよう。


悩んだが、初回は問題をやらずに通読することにしてみよう。

【ANSI-CL】1 導入

はじめちょろちょろ。

  • 「マクロとクロージャと、データ型の実行時指定とによって、Lispはオブジェクト指向プログラミングを超える」 うーん。わからない。。。
  • 「どの言語を使ってもプログラムはボトムアップに書けるが、Lispはこのスタイルに対して最も自然な媒体となる」 これもわからん。。。

  • この章は、初心者への口説き文句の章だな。