LISPUSER

LISPMEMOLisp is like a ball of mud - you can throw anything you want into it, and it's still Lisp. -- Anonymous

(top)  (memo)  (rss)

はてなダイアリーの Lisper にツッコミ

ぐあー出先からだとメールも更新もできないーと思っていたんですが、 テキストで ReStrurecturedText 形式のファイルを置くだけなんで、 FTP が使えれば ここの更新はできる事に気がつきました。

で、はてなダイアリー界隈に Lisper を多数発見?

MacLisper (http://d.hatena.ne.jp/macLisper/ ) さん

Allegro CL のベンチマークが悪いのは、コンパイルしてないからですよん。 SBCL はインタプリタを持たず、全ての式をコンパイルしてから実行するため このような差が開いてしまいます(設定によってバイトコードインタプリタも使えます)。

tokuhirom (http://d.hatena.ne.jp/tokuhirom/20070327/1174958554 ) さん

マクロって、perl の filter みたいなもんなのね。

紹介されてるテクニックで、Perl でできないものが見当たらない。

use tt ( subs => [qw/foo bar gorch/] );
 
[% FOREACH subname IN subs %]
sub [% subname %] {
   warn "Hi, i'm [% subname %]";
}
[% END %]

no tt;

Perl の Source Filter はソースコード「文字列」に対する処理ですが、Lisp のマクロは文字列から リーダが構築した構文木(= S式)に対する処理です。Perl6 から抽象構文木への操作が可能になると 聞きますので、そちらに近い処理かと思います。

上記の処理は、マクロだとだいたい次のように表現できます。

(defmacro define-functions (lst)
  `(progn
     ,@(loop for name in lst
             collect `(format t "Hi, i'm ~A." name))))

文字列ベースで真に等価な Lisp コードは以下の通りでしょう。

(defvar *code* (apply #'concatenate (cons 'string
                                          (loop for name in lst
                                                   collect (format nil "(defun ~A () (format t \"Hi, i'm ~A.\"))" name name)))))
↓
(loop with pos = 0
      do (multiple-value-bind (expression new-pos)
             (read-from-string *code* nil :eof :start pos)
           (when (eq expression :eof)
             (return))
           (eval expression)
           (setf pos new-pos)))

あるいは、文字列をファイルに出力して、 load 等でも同じです。 どっちかというと Source Filter はリーダーマクロに近いレベルの操作ですね(なんでもありなとことか)。

H3104 (http://d.hatena.ne.jp/H3104/20070322 ) さん

Lispってなんというか、構文木を直にごりごり書いていくようなイメージだな。 普通の手続き型言語の処理系において字句解析、構文解析を経て得られる構文 木を、プログラマが直接書いていくような感じ。抽象度が高いという点におい ては高級なんだろうが、プログラマにコンパイラみたいなことをさせるという 点では低級な気がしないでもない。

Emacs Lisp を勉強中のようですが、素晴しい洞察です!! どうです?この際 Lisp にハマりませんか? Common Lisp でも Scheme でも。ちょっと Emacs Lisp に不満はでるかもしれませんが、相乗効果が期待できますよ。 せっかく Emacs を選んだんですからね。もし、テキスト操作のためだけのエディタであるなら、 vim という選択肢も あるわけです。テキストを操作する、Lisp のコードを編集する、という編集だけの目的なら vim のほうが高速かもしれません。

しかし、構文木をプログラムする、というイメージが出来上がってしまうと、 あらゆるプログラミング言語が、実は Lisp のフロントエンドのようなもので、 そのコンパイラは Lisp に被せたトランスレータのようなものなんじゃないか、 というような気さえしてきた。

これは、特に Lisp に夢中になった初期に出る症状です。まぁ、どんな処理系もソースから構造的な表現に変換される事を 考えれば、あながち間違いとも言えないでしょう。

たとえば、コンパイラに興味のある人は苦労して GCC のフロントエンドを作るわけですが、 それは結局 GCC のコンパイラ機能を思い通りに制御したいからですよね? ところが、 Lisp コンパイラでは「ほぼあらゆる機能を」プログラマが制御する事が可能です。

たしかに Lisp コンパイラは良くて C と同等、大抵はそれ以下の性能しか出ない事が多いです。 しかし、それが完全に制御できる…といけませんね。つい怪しげな勧誘っぽくなってしまう。

posted: 2007/03/28 22:48 | permanent link to this entry | Tags: MISC

(top)  (memo)  (rss)