#:g1

Zetalispのlambda-macro

Posted 2017-04-23 16:30:51 GMT

今日は一日LMI Lambdaのエミュレータを触っていたが、そういえば、Zetalispにはlambda-macroというものがあることを思い出した。
(ちなみに、LMIのZetalispは、ZetaLISP-Plusらしい……)

lambda-macroの使い所だが、Common Lispでarcのfnを再現することを考えてみよう。
arcのfnは大体Common Lispのlambdaだが、fnには引数の解構destructuring機能がある。

Common Lispのマクロで書くなら、

(defmacro fn ((&rest args) &body body)
  (let ((a (gensym)))
    `(lambda (&rest ,a)
       (destructuring-bind (,@args) ,a
         ,@body))))

こんな感じで、こうなる

(mapcar (fn ((a . d)) (list a d))
        '((0 1 2 3) (1 1 2 3) (2 1 2 3)))
;=> ((0 (1 2 3)) (1 (1 2 3)) (2 (1 2 3))) 

しかしそれで元のlambdaのように

((fn ((a . d)) (list a d)) '(0 1 2 3))

と書けるかというと、こうは書けない。

ここがCommon Lispでは微妙にもどかしい所だが、Zetalispでは、lambda-macroを定義してやれば思ったように書ける。

(deflambda-macro fn ((&rest args) &body body)
  (let ((a (gensym)))
    `(lambda (&rest ,a)
       (destructuring-bind (,@args) ,a
         ,@body))))

((fn ((a . d)) (list a d)) '(0 1 2 3))
;=> (0 (1 2 3)) 

さらに、deffunctionという引数の取り方をカスタマイズした関数を定義する構文が用意されていて、上記のfnを下敷にする関数は、

(deffunction a.d fn ((a . d))
  (list a d))

(mapcar #'a.d '((0 1 2 3) (1 1 2 3) (2 1 2 3)))
;=> ((0 (1 2 3)) (1 (1 2 3)) (2 (1 2 3)))

と書ける。

結び

Lispマシンのマニュアルの解説箇所はこちら

まあ、Lisp-1 ならこういうものは素直に書けるのだが。


HTML generated by 3bmd in LispWorks 7.0.0

LMI Lambdaのエミュレータ:LambdaDelta 公開!

Posted 2017-04-23 05:55:47 GMT

最近、LispマシンのメーリングリストでLMI Lambdaのエミュレータが完成間近であることがアナウンスされていたが、今日LambdaDelta 0.98.1が公開された。
やった!、思いの外公開されるのが早かった。

早速起動したい所だが、ROMや、テープイメージ等を準備する必要がある。

必要なものを取得しつつのビルド手順は下記の通りとなった。
ホストOSは、Debian GNU/Linux 64bit

### LambdaDelta本体の準備

wget https://github.com/dseagrav/ld/releases/download/0.98.1/ld-0.98.1.tar.gz tar xvf ld-0.98.1.tar.gz cd ld-0.98.1 ./configure --without-SDL1 make

### ROMの準備

cd roms wget http://bitsavers.trailing-edge.com/pdf/lmi/firmware/SDU_15165-0003.ZIP unzip SDU_15165-0003.ZIP wget http://bitsavers.trailing-edge.com/pdf/lmi/firmware/VC_MEM.ZIP unzip VC_MEM.ZIP http://bitsavers.trailing-edge.com/pdf/lmi/firmware/Memory/2243902_OF_27S291.BIN

ln -s VC_MEM/U43_2516_2242843-0001_0856TI200038.BIN VCMEM.ROM ln -s 2243902_OF_27S291.BIN MEM.ROM ln -s SDU_15165-0003/combined.BIN SDU.ROM cd ..

### インストールテープの準備

cd tapes wget http://bitsavers.trailing-edge.com/bits/LMI/lambda/00_install.tap wget http://bitsavers.trailing-edge.com/bits/LMI/lambda/02_system.tap cd ..

### ディスクの準備

fallocate -l 1gib disks/disk.img

### 初期化ファイルの準備

echo "sdu_switch 0" > ld.conf

あとは大体READMEに書いている通りに進めばセットアップは完了する

インストール時のはまりどころ

一番最初は、ld.confをどう書くのか最初は良く分からないのでデフォルト値を利用することになる。
はまりそうなデフォルト値は、ディスクのdisks/disk.img位かなと思う。

また、イーサネットデバイスを利用するのにroot権限が必要だが、

sudo modprobe tun 
sudo tunctl -t ldtap -u ユーザー

等とするか、root権限で実行することになると思う。 Xの画面が開かない時は.Xauthorityをrootのホームディレクトリにコピーする等適当に凌げば良いかもしれない。

170423130139

起動できたら、とりあえず、ユーザーのホームディレクトリでも作成してみる。

(fs:create-directory "mc")

そしてログイン(特に何も起きないが……)

(login 'mc)

初期化ファイルは、ユーザーディレクトリのlispm.initらしい(CADRと同じ)

170423130315

バックアップテープからのリストア

F12でテープを02_system.tapに切り替えて、System B(F1を押してからB)でバックアップユーティリティを起動。 中程のメニューのModesからRETRIVEを選んで、上のCommandsメニューからRESTORE-FILESを選択すると、読み込みと展開が始まる。結構長い。

lmi-lambda-restore

結び

とりあえず速報という感じでまとめてみた。
ホストとのファイル共有や、ネットワーク周りがまだ良く分からないが、ホストとファイルをやりとりできるようになると非常に捗るので方法を探りたい。

いやー、LambdaDeltaの今後の進展が楽しみだ!


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: Notes on the Programming Language LISP: The Macro Facility

Posted 2017-04-20 15:22:38 GMT

今回は、最近bitsaversにアップされた、Bernard Greenberg氏が1976-78年に書いたLispの入門の手引きNotes on the Programming Language LISPのマクロの章を読む。

Bernerd Greenberg(BSG)氏といえば、Multics Emacsの作者として有名だが、Lispハッカーとしても有名。
そんなBSG氏がMITの学生向けに書いた手引きらしい。
書かれた時期は、BSG氏がまさにMultics Emacsを開発していた頃にあたる。

The Macro Facility

まず、Maclispで魅力的な機能の一つとしてマクロを紹介。
言語を拡張できることを説明し、具体例としては、(setq list (cons item list))のような頻出するものをユーザーレベルでpushとしてまとめられることを示す。
マクロのメリットとして、コンパイル時に展開することによる効率の高さと拡張性について触れ、個々のマクロはLispコンパイラの断片ともいえる、と述べる。 また、Lispでマクロがこれ程便利なのは、LispコードはLispデータであるということを説明し、PL/IやFORTRANではこれ程簡単に言語を拡張できないことを挙げる。
さらに、括弧で表現することに目を瞑れば、どんな拡張でもマクロ→素のLispという変換を使って書くことが可能ということと、その拡張した表現も効率よくコンパイルされうるということがマクロの最大の魅力としている。

最後にDavid Moon氏の

"Functions compute, macros translate."

という言葉を引用して締める。含蓄があるような無いような……。

結び

割と扇情的なところもあり、10年位Paul Graham氏の先取をしている所もあるなあと感じた。
全体的に面白い読み物ではないだろうか。


HTML generated by 3bmd in LispWorks 7.0.0

CADR System 78.52 其の二

Posted 2017-04-08 12:16:32 GMT

CADR System 78.52 — #:g1でams氏のプロジェクトを紹介したが、本プロジェクトは、LM-3/mit-cadrだそうで、ams氏のものは色々実験的なものだったらしい。

LM-3/mit-cadrの方を試してみたら、こちらはLinux版の場合は、これまでのようにSDLを利用するようになっていて、キーボード・マウスともに問題なく機能するようだ。

なお、usim -r ../../lispという風に明示的にシステムルートを指定する必要があるのは、現状こちらも同じらしい


HTML generated by 3bmd in LispWorks 7.0.0

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

Older entries (2102 remaining)