2009年1月12日月曜日

【ELp入門】14 defun 内の単語の数え上げ

ここまでやってきて感じるのは、Emacsというのは本当に副作用ゴリゴリだな、ということ。別にだから嫌だとか、悪いということではない。とにかく事実としてゴリゴリ。Elispというlisp層で書いてはいるが、それはなんというか指圧で体調をコントロールしようとしているような感じであり、体表を押すことが目的ではなく、その結果として体内の気脈と血脈をコントロールするということが目的だが、目的を実現するには体表を押すしかないというイメージ。CLプログラミングの場合は、もっと直にコントロールしようとしているものを触っているというか中に入りこんでいるように感じる。

さて、そろそろ最終局面。


  • 前説

    • 要旨:ヒストグラムを出力する関数をつくりたい。対象は関数に含まれる単語(とシンボル?)の数。

  • 14.1 何を数えるか?

    • 要旨:文字列に含まれる単語を数える。またシンボルも数える。

  • 14.2 単語やシンボルを構成するものは何か?

    • 構文テーブル(Syntax Tables)の話。
    • 構文テーブルは重要な気がする。EmacsリファレンスマニュアルやEmacs Lispリファレンスマニュアルを参照して、要点を自分なりにまとめる。

      • readerは構文テーブルを使わない。構文テーブルはテキスト内をElispで動き回るために使われる。
      • 構文テーブルはバッファローカルである。
      • 典型的には、メジャーモード毎に独自の構文テーブルがあり、モード起動時にそのバッファに構文テーブルをインストールする。
      • 構文テーブル間には継承関係を設定できる。

      • 構文テーブルは、各文字の構文クラスを指定する。
      • 構文クラスの文字への割当ては排他的である。ひとつの文字はひとつの構文クラスにのみ属する。
      • 構文記述子は、「構文クラス、(括弧のクラスの場合に使われる)釣り合う文字、構文フラグ」の3つの組み合わせを指定するニーモニックである。(例: Cモードにおける文字#の構文記述子は23。23は「句読点、釣り合う文字なし、コメント開始の二番目の文字、コメント終了の最初の文字」を表す)
      • 構文テーブルは関数sytanx-tableで取得できる。
      • 構文テーブルの印字は、#^[ ... ]だった。#^って何だろ? ベクター? 調べる。ベクター型は、[ ... ]。#^[ ... ]は文字テーブル型。文字コードでインデックスされる。
      • 構文クラスの一覧は次のとおり。

        • 白文字 (whitespace character)
        • 単語構成文字 (word constituent)
        • シンボル構成文字 (symbol constituent)
        • 句読点文字 (punctuation character)
        • 開き括弧文字 (open parenthesis character)
        • 閉じ括弧文字 (close parenthesis character)
        • 文字列クォート (string quote)
        • エスケープ (escape)
        • 文字クォート (character quote)
        • 対になった区切り (paired delimiter)
        • 式前置子 (expression prefix)
        • 継承 (inherit)
        • 汎用コメント区切り (generic comment delimiter)b
        • 汎用文字列区切り (generic string delimiter)

      • 構文フラグは、複数の文字からなるコメント区切りの指定に使う。
      • 構文テーブルの中で、文字に対して別の構文テーブルを指定することもできる。

      • 構文クラスよりも柔軟な構文定義として、カテゴリがある。カテゴリはカテゴリテーブルで定義される。
      • カテゴリテーブルはバッファローカルである。
      • カテゴリテーブルは、文字テーブルである。
      • カテゴリテーブルの要素は、ブールベクトルである。ブールベクトルの値によってその文字が属するカテゴリを指定する。
      • カテゴリの指定は排他的ではない。
      • クラスは上記のように仕様で語彙が定義されているが、カテゴリは仕様では定義されていない。ユーザが独自に定義して使うのか?

    • おもしろいなぁ。こういう仕組みになっているんだ。ひとつの観点では、Emacsの編集機能はルールベースになっているといえるな。構文テーブルがルールを記述している。そして各バッファでそれが設定されて、関数がルールを解釈してそのバッファのテキストに対して動作する、ということ。
    • さて、戻る。
    • この本では、クラスとカテゴリが上記の定義に比して混乱している。おそらく、Ver.18〜19あたりでは、クラスの別名としてカテゴリを使っているようだ。そしてクラスは排他的ではなくカテゴリ的な性質をもっているようだ。

  • 14.3 関数 count-words-in-defun

    • 特になし。

  • 14.4 ファイル内の複数のdefunsの数え上げ

    • 「問題をこのように文章にすることは、関数定義の基本である。」

  • 14.5 ファイルを探す

    • 特になし。

  • 14.6 lengths-list-fileの詳細

    • ユーザフレンドリならば、対象とするバッファについてナロウイングの復帰に加えてsave-excursionしたほうがよさげ。

  • 14.7 別のファイルのdefunx内の単語の数え上げ
  • 14.8 別のファイルの再帰による単語の数え上げ
  • 14.9 グラフ表示用データの準備

    • この3節はあっさり。


こつこつ。

0 件のコメント: