#:g1

Daniel Bobrow 氏と Lisp-2

Posted 2017-04-05 15:24:36 GMT

Daniel Bobrow 氏が先日3月20日に亡くなった。

氏はLISP創世記より活躍され、BBN-LISP・INTERLISPと対話型システムに於いて多大な功績を残し、Common LispにもLOOPSから始まるXerox系オブジェクト指向システムの導入に於て多大な影響を与えた人物であった。

私がDaniel Bobrow 氏で思い出すのは、氏がCommon Lispでお馴染のLisp-2の創始者ということで、昔にこのブログで書いたことがあった。
話によれば、Lisp-2は1965年あたりにBBN-LISPに実装されたのが始まりらしい。

上の記事ではnet.lang.lispを引用しているが、元の議論はMITのlisp-forumメーリングリストで行なわれていたことだったようだ。

Common Lispができつつある1983年の時点でLisp-2は古いデザインという雰囲気だが、2017年の今でも使われているというのは感慨深い。

小ネタをもう一つ、ClassicCmpのメーリングリストのBobrow氏を偲ぶスレッドで、INTERLISPの表紙について語られていた

IIRC, sometime during the project, BBNLISP was renamed INTERLISP.  I still
have the wonderful manual, with the great artwork on the cover.  Warren
Teitelman (the author) doesn't have his name on the cover.  But, the bottom
portion has a guy is operating a meat grinder, with the input being the
letters of "reference manual" in random order, and the output being
"reference manual".  Danny explained that Warren Teitelman hadn't gotten
the joke :)

Danny was funny, quick witted, friendly ... RIP.

interlisp-meat-grinder

マニュアルをひっくりかえして表紙の絵の作者を探したが、どこにも載っていなかった。作者はBobrow氏だったのだろうか。

混沌としたものをミンチにしたものがマニュアルというジョークは、CLtL2の索引のジョークを思い出す。

ちなみに、GLSとBobrow氏というと、Bobrow Stacksともいわれる Spaghetti stacksに対して、GLSは、Macaroni is better than spaghettiなんてものも書いているらしい。


HTML generated by 3bmd in LispWorks 7.0.0

CADR System 78.52

Posted 2017-04-02 07:06:34 GMT

CADRのエミュレータというとBrad Parker氏のものが有名だが、それを下敷にして色々整理したものをみつけた。

まとめているのはMIT Lispマシン(LispM)界隈では良く見掛けるams氏。

利用方法

GitHubからcloneしてmakeするだけ

git clone git@github.com:ams/mit-cadr.git

cd mit-cadr/emulator/usim

make

そして、起動
※なお、disk.imgに誤ってか意図してかコロンが末尾に付くのでdisk.imgリネームする。(そのうち直ると思われる)

./usim

自動でホストと通信してファイルも読み込んでくれるらしい。
色々試してみたが、現状では、

./usim -r ../../lisp

とLispMのルートディレクトリを明示した方が良いらしい。 (M-.でのソースコードジャンプ等で間違いがない)

(login 'foo)

とすると、ユーザーfooのホームディレクトリの初期化ファイル:lispm.initを読み込むので、ここに初期化設定を書く。
さらに、現状でソースコードジャンプを上手く機能するようにするには、初期化ファイルに、

(si:set-sys-host "server" ':unix 0404 "...//mit-cadr//lisp//")

"...//mit-cadr//lisp//"はファイルのパス

と明示すると良いようだ(なお、伝統的なMACLISPでは、/がエスケープ文字なので二重に記述する)

以下、Parker氏の配布物と比べて違っているところを列挙

  • ディスクはホストのものを利用するらしい
  • ホストのユーザーと上手く連系する
  • 時刻設定がいらない
  • chaosdserverを実行しなくてもホストのファイルが読み書きできる

なお、現状、SDLを使わず、X11を使うようにしているので、マウスやキーボード操作がLinuxでは若干上手く行ってないように思われる

また、Parker氏の配布物は、System 78.48だが、こちらでは、System 78.52と若干新しい。
記録によれば、System 78は、大体1981年末から1982年あたりのシステムで、Chinualでいうと4th Editionあたりの仕様になる。

cadr78.52

結び

MIT CADRは、最終版のSystem 99まであり、これがCommon Lisp対応となっているので、これが使えるようになると良いなあと以前から思っている。
現状、ディスクイメージはあるようなのだが、マイクロコード等細かいものが揃っていないようだ。

今後もMIT CADRエミュレータの新しい動向に注目していきたい。


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: プログラミングGauche — 18章 構文の拡張

Posted 2017-03-26 14:36:19 GMT

今回は、プログラミングGaucheのマクロの箇所を読む。
マクロについての解説は、

  • 18章 構文の拡張
  • 21.7章 マクロの調査

の二つ。後者はデバッグについて書かれている。

18章 構文の拡張

構文の拡張ということで、拡張する前の構文とは、という所から説明が始まっている。
Schemeらしくプリミティブを積み重ねていくのだという説明が続くがやや冗長な印象。

次にパターンマッチによるマクロとして、syntax-rulesマクロの解説がされる。
そして、マクロの健全性について解説され、マクロの利用の仕方について解説。

最後にsyntax-rulesでは扱いが面倒な、意図的な変数名捕捉や識別子の作成について解説し、それらを手軽に扱える伝統的なマクロ方式を解説する。
2008年の本なので、手続的に書けるマクロシステムとしては、define-macroのみだったようだ。

21.7章 マクロの調査

この章はデバッグの章なのでマクロを展開してデバッグしていく方法を解説している。
「マクロは最もデバッグの難しいプログラムです」と開始されるが、その根拠についての説明は特に無いようだ。
個人的には、Schemeの場合、緩い型なのに高階関数を何重にも積み重ねるスタイルが多用されがちなので、そちらの方が何倍もデバッグが難しいと感じるが……。

macroexpandを利用してマクロを展開しデバッグしていく方法を示す。
また、モジュールを跨いだ場合の問題点についても解説。

結び

プログラミングGaucheが出版されてから早9年だが、基本から実践的な所まで幅広く解説されているので、Schemeで何かしようと思っている人には今でもとても有用な本だと思う。
ただ、Gaucheの細かい所の仕様は結構変っているので、アップデートされたら良いなとは思う。


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: Common Lispプログラミング — 9.3 マクロ

Posted 2017-03-22 21:27:54 GMT

今回は、Common Lispプログラミングのマクロの箇所を読む。
著者のRodney A. Brooks氏は、今ではiRobotの設立者として有名。
サブサンプション・アーキテクチャでも有名で、Lisp界隈でもLucid社の設立者でありコンパイラ作者でもあった。

原書の出版は、1985年でCLtL1時代の本。
前年に発表されたCommon Lispの入門書としては最初期のものなので、他の書籍から引用されることも多かったようだ。

9.3 マクロ

最初にマクロの役割をざっと説明し、順に使い方各種を解説していく。
最初は、コードを分かり易くするためのもので、リストのアクセサとしてcadrcaddrのようなものを使っているものをfoo-namefoo-color等、プログラムの文脈的に意味のあるものにするのにマクロを使う。

次にletや、if等、制御構文系のマクロの作成方法について解説し、よりテンプレート的に書き易い道具としてバッククォートを紹介する。

そして、マクロの意図しない変数捕捉や多重評価の問題について解説してあり、マクロについて一通りの解説はされている。

気になった所

gensymの説明がちょっと間違っていたりするが誤植かもしれない(0引数と説明されているところ)

結び

お題が小分けになっているが、それぞれの説明の後には、練習問題が付いていて、なかなか良い構成だと思った。
章末には大き目の問題が付いている。
練習問題の作りも丁寧。


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: Lispプログラミング入門 — 11・4 マクロ展開

Posted 2017-03-20 13:06:24 GMT

今回は、Lispプログラミング入門のマクロの箇所を読む。
同名の書籍があるが、白川洋充著の本で、1989年出版。
対象のLisp方言はCommon Lispで、CLtL1に拠っている。ちなみに用いられる処理系は、Macintosh Allegro Common Lisp 1.2.2とのこと。
ifのインデントなど、MACLっぽいなとは思う。

11・4 マクロ展開

マクロの解説は、マップ関数の章にまとめられており、大まかにはリスト処理の仲間としているらしい。
コード生成については、前の章で触れられているので、マクロ展開として焦点を絞っているらしい。

主にlambdaからletを作ることを説明して終了。
defmacro引数の分離destructuring機能とバッククォートについて軽く触れるのみ。

章末の問題では、UCI LISPのrepeatとINTERLISPのforの繰り返し構文を作成せよとなっている。
INTERLISPのforは真面目に作ると大変だが、まあ、格好だけ似せれば良いのだろう。


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: 入門LISP — 2.16マクロ

Posted 2017-03-19 15:36:37 GMT

今回は、入門LISP―対話型アプローチで学ぶのマクロの章を読む。

原書の出版は、1986年でCommon Lispも出ていると思うが、主にFranz Lispをターゲットとして解説が進む。

本書では、Lispのプログラミングスタイルを、適用型のプログラミングスタイルと、非適用型のプログラミングスタイルに分けていて、最初は、関数呼び出しとその返り値のみを使う適用型で進み、応用として、副作用を用いる非適用型を解説する流れになっているのが、なかなか面白い構成だと思う。

Franz Lispを主なターゲットとしているので、マクロの解説でも、defdefundmの中からタイプが少ないという理由からdmを選んで説明。
ちなみに、Franz Lispは色々な方言を積極的に取り込んでいるので、独自のdef、MACLISP風のdefun、Stanford LISP 1.6系のdmがデフォルトで利用可能。

マクロの説明の前にFEXPRで特殊形式を作成する方法は解説しているので、それをマクロに置き換えていくのが主な内容となっている。

章末に問題があるが、そこそこの分量がありつつ難易度も手頃なので全部解いてみると良いだろう。
ちなみに、最後の問題は、訳の機微が微妙だと思った(2.16 7)
恐らく、FEXPRでevalを明示的に呼び出していたのをマクロを使うことによってevalを使わないようにせよ、という所だと思う。


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: LISP — 8 FEXPRとMACROの定義

Posted 2017-03-17 10:11:22 GMT

今回は、LISPのマクロの箇所を読む。
本書は、WinstonのLisp本の第一版で、原書の出版は、1981年。
安く売られていることが多いが、Common Lispではなく、MACLISPなので注意。
本章の内容もCommon Lispには存在しないFEXPRについて解説がある。

ちなみにこの本は、訳文の文体が独特なことで有名。

8 FEXPRとMACROの定義

まず、FEXPRの解説から。大まかにいって不定長引数と引数を評価しない関数であることが説明される。
関数では定義できない代表的なものとして、ifをFEXPRで定義してみせる。
しかし、FEXPRが内部でevalを呼ぶときに注意しないと変数名の競合を引き起してしまうことを説明。
この問題はマクロでエレガントに解決できるとしている(マクロも似たような問題があるが……)

そしてマクロの解説。
バッククォートを使わない(使えない?)ためsubstを使って雛形を加工していく方法が紹介されている。これはこれで面白いかもしれない。
ただ間違った置換が起きないように注意する必要はあるかも。

(defun if macro (x)
  (subst (cadddr x)
         '$$else
         (subst (caddr x)
                '$$then
                (subst (cadr x)
                       '$$pred
                       '(cond ($$pred $$then)
                              ('T $$else))))))

練習問題も定番のものが多いがそこそこ面白いので全部解いてみると良いだろう。

結び

1981年の本にしては、ちょっとLISP的な内容が古いような気がするが、1977年に出版されたArtificial IntelligenceのLISPの部分を切り出したものが原書ということなので、しょうがないのかもしれない。


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: LISP 1.5 PRIMER — 19.6 MACROS

Posted 2017-03-12 06:26:54 GMT

今回は、LISP 1.5 PRIMERのマクロの箇所を読む。
出版は、1967年で丁度半世紀前の本。
出版されたLISPの入門書としては最初期のものではないだろうか。もしかしたら最初の本なのかもしれない。

邦訳も1970年にLISP入門として出版されている。

自分が知る限りLISP入門以前にLISPの本は出版されていないようなので、日本語のLISP入門書はこれが初ではないだろうか。

表紙のタイトルがS式になっていて、こういう意匠もかなり初期の試みだったのではないだろうか。
なんとなく当時から括弧が好きだった人は好きだったんだなという感を抱いてしまう。

(LISP 1.5 PRIMER
  (BY
    (CLARK WEISSMAN)))

19 LIST STRUCTURES, PROPERTY LISTS, AND MACROS

面白いのが、リスト操作とマクロが一緒にされているところ。
実際リスト操作なのだが、バッククォートが発明されてからは、マクロを書くのはテンプレート操作という印象が強くなったように思う。
Schemeのsyntax-rulesに至ってはテンプレート言語だし。

さて、まず、特殊形式を実現するのにコンパイル時に展開するマクロが使えるということが解説される。
この辺りは、Timothy Hart氏がマクロをLISP 1.5に導入した経緯を踏まえているように思うが、この本では、特殊形式の役割は可変長引数と引数を評価しないこととしていて、マクロでそれらをどう処理できるのかを解説する。

なお、マクロの定義フォームは、MACROで、

MACRO (( (name (lambda (form) ....))
         (name (lambda (form) ....))  ))

のようになる。
ちなみに、defmacroでいうと&whole引数のようにフォーム全体が渡されてくる。

課題の一つである、可変長引数の処理については、コンパイル時にplusを固定引数の下請けである固定引数の*plusの組み合わせに展開してしまう手法を説明。

LISP 1.5では、マクロでの再帰的定義はできなかったようなので、展開用の*expandという関数を定義して、これがplus*plusに再帰的に展開する。
どうも展開用の関数を定義するというのは当時メジャーなマクロ書法だったようで1960年代後半のマニュアルなどにも頻繁に紹介されている。
展開用の関数がやっていることは、リスト操作の極みなので、マクロがリスト操作の章にあるのも分かる気はする。

また、もう一つの課題である、クォートの方は、csetという大域定数を定義する関数を、cset+quotecsetqにする例を取り上げる。

章末には、マクロの問題も、6つ程あるが面白いので解いてみることをお勧めする。
defmacroとバッククォートは使わない縛りだとなお面白い。

結び

日本の1970年代後半位の書籍だとマクロについては軽く触れられているのみだが、米国では1960年代からコンパイラと合せて紹介していることが多い。
日本ではコンパイラについてはあまり注目されなかったのだろうか。その辺が少し不思議。

ちなみに、1965年より前の文献になるとマクロは、「Timothy Hartのマクロ機構」という感じで、LISPにマクロを始めて導入したHart氏の名前と共に紹介されることが多いようだ。

なお、本書籍は、PDFがSoftware Preservation Groupからダウンロード可能なので一度眺めてみてもらいたい。


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: Dylan Programming — 6.4 Macros

Posted 2017-03-10 15:14:00 GMT

今回は、Dylan Programmingのマクロの箇所を読む。

Dylan Programmingは、1996年の出版で、主な対象としている処理系は、Harlequin Dylan。

当初、Harlequin Dylanは、DylanWorksと呼ばれていたらしいが、1.0がリリースされる前に名称変更になったらしい。

Harlequin Dylanは、1998年辺りに正式リリースがされ、1999年にEnterprise Editionがリリースされた後、色々あって、Functional Objectsという会社が扱うことになり、さらに色々あり、Open DylanとしてOSS化された。

以降、現在に至るまで、Open Dylanとして開発が活発になったり停滞したりしている。

本書のPDFは、OpenDylan.orgからダウンロード可能

6.4 Macros

DylanのマクロはLispのように言語を拡張することを目的としていて、扱いも用意であることが解説される。
なお、Dylanの競合は、C++やCなので、Cのマクロとの比較が随時差し挟まれる。

構文マクロには、パタンマッチ・テンプレート方式と、構文を操作する手続き型マクロがあるが、Dylanの場合は、テンプレート方式であることが説明される。
後々、手続き型マクロもサポートする予定だったらしい。なんと、知らなかった。

簡単なパタンマッチでマクロを書く例が示され、次にConstraintsについて説明がある。
Constraintsとは、?foo:expressionのようなパタン変数の後ろの部分で、構文に型が付いているようなもの。
Common Lispでいう&restのようなものは、?var:bodyと書けたりする。

また、サブパタンを書くことも可能で、見通しよく分割できることが示される。
マクロ内で識別子を生成する方法も解説。

次に、マクロの衛生性について解説され、識別子の意図しない捕捉等が起きないことが示される。
衛生性は意図的に破ることが可能で、?=を利用すれば利用される場所の識別子が利用できる。

次に、サブパタンを利用しては書けない例として、生成した識別子がサブパタンでは利用できない例を挙げ、補助マクロを利用する方法を解説する。

結び

最近、中置言語にLisp風のマクロを導入する例が多いが、最近の言語と比べてもDylanのマクロシステムは洗練されているように思える。
Dylanには、Common Lispの開発者が多く参加しているが、構文マクロを普通に使う人達が設計したことがシステムの洗練に大きく寄与したのではないだろうか。

Common Lispを知っている人からすると、Dylanは、まるで中置のCommon Lispで、Common Lispの精神もかなり継承しているのであるが、ブレイクしてくれなかったのが悔まれる。


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: プログラマのためのCOMMON LISPガイド — 11 マクロ

Posted 2017-03-07 18:48:22 GMT

今回は、プログラマのためのCOMMON LISPガイドのマクロの章を読む。

1988年邦訳で、原書であるA Programmer's Guide to Common Lispも1987年出版で、CLtL1な時代の本。

「プログラマのための」とあるように、何かしらの言語の経験は前提にしている。

11 マクロ

まず、マクロの効用について説明があり、次に簡単な定義の方法とバッククォートの説明がある。
次に一歩進んで、マクロを書くマクロの説明があり、ネストするバッククォートの書き方(,',の使い方等)が親切に解説されている。
そして、マクロのλリストのデストラクト分配機能について解説がある。
これら一歩進んだ機能を解説する題材として簡単なdefstructを作って行くが、defstructを作るには一通りの知識が必要となるので確かに手頃な題材だと感じた。

章末の練習問題も手頃。後半は、本章で解説した自作のdefstruct:conc-nameや、:constructorを使えるように拡張する等、実際的な問題で面白く為になる。
なお、Common Lispの仕様に忠実に:constructorをサポートするとなると結構大変だが、巻末の解答を眺めるとさすがにそこまでは要求していないらしく、名前を変更する位で良いようだ。

また、:conc-nameや、:constructorサポートするにあたって構造体名の所はリストだけのサポートで良いらしい。
デストラクト分配を使えとあるので、destructuring-bindなし(CLtL1の仕様では存在しない)でどうやるのか色々考えてしまった。
まあ、下請けのマクロを定義するだけで良いのだが……。


HTML generated by 3bmd in LispWorks 7.0.0

Older entries (2098 remaining)