Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-04-03

またふらふらとCADRでなにかする

| 19:08 | またふらふらとCADRでなにかする - わだばLisperになる を含むブックマーク はてなブックマーク - またふらふらとCADRでなにかする - わだばLisperになる

メインの環境を64bit Linuxにしてから、CADRエミュレータが上手く動かなくなっていたので放置していたのですが、Ubuntuの場合ia32-libsをインストールすれば、面倒もなく32bit版で動くことが分かったので、またいじり始めてみることにしました。

以前のエントリでは、ダウンロードから導入、ちょっとした開発環境の説明を書きました(CADRカテゴリーに纏めてあります)が、

今年は、もう一歩踏み込んでみたいところ。

目標としては、Flavorsなどを使ってプログラミングするところ位まで探究できたら良いなと思っています。

配布されているMIT CADRエミュレータの場合、初期のマニュアルに説明のある機能が無かったりしますので、結構初期のLisp Machine Lispのようです。

とりあえず今日は久し振りに使ってみるということで、前々から試してみたかった、ZMACSへのコマンドの追加を試してみたいと思います。

ZMACSは、Lispマシンで動くEMACSで、オリジナルのEMACSとほとんど同時期の1976年に開発がスタートしたようです。

最初は、EINE(Eine Is Not EMACS)という名前で、その後、ZWEI(Zwei Was Eine Initially)という名前になり、Zmacsへ、という流れになります。

Lispマシンは全面的にLispで記述されているので、当然その上で動くZMACSもLispで記述されています。LISPで記述されているということは、最初からLISPで拡張可能なわけで、恐らくLISPで拡張可能なエディタとしては、ZMACSが一番最初のものなのではないでしょうか。Multics EMACSは、1978年で、Multics EMACSの作者もZMACSの方が先に存在してたと言ってましたし…。

それはさておきZMACSの拡張コマンドですが、DEFCOMという対話操作拡張用のマクロが用意されているのでそれを使ってみます。

作るコマンドですが、自分は、普段ダブルクオートをM-"のキーバインドで、対で入力しています。

EMACSでは、幾つかこの様な入力方法を実現する方法があるのですが、ZWEIにもCOM-MAKE-()という、括弧を対で入力する関数があるので、これをちょっといじって作ってみました。

この関数は数引数を受けとることにより、任意の式をまたいで囲むことができます。

(pkg-bind "zwei"
  (DEFCOM COM-MAKE-/"/" "Insert matching delimiters, putting point between them.
With an argument, puts that many s-exprs within the new /"/"." ()
    (LET ((OPEN #/") (CLOSE #/")
          (MOVER 'FORWARD-SEXP) (POINT (POINT)))
      (DO ((CH (LDB %%CH-CHAR *LAST-COMMAND-CHAR*))
           (L *MATCHING-DELIMITER-LIST* (CDR L)))
          ((NULL L))
        (COND ((OR (= CH (CAAR L)) (= CH (CADAR L)))
               (SETQ OPEN (CAAR L) CLOSE (CADAR L) MOVER (CADDAR L))
               (RETURN T))))
      (LET ((BP (IF *NUMERIC-ARG-P*
                    (OR (IF (EQ MOVER 'FORWARD-SEXP)
                            (FORWARD-SEXP POINT *NUMERIC-ARG* NIL 0 NIL T T)    ;No UP
                          (FUNCALL MOVER POINT *NUMERIC-ARG*))
                        (BARF))
                  POINT)))
        (AND (MINUSP *NUMERIC-ARG*) (PSETQ BP POINT POINT BP))
        (INSERT BP (IN-CURRENT-FONT CLOSE))
        (INSERT-MOVING POINT (IN-CURRENT-FONT OPEN))
        DIS-TEXT)))
  )

ちょっとした説明

  • EMACSとZMACSの違い

上記のコードを眺めるとGNU Emacsとは結構違っていることが分かると思います。Hemlockや、LispWorksのエディタ、Climacs等これに近いのですが、恐らく、ZMACSから影響を受けていて、ZMACS系とも呼べると思います。

  • pkg-bind
    • ボディ部は指定したパッケージ内で評価されます。上記の場合、"ZWEI"パッケージ内で評価されています。Lispマシンの場合、ファイルの一行目にパッケージを記述することで、指定することができるのですが、この方法を発見したので試しに使ってみています。

それで、定義した関数をどうっやってキーバインドに割り付けるかですが、

割り付けには、SET-COMTABやSET-COMTAB-RETURN-UNDOを使用します。

自分は、初期化ファイルで設定するので、ログアウトしたらアンドゥされるように、SET-COMTAB-RETURN-UNDOを使ってみています。

(login-eval
 zwei:(set-comtab-return-undo *standard-comtab* '(#^C/" com-make-/"/"))) ;^Cはコントロール文字

という風にホームディレクトリのlispm.initに記述すれば、M-"でcom-make-""が呼び出されるようにログイン時に初期化されます。

ちなみに、パッケージの指定方法が不思議な感じになっていますが、こういう風にも書けたみたいです。

zwei:(set-comtab-return-undo *standard-comtab* '(#^C/" com-make-/"/"))
=>
(zwei:set-comtab-return-undo zwei:*standard-comtab* '(#^C/" zwei:com-make-/"/"))

ということのようなのですが詳細はまだ、良く分かっていません。pkg-bindの略記方法なのかもしれませんが、便利といえば便利なような。

という感じで、ふらふらとしばらくMIT CADRを使ってみようと思います。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20080403