ラベル ELp入門 の投稿を表示しています。 すべての投稿を表示
ラベル ELp入門 の投稿を表示しています。 すべての投稿を表示

2009年1月12日月曜日

【ELp入門】18 結論

この章は2ページしかない。今後のEmacs Lispへの取組み方の提案が書かれている。参考になる。ふと感じたのはInfoの使いこなしをやってみたいな、ということ。あまり日頃の作業の中でInfoを使えていない。Emacs LispリファレンスマニュアルとかもInfoにあるので、もっと日常的に使っていきたい。

やってみて、ElispというかEmacsはとてもおもしろかった。
やっと、Emacsを使いこなしていくスタートポイントにたてた気がする。

さて、付録は今回はやらないことにする。また機会があったら、演習と付録含めて通読したい。
今後は、ソースを読んだりカスタマイズしていく実践と、次の課題図書を読むことの二本立てにする予定だ。

こつこつ。

【ELp入門】17 デバッグ


  • 17.1 debug

    • 私のEmacsではdebug-on-errorがはじめからtになっているようだ。22だから? それともcarbon emacsのメンテナかな?


  • 17.2 debug-on-entry

    • M-x debug-on-entry RET function RET でその関数に入るとデバッガが起動できるんだ。しらなかった。


  • 17.3 debug-on-quit

    • おお。これは無限ループのデバッグに便利。


  • 17.4 ソースレベルのデバッガ edebug

    • おお。edebugは、ソースにそって評価をトレースできるんだ。
    • ACLでもeliで確かできたはずだがまだ使っていない。


あれ? まだ一章あった。
こつこつ。

【ELp入門】16 個人用ファイル .emacs


  • 16.1 サイト全体の初期化ファイル

    • 自分なりにまとめる。

      * elisp: [emacs][elisp]Emacsの起動ファイル
      ダンプ版を作成するときにロードされるファイル。
      site-load.el
      site-init.el

      ディストリビューションのINSTALLにこれらの説明がある。

      起動時の初期化ファイルの読み込み。

      site-start.el -> ~/.emacs -> default.el and 端末タイプファイル

      ディストリビューションのlisp/loaddefs.elにこれらへの助言がある。


  • 16.2 一回だけの作業用の変数の設定

    • edit-optionsってどうやって起動するんだろう?

  • 16.3 ファイル.emacs入門

    • C-cに単一文字を続けるキーバインドは、個人用。Emacs拡張者(モード作成者など)はこれを使ってはいけない。

  • 16.4 TextモードとAuto Fillモード

    • 特になし。

  • 16.5 メールの別名

    • 特になし。

  • 16.6 Indent Tabsモード (タブによる字下げ)

    • 特になし。

  • 16.7 キーバインド例

    • C-xfの誤打鍵。あるある。

  • 16.8 ファイルのロード

    • 特になし。

  • 16.9 オートロード

    • 特になし。

  • 16.10 簡単な拡張:line-to-top-of-window

    • 特になし。

  • 16.11 キーマップ

    • 特になし。


章としては次が最後。こつこつ。

【ELp入門】15 グラフの準備

前章の復習をした。それから15章を開始。
*を並べてグラフを作るのは、C言語の勉強で山のようにやった記憶が。

  • 前説

    • 所感:なんとなくだが、この本のプログラミングスタイルは「中間データとしてリストを用いる」という感じがする。すなわち、私だと、おおもとのデータから最終データ(リストでないもの)をいっきに生成しようと手続きを考えるところもいったん途中でリストを生成してそれを最終データにもっていくということ。こういうのもありといえばあり。基本リストであると決めてしまえば、補助関数の入出力も考えやすいし、再利用も考えやすい。
    • 雑感:「リスト遊び」を勉強したときに、繰返しに関する章では、代入ばっかで気持ち悪いと書いた。それはEmacsの中身のelispコードが代入ばっかりなことを反映していたんだなぁ。
    • (apply 'max '(4 8 5))。'maxなんだな。

  • 15.1 関数 graph-body-print

    • 特になし。

  • 15.2 関数 recursive-graph-body-print

    • 特になし。


こつこつ。

【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節はあっさり。


こつこつ。

2009年1月11日日曜日

【ELp入門】13 数え上げ:繰り返しと正規表現


  • 前説

    • 繰り返しと正規表現の探索は、Elispでよく使うよ。(多分この組み合わせをよく使うということだと思われる)
    • この章では、領域内の単語数を数える関数を作るよ。

  • 13.1 関数 count-words-region

    • 「どの文字が単語を構成し、どの文字が単語を構成しないかは、バッファのシンタックステーブルで決まる」なるほど。

  • 13.2 再帰による単語の数え上げ

    • 特になし。


こつこつ。

【ELp入門】12 正規表現の探索

Elispに少し重点を置く。理由はいくつか。

  • CLでプログラミングするにしても、CLだけではすまない。WebアプリならHTMLも書くし、Ajaxやるなら、CSSもJavaScriptもやる。JSONも書く。DBにつなぐならSQLも書く。それらを設置するのはUNIXの上なので、Shell scriptも書いたりする。IMAPするならMIMEを扱う。そしてそういうもののフロントエンドとなっているのがEmacsなので、Emacsをどれだけ理解していてコントロールできるかが、どれだけ快適に開発作業ができるかの鍵になってくる。
  • S式の編集機能についてeliはどうやらslimeに遅れをとっているようだ。なので、slime的な機能をeliから使えるようにしたい。これはCLのコードの編集速度に大きく影響すると思う。

なので、「CLを勉強しよう」ということではなくて「CLでアプリをつくろう」となると、途端に「もうちょいEmacsを手なづけねば」と思えてしまう。

さて12章。


  • 前説

    • Emacsでは正規表現が多用されている。

  • 12.1 sentence-endのための正規表現

    • 「括弧と縦棒のまえには2つのバックスラッシュ\\が必要である。」いや、そうなのだが、それはElispでは正規表現を文字列で表現しているためそうなるということを説明しないと読者は混乱する。
    • sentence-endはソースとしては、emacs-22.3/lisp/textmode/にある。

  • 12.2 関数re-search-forward

    • 翻訳がすこし不器用。

  • 12.3 forward-sentence

    • これもソースとしては、emacs-22.3/lisp/textmode/にある。

  • 12.4 forward-paragraph : 関数の宝庫

    • forward-paragraph、長い。。。S-expを指定した深さでshrink/expandできる機能があるといいなぁ。
    • Emacsの文字は整数である。すなわちCL的ではなくC的であるということ。
    • 文字リテラルは?aなどである。#\aであるCLとは違う。

  • 12.5 専用タグファイルの作成方法

    • 開発時のTAGの運用もそのうち整理しないと。


こつこつ。

2009年1月10日土曜日

【ELp入門】11 ループと再帰


  • 11.1 while

    • そうなのだ。whileは常に副作用のために評価されるのだ。

  • 11.2 再帰

    • お、C-uC-xC-eで、副作用出力も*scratch*に出せるんだ。


ページ数は16とそこそこだが、さすがにループと再帰はそこそこやってきているので、さくっと。

こつこつ。

【ELp入門】10 テキストの取り出し方


  • kill-ringとかkill-ring-yankなどを*scratch*で見ると興味深い。
  • emacsでは*scratch*などをつかっていつでもinspectできるということが、知識としてはわかっていても活用はできていない現状。

3ページしかないので、あっさり。

2009年1月8日木曜日

【ELp入門】9 リストの実装方法


  • 要点:LISPのリストはポインタ対を用いている。
  • 要点:シンボルに様々な情報を記録することができる。

4ページしかないので。
こつこつ。

【ELp入門】8 テキストのカットと保存


  • 前説

    • バッファからテキストをkillするとkill ringというリストに格納される。yankするとkill ringからテキスト要素が返される。
    • 本章では、kill ringとzap-to-char関数について説明する。

  • 8.1 zap-to-char

    • 第22版での関数の実装

      (defun zap-to-char (arg char)
      "Kill up to and including ARG'th occurrence of CHAR.
      Case is ignored if `case-fold-search' is non-nil in the current buffer.
      Goes backward if ARG is negative; error if CHAR not found."
      (interactive "p\ncZap to char: ")
      (if (char-table-p translation-table-for-input)
      (setq char (or (aref translation-table-for-input char) char)))
      (kill-region (point) (progn
      (search-forward (char-to-string char) nil nil arg)
      ; (goto-char (if (> arg 0) (1- (point)) (1+ (point))))
      (point))))

    • 関数の本体は(kill-region point-a point-b)。point-aからpoint-bまでの領域をkillする。
    • search-forwardは、pointを移動するという副作用を目的とした関数である。

  • 8.2 kill-region

    • 第22版での実装は多少長くなっているようだ。

      (defun kill-region (beg end &optional yank-handler)
      "Kill (\"cut\") text between point and mark.
      This deletes the text from the buffer and saves it in the kill ring.
      The command \\[yank] can retrieve it from there.
      \(If you want to kill and then yank immediately, use \\[kill-ring-save].)

      If you want to append the killed region to the last killed text,
      use \\[append-next-kill] before \\[kill-region].

      If the buffer is read-only, Emacs will beep and refrain from deleting
      the text, but put the text in the kill ring anyway. This means that
      you can use the killing commands to copy text from a read-only buffer.

      This is the primitive for programs to kill text (as opposed to deleting it).
      Supply two arguments, character positions indicating the stretch of text
      to be killed.
      Any command that calls this function is a \"kill command\".
      If the previous command was also a kill command,
      the text killed this time appends to the text killed last time
      to make one entry in the kill ring.

      In Lisp code, optional third arg YANK-HANDLER, if non-nil,
      specifies the yank-handler text property to be set on the killed
      text. See `insert-for-yank'."
      ;; Pass point first, then mark, because the order matters
      ;; when calling kill-append.
      (interactive (list (point) (mark)))
      (unless (and beg end)
      (error "The mark is not set now, so there is no region"))
      (condition-case nil
      (let ((string (filter-buffer-substring beg end t)))
      (when string ;STRING is nil if BEG = END
      ;; Add that string to the kill ring, one way or another.
      (if (eq last-command 'kill-region)
      (kill-append string (< end beg) yank-handler)
      (kill-new string nil yank-handler)))
      (when (or string (eq last-command 'kill-region))
      (setq this-command 'kill-region))
      nil)
      ((buffer-read-only text-read-only)
      ;; The code above failed because the buffer, or some of the characters
      ;; in the region, are read-only.
      ;; We should beep, in case the user just isn't aware of this.
      ;; However, there's no harm in putting
      ;; the region's text in the kill ring, anyway.
      (copy-region-as-kill beg end)
      ;; Set this-command now, so it will be set even if we get an error.
      (setq this-command 'kill-region)
      ;; This should barf, if appropriate, and give us the correct error.
      (if kill-read-only-ok
      (progn (message "Read only text copied to kill ring") nil)
      ;; Signal an error if the buffer is read-only.
      (barf-if-buffer-read-only)
      ;; If the buffer isn't read-only, the text is.
      (signal 'text-read-only (list (current-buffer)))))))

    • kill-regionのある意味本体は、filter-buffer-stringとkill-newに移ったようだ。

      (defun filter-buffer-substring (beg end &optional delete noprops)
      "Return the buffer substring between BEG and END, after filtering.
      The buffer substring is passed through each of the filter
      functions in `buffer-substring-filters', and the value from the
      last filter function is returned. If `buffer-substring-filters'
      is nil, the buffer substring is returned unaltered.

      If DELETE is non-nil, the text between BEG and END is deleted
      from the buffer.

      If NOPROPS is non-nil, final string returned does not include
      text properties, while the string passed to the filters still
      includes text properties from the buffer text.

      Point is temporarily set to BEG before calling
      `buffer-substring-filters', in case the functions need to know
      where the text came from.

      This function should be used instead of `buffer-substring',
      `buffer-substring-no-properties', or `delete-and-extract-region'
      when you want to allow filtering to take place. For example,
      major or minor modes can use `buffer-substring-filters' to
      extract characters that are special to a buffer, and should not
      be copied into other buffers."
      (cond
      ((or delete buffer-substring-filters)
      (save-excursion
      (goto-char beg)
      (let ((string (if delete (delete-and-extract-region beg end)
      (buffer-substring beg end))))
      (dolist (filter buffer-substring-filters)
      (setq string (funcall filter string)))
      (if noprops
      (set-text-properties 0 (length string) nil string))
      string)))
      (noprops
      (buffer-substring-no-properties beg end))
      (t
      (buffer-substring beg end))))


      (defun kill-new (string &optional replace yank-handler)
      "Make STRING the latest kill in the kill ring.
      Set `kill-ring-yank-pointer' to point to it.
      If `interprogram-cut-function' is non-nil, apply it to STRING.
      Optional second argument REPLACE non-nil means that STRING will replace
      the front of the kill ring, rather than being added to the list.

      Optional third arguments YANK-HANDLER controls how the STRING is later
      inserted into a buffer; see `insert-for-yank' for details.
      When a yank handler is specified, STRING must be non-empty (the yank
      handler, if non-nil, is stored as a `yank-handler' text property on STRING).

      When the yank handler has a non-nil PARAM element, the original STRING
      argument is not used by `insert-for-yank'. However, since Lisp code
      may access and use elements from the kill ring directly, the STRING
      argument should still be a \"useful\" string for such uses."
      (if (> (length string) 0)
      (if yank-handler
      (put-text-property 0 (length string)
      'yank-handler yank-handler string))
      (if yank-handler
      (signal 'args-out-of-range
      (list string "yank-handler specified for empty string"))))
      (if (fboundp 'menu-bar-update-yank-menu)
      (menu-bar-update-yank-menu string (and replace (car kill-ring))))
      (if (and replace kill-ring)
      (setcar kill-ring string)
      (push string kill-ring)
      (if (> (length kill-ring) kill-ring-max)
      (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
      (setq kill-ring-yank-pointer kill-ring)
      (if interprogram-cut-function
      (funcall interprogram-cut-function string (not replace))))

    • そして、C関数として、delete-and-extract-regionを使うようだ。(delete-regionではない)

  • 8.3 delete-region : Cへの回り道

    • さはさりなんで、delete-regionをみてみる。
    • editfns.cに含まれている。
    • そうか。EmacsというのはElispインタプリタの上に書かれているというのがちょっとはばかられるほど、Cで書かれている部分がありそうだ。

  • 8.4 defvarによる変数の初期化

    • defvarの紹介。
    • elispは動的スコープしかないので、あっさり。

  • 8.5 copy-region-as-kill

    • kill-apped, kill-newのことは、上記のとおり、kill-regionにも含まれている。

      (defun copy-region-as-kill (beg end)
      "Save the region as if killed, but don't kill it.
      In Transient Mark mode, deactivate the mark.
      If `interprogram-cut-function' is non-nil, also save the text for a window
      system cut and paste."
      (interactive "r")
      (if (eq last-command 'kill-region)
      (kill-append (filter-buffer-substring beg end) (< end beg))
      (kill-new (filter-buffer-substring beg end)))
      (if transient-mark-mode
      (setq deactivate-mark t))
      nil)

    • そしてkill-ringに関する処理は、kill-newに移っている。


こつこつ。

2009年1月7日水曜日

【ELp入門】7 基本関数 car, cdr, cons


  • 7.1 car と cdr

    • おお? 配列はアトムなんだ。ためす。

      ;; lisp interaction mode
      (setq a [a b c])
      [a b c]
      (atom a)
      t

      ほんとだ。

  • 7.2 cons

    • 特になし。

  • 7.3 nthcdr

    • 特になし。

  • 7.4 setcar

    • 特になし。

  • 7.5 setcdr

    • 特になし。


さすがに簡単すぎるので次章にこのまま入る。

2009年1月6日火曜日

【ELp入門】6 ナロイングとワイドニング


  • 前説

    • ナロイングとワイドニングって、日頃自分で使っていないが、interactiveなんだっけ?
    • 入門GNU Emacsの索引には無い。
    • GNU Emacs Manual (for ver.21, printed)には、あった!interactiveだ。
    • C-x n nでregionをnarrowing。C-x n wでbufferをwideningだ。ただし、現22系だと、初心者が混乱する、というコーションがでる。


  • 6.1 スペシャルフォーム save-restriction

    • save-excursionとsave-restrictionの順番。

      • save-excursionはポイントとマークの位置を記憶して、処理終了後にそれらを復旧する。
      • save-restrictionはナロウイングの位置を記憶して、処理終了後にそれらを復旧する。
      • 両方使うときは、(save-excursion (save-restriction ...))とすべき。なんで?
      • 本書に記載されている説明がいまいちわからない。とりあえず進む。



  • 6.2 what-line

    • what-lineの紹介。


年始の多忙ななか、少しでも進めたことに感謝。

2009年1月4日日曜日

【ELp入門】5 多少複雑な関数


  • 5.1 copy-to-bufferの定義
  • 5.2 insert-bufferの定義
  • 5.3 beginning-of-bufferの完全な定義

    • 前章と同様、関数の実装はずいぶん変わっているが、ここで説明している調べ方で調べれば理解することができる。
    • 日頃自分が使っているエディタの中身についてこのように手軽にコードを読めてしかもそれが改変可能というのはとても勉強になると思う。しかもそれがLispであり、実行イメージに動的かつ即時に変更を投入できる。おしむらくは、これがCLではないことだけど、それでも他では得難い資産じゃなかろうか。


こつこつ。

【ELp入門】4 バッファ関連の関数


  • 前説

    • 要旨:本章ではバッファ関連の4つの関数をウォークスルーする。

  • 4.1 詳しい情報を得る

    • 関数のソースを探すにはfind-tagsを使う。
    • Lispコードを収めたファイルのことをライブラリという。

  • 4.2 beginning-of-bufferの簡略した定義
  • 4.3 mark-whole-bufferの定義
  • 4.4 append-to-bufferの定義

    • 現行のEmacsのこれらのソースはずいぶん複雑になっている。でも、ここで紹介されている方法で解析していけば理解することができた。ありがたい。


こつこつ。

2009年1月2日金曜日

【ELp入門】3 関数定義の書き方


  • 前説

    • 「関数定義を持つシンボルを、単に関数と呼ぶ」このように断わっておいてくれるのは初学者にとって親切だ。

  • 3.1 スペシャルフォームdefun

    • Elispでは (defun hoge (piyo) puyo)の(piyo)を引数リスト(argument list)と呼ぶようだ。CLだと正式にはパラメータリストで、歴史的にいうとラムダリストもあり。

  • 3.2 関数定義のインストール

    • defunを評価すると関数がインストールされる。

  • 3.3 関数を対話的にする。

    • スペシャルフォームinteractiveの紹介。
    • 「対話的関数を呼び出すのは、(中略)副作用のためであり」 なるほど。

  • 3.4 interactiveの他のオプション

    • interactive、便利だなぁ。関数にまつわるEmacs的インターフェイスは、ほぼこれで尽きてるんじゃないか???

  • 3.5 コードの恒久的インストール

    • ファイルの中のコードはloadで読み込めるようだ。

  • 3.6 let

    • スペシャルフォームlet。
    • 普通の使い方では特にCLとの違いはなし。ただし、progvは存在しないし、そのエクステントは動的なんだろう。(調べてはいない)

  • 3.7 スペシャルフォームif
  • 3.8 If-then-else式

    • if-thenとif-then-elseを個別に順番に説明するのは丁寧だ。
    • シンボルの比較にequalを使うのは不自然だ。
    • CLとの有意な違いはなし。

  • 3.9 Lispの真偽値

    • CLとの有意な違いはなし。

  • 3.10 save-excursion

    • save-excursionは関数。
    • save-excursionはwith-excursionという感じだな。


こつこつ。

2008年12月31日水曜日

【ELp入門】2 評価の練習


  • この本、翻訳はそんなによくない。ま、気にしない、まったりまったり。

  • 前説

    • Emacsでキーをタイプすると、関数が実行される。これがEmacsの動作機構。
    • キーに紐付けられている関数は、対話的関数とかコマンドと呼ぶ。
    • 式を評価する方法は、紹介済みのC-xC-eを基本に、他のものにも触れる。

  • 2.1 バッファ名
  • 2.2 バッファの取得

    • M-:って便利だなぁ。
    • buffer-name, buffer-file-name, current-buffer, switch-to-buffer, set-buffer, other-buffer, buffer-size, point, point-max, point-minなどなど。
    • まあ、これらはCLには無いわな。CLIMAXならあるかもだけど。


この章、短い。こつこつ。

2008年12月30日火曜日

【ELp入門】1 リスト処理


  • 1.1 Lispのリスト

    • うーん。強引な導入。
    • C-M-\ にてリージョンをインデント。

  • 1.2 プログラムの実行

    • GNU Emacsの内部にはlispインタープリタがあるんだ。なるほど。

  • 1.3 エラーメッセージの生成

    • 執筆時にはなかったようだが、今はデバッガが立ち上がる。qで抜けられる。

  • 1.4 シンボル名と関数定義

    • わかりやすい説明だ。

  • 1.5 Lispインタープリタ

    • シンボルについて、変数の前に関数をやるのはいい感じ。
    • バイトコンパイルすると実行が速くなる。

  • 1.6 評価

    • 副作用の説明。Elispは副作用がおおそうだ。。。

  • 1.7 変数

    • 変数に関数定義を束縛することもできる。

  • 1.8 引数

    • えっと、Emacs 22では、

      (concat "The " (+ 2 fill-column) " red foxes.")

      これはエラー。昔は大丈夫だったようだ。今はnumber-to-stringを使うのだろう。ちなみにCLだと、

      (concatenate 'string "abc" "def")

    • Elispにおいてもdefunの背後にlambdaがいるとすると(いないかもしれないが)、引数にlispオブジェクトを与えると、そのlispオブジェクトを評価した結果が、環境に登録されるということだろう。(elispが環境をもっているかどうはまだわからない)
    • messageってもしかして値を返さないのか??? と思ったら、文字列を返すのね。*scratch*便利。
    • messageってformatみたいなんだな。

  • 1.9 変数への値の設定

    • うーん。。。変数は難しい。ここの記述は確かに間違いではないのだが、変数をちゃんとわかっていないと、ちゃんと理解できない。
    • 変数は、シンボルによる実現と、環境による実現がある。変数への値の束縛については、CLではsetはシンボル専用、setqは両用、lambdaは環境の生成とともに環境用というのが基本だと思う。(ただし、elispに環境があるのかどうかはしらないので、環境が無いならばまた違うかもしれない)
    • CLでは「setqは、setの第一引数のquoteを省略できる版」ではない。elispではそうなのか? ためす。

      ;; CL
      CL-USER(19): (setq hoge 1)
      1
      CL-USER(20): (let ((hoge 10))
      (set 'hoge 2)
      (symbol-value 'hoge))
      2
      CL-USER(21): hoge
      2
      CL-USER(23): (setq hoge 1)
      1
      CL-USER(24): (let ((hoge 10))
      (setq hoge 2)
      (symbol-value 'hoge))
      1
      CL-USER(25):hoge
      1


      ;; EL (*scratch*)
      (setq hoge 1)
      1
      (let ((hoge 10))
      (set 'hoge 2)
      (symbol-value 'hoge))
      2
      hoge
      1
      (let ((hoge 10))
      (setq hoge 2)
      (symbol-value 'hoge))
      2
      hoge
      1

    • ええっと。あまりいい例じゃないけど、ELの方は、setにしろsetqにしろ、letのhogeをみてるんだなきっと。とするとsetqはsetの便利版でいいんだろね。


一章はけっこう長かった。
こつこつ。

【ELp入門】訳者まえがき・はじめに


  • 訳者まえがき

    • そうか、このころ(1995)はmuleはまだ統合されてなかったんだな。
    • 日本語文字列に関する振舞いは進化している。

      (length "abcあいう") ; => 6
      ;(chars-in-string "abcあいう") ; => error。関数がない。
      (string-width "abcあいう") ; => 9


  • はじめに

    • 要旨

      • Emacsは拡張可能なエディタである。
      • より正確には拡張可能な計算環境である。
      • Emacs Lispはそれ自体ひとつのプログラミング言語である。
      • 本書では、GNU Emacsを構成している実際のコードを眺める。
      • 本書は、プログラマでない人向けの初歩の入門書である。
      • GNU Emacs Lispリファレンスマニュアルとは姉妹編である。
      • Emacs LispはMacLispをベースにしている。



こつこつ。

【ELp入門】EmacsLispプログラミング入門を読む

Emacs方面の次の一冊は、EmacsLispプログラミング入門にした。ちょっと古い本だけどいいや。昔一度読んだような気がするがさだかではない。まったり行きたい。