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-03-20

30年前のオリジナルEMACSとLisp開発環境

| 00:49 | 30年前のオリジナルEMACSとLisp開発環境 - わだばLisperになる を含むブックマーク はてなブックマーク - 30年前のオリジナルEMACSとLisp開発環境 - わだばLisperになる

最近サービスが開始されたPartty!.orgが面白そうだったので、オリジナルのEMACSを操作しているところをアップしてみたら受けるかもしれないということでキャプチャしてアップしてみました。

EMACSは32年位前にITS(MITで稼働していたMITのOS)で生まれ、それから同じくDECのPDP-10で稼働するTOPS-20等に移植されたのですが、このキャプチャはTOPS-20のものです。本当は、ITSの操作を取り込みたかったのですが、画面の描画が崩れてしまうので、しょうがなくTOPS-20で…。といっても見た目的にはそんなに違いはありません。

キャプチャについて大まかに解説すると、まず、MacLISPを起動しています。自分はMacLISPの初期化ファイルで、LEDITというEMACSとMacLISPが連携するLISP開発環境を呼び出しているので、起動後にすぐEMACSも起動します。

その後、適当にfib関数を定義したりしてみています。LEDITは、選択した範囲をMacLISPに送信する機能があるので、範囲を選択して送信すると、MacLISPでは送信された式が評価されます。そして、ショートカットでぱぱっとEMACSからMacLISPに抜けたり、戻ったりできます。

次に、carとcdrを拡張して定義できるcarcdr.lspというものをロードしてみています。

def-carcdrというマクロがあるので、適当にcadd...rのようなものを定義して遊んでみています。

その後、INFOを呼び出してLEDITの説明を表示してみています。

INFOもITSが生まれ故郷で、ITSでは、UNIXのmanのようにINFOが機能していました。

ほんのさわりしか紹介していないのですが、30年前のEMACSの時点でLISP式の編集に関しては、ほぼ完成してしまっています。

そして、70年代から、LISPのコーディングはこういう編集支援と共に育って来ていて、30年前の時点でLISPのメッカでは支援なしの素のLISPであれこれするということは既に行われていなかった様子です。

2007-12-28

SBCL 1.0.13リリース

| 01:36 | SBCL 1.0.13リリース - わだばLisperになる を含むブックマーク はてなブックマーク - SBCL 1.0.13リリース - わだばLisperになる

SBCLは大体毎月25日にリリースされるんでしょうか、今月も27日に新バージョンがリリースされました。

リリースノートなどは普段全く読みませんが、たまたま読んでみたら、run-programの動作が強化されたということで、

enhancement: RUN-PROGRAM allows unicode arguments and 
environments to be used (using the default stream external
 format), and allows non-simple strings to be used.
(thanks to Harald Hanche-Olsen)

とのこと。これまた、たまたまですが、昨日PLEACの問題を書いているときに

(let ((output 
       (with-output-to-string (out)
	 (sb-ext:run-program "date" '() 
			     :output out
			     :search '("/bin" "/usr/bin")
			     :environment '("LANG=ja_JP.utf-8")))))
  (princ output))

というものの出力が、

2007年 12月 29日 土曜日 00:58:28 JST

となってしまい、うーん、と思っていました。

1.0.13で試してみると、

2007年 12月 29日 土曜日 00:54:24 JST

とエンコードが合っていればきちんと表示されます。(例はUTF-8で揃えています)

この辺は、KMRCLでは問題なかったので、PLEACではKMRCLを使いました。(まあ、処理系依存度が低くなるので、KMRCLを使ったほうが良いとは思います…)

それで、全然脈絡はありませんが、SBCLのソースからのビルド、普段使っているイメージの作成までの記録をつけて置くことにしてみました。

以下メモです。

  1. ソース取得

$ wget http://nchc.dl.sourceforge.net/sourceforge/sbcl/sbcl-1.0.13-source.tar.bz2

  1. 解凍

$ tar jxvf sbcl-1.0.13-source.tar.bz2

  1. マルチスレッドで使いたいのでカスタマイズファイルcustomize-target-featuresに記述

$ cat ./customize-target-features.lisp

(lambda (features)
      (flet ((enable (x)
               (pushnew x features))
             (disable (x)
               (setf features (remove x features))))
        ;; Threading support, available only on x86/x86-64 Linux, x86 Solaris
        ;; and x86 Mac OS X (experimental).
        (enable :sb-thread)))
  1. ビルド

$ cat ./sbclcompr

#!/bin/sh

SBCL_HOME=/usr/local/sbcl/1.0.12/lib/sbcl /usr/local/sbcl/1.0.12/bin/sbcl $*

$ sh make.sh "./sbclcompr"

  1. ビルド後のテスト

$ cd tests && sh ./run-tests.sh

  1. ドキュメントをビルド

$ cd doc/manual && make

  1. インストール

$ INSTALL_ROOT=/usr/local/sbcl/1.0.13 sh ./install.sh

2007-07-19

CADRエミュレータ (4) Lispの開発環境

| 23:09 | CADRエミュレータ (4) Lispの開発環境 - わだばLisperになる を含むブックマーク はてなブックマーク - CADRエミュレータ (4) Lispの開発環境 - わだばLisperになる

とりあえず、外部とのファイルのやりとりもできるようになりました。

折角のLispマシンなので、Lispを書いて遊びたいところだと思うので、CADRのLisp開発環境について書きたいと思います。

この辺からは、自分がLispの開発の経験がある訳でもなくLisp自体に詳しい訳でもないので、詳しいことは全く分かりませんので、かなり適当なことを書いている可能性も高いですが、とりあえず、自分が遊んでみたところを書いてみたいと思います。

コードを書く

これはZmacs上でEmacsと同じ感覚でファイル作成/編集ができます。Emacs上でのLispコードの操作ということに関しては、70年代のITS Emacs、Zmacsの時点でほぼ完成しているということなのかもしれません。

インタラクティブに書きたいんじゃ

これは、編集中のコードを評価することによってEmacsのinferior lisp modeの様な感覚でコードを書くことができるかと思います。評価された結果は、エコーエリアに表示されます。

Eval Defun (Control-Shift-E (Control-Hyper-E))

で、式を評価、

Compile Defun (Control-Shift-C (Control-Hyper-C))

で、式をコンパイルのようです。

評価した結果にエラーがある場合は、デバッガが起動します。デバッガから抜けるには、C-zを押します。

という感じで、自分などは、大したものを書く訳でもなく、書けるわけでもないので、エディタ上から式が評価できるだけで十分遊べます。

ヘルプ

とりあえずのところとしては、

Documentation (Control-Meta-?)

があります。

Control-Meta-?を押して実行すると、

Doc A,C,D,L,V,W,<space>,?:

となるので、適宜調べたい内容に応じてキーを選択します。

AとspaceはAproposの実行 (Emacsでもapropos)

Cは、Document Command (Emacsでのdescribe-key)

D、Describe Command (Emacsでのdescribe-function)

L、詳細不明です。

V、Variable 変数のApropos

W、Where Is / どのキーコンビネーションに割り当てられているか

という感じです。

他にも、M-.等々Emacsでもお馴染の機能があるので、試してみると面白いかと思います。

2007-07-16

CADRエミュレータ (3) ホスト上のファイルを読み書きする

| 23:08 | CADRエミュレータ (3) ホスト上のファイルを読み書きする - わだばLisperになる を含むブックマーク はてなブックマーク - CADRエミュレータ (3) ホスト上のファイルを読み書きする - わだばLisperになる

CADRエミュレータは単体でも遊べますが、作成したファイルなどをエミュレータ外部に持ち出せるとより楽しく遊べます。

サーバの導入

エミュレータの配布サイトでは、Linux上で動くCADR用のファイルサーバ?がありますので、ダウンロードして設置します。

Retrocomputing - MIT CADR Lisp Machines:

http://www.unlambda.com/cadr/index.html

のページのChaosnet server tar fileをダウンロードしuntarします。

展開されたchaosdというディレクトリの中にコンパイル済みのLinux用のバイナリがありますので、

./chaos

./server

の順で起動させます。

起動は、展開ずみのディレクトリにcdして実行する必要があるようです。

(自分は、毎回起動が面倒なので、シェルスクリプトにして実行しています。)

サーバが起動された状態で、usimを起動し、CADRから接続を試みます。

配布されている状態では、アドレスは設定済みになっていますので、サイトの例と同じく、CADRエミュレータより、

(login 'foo t)
(si:set-sys-host "server" ':unix 0404 "//")

と実行し、CADRにログインした後にサーバと接続します。

ホスト上のファイルの読み書き

ホスト上のファイル名ですが、server://foo//bar//baz.quuxの様になります。

"/"が二重になっていますが、"/"はCADRではエスケープキャラクタとなっているので、二重に表現する必要があります。

読み書き時の初回時には、接続のため、ユーザ名とパスワードを尋ねてきますので、ホストでのユーザ名 <スペース> そのユーザのパスワードを入力します。

以上、ホスト上のファイルの読み書きについて書いてみました。

(si:set-sys-host "server" ':unix 0404 "//")

等々は、一々入力するのも面倒です。

自分は、スクラッチファイルを適当に容易して、Zmacs上から式をEvaluate Defun(Control-Hyper-E、どういう訳かエミュレータではC-Sh-Eを押すとこの組み合わせが発生)で評価してみていますが、楽ができるので結構お勧めです。

2007-07-14

CADRエミュレータ (2) ユーザ環境設定編

| 23:08 | CADRエミュレータ (2) ユーザ環境設定編 - わだばLisperになる を含むブックマーク はてなブックマーク - CADRエミュレータ (2) ユーザ環境設定編 - わだばLisperになる

CADRはシングルユーザシステムですが、ユーザ毎に環境を設定して切り換えて使用することはできます。

(login 'foo)

とすることで、ユーザfooでログインできます。

何らかの理由で、環境設定初期化ファイルを読み込ませたくない場合は、

(login 'foo t)

とします。

(logout)

でログアウトします。

ホームディレクトリの作成

fooでログインした場合、ホームディレクトリfooにある。lispm.initを読み込み実行します。

恐らくホームディレクトリの場所の指定は様々あると思うのですが、良く分からないので、とりあえず、ホームディレクトリを作成し、その中にlispm.initを作成することによってユーザ環境を設定する方法を書きます。

とりあえず、ログインして作業を開始します。

(login 'foo t)

として、初期化ファイルを読み込まずログインし、F2 f(F2キーのあとで、Fを押す)とFile System Editorが起動するので、Tree edit rootを左クリック。しばし待ち、

>*.*.*

の上で右クリック。(ディレクトリのパスセパレータは、">"です)

Directory operationsメニューが表示されるので、Create Inferior Directoryを選択

名前の入力を促されるので、ユーザIDと同じ名前を入力するとディレクトリが作成されます。

初期化ファイルの作成

ホームディレクトリが作成されたので、ユーザの初期化ファイルを作成してみます。

一旦

(logout)

でログアウトし、

(login 'foo)

でログインし直します。

(ed)

と入力すると、Zmacs(Lisp Machine版のEmacs)が起動します。

ホームディレクトリにいるので、Emacsと同様に、C-x C-fとし、lispm.initを作成します。

初期化ファイルについては情報が少なく詳細は不明ですが、自分が適当に探って作成してみたものを置いてみます。

ウェブから入手できる初期化ファイルとしては、http://www.unlambda.com/lisp/mit.page

で配布されているファイルの中に、David Moon氏の初期化ファイルがあります。(moon/moon.lispm)

自分もそれを参考に作成してみました。

※αとなっている場所は、制御文字^Bで、εは、^Fです。

入力に関しては、Emacsと同様に^Q^B等で入力できます。

;-*- Mode:LISP; Package:USER; Base:8.-*-

(login-setq base 10.			; 表示用の基数を10進数に設定
	    ibase 10.			; 入力用の基数を10進数に設定
	    user-id "g000001")		; ユーザID

;; キーバインドのカスタマイズ
(login-eval zwei:(set-comtab-return-undo *standard-comtab* 
					 '(#α/m com-insert-crs         ; C-mとReturnとで同じ振舞い
					   #α/i com-indent-for-lisp    ; C-iとタブとで同じ振舞い
					   #α/h com-tab-hacking-rubout ; C-hでRubout(Backspace)
					   #ε\sp com-just-one-space))) ; C-M-Spaceで、Just one Space
(login-eval zwei:(set-comtab-return-undo *completing-reader-comtab* 
					 '(#α/m com-complete-and-exit))) ; エコーエリア?でもC-mが使えるようにしてみる(中途半端)

;;
(ed ">g000001>gazonk.del")                   ; ログインするとすぐZmacsが起動

2007-07-13

CADRエミュレータ (1) デモ編

| 23:07 | CADRエミュレータ (1) デモ編 - わだばLisperになる を含むブックマーク はてなブックマーク - CADRエミュレータ (1) デモ編 - わだばLisperになる

CADRエミュレータについては、分かりやすい導入の手引があります。

A quick first tour of the CADR lispm using usim

http://labs.aezenix.com/lispm/index.php?title=CADR_First_Tour

ここのサイトさんにはlispm関係の情報が色々まとまってるんですが、スパムがひどいみたいで、現在フロントページから内容が俯瞰できない様子です。

動作するプラットホームとしては、Windows、MacOSX、Linux等がありますが、Linuxがメインの開発プラットホームの様子で、ホストと通信してファイルを読み書きできたりもするので個人的にはLinuxがお勧めです。

手引の中で、

 (hacks:worm)

とありますが、この方法以外にもリスナーで

(demo)

と実行すると、デモを選択するプログラムが起動し、色んなデモプログラムが選択できるのでお勧めです…が良く固まる気もします…。

最初の起動では、かなり長く待たされたと思いますが、これを短縮する、ウォームブートという起動方法があります。詳細は、READMEに解説されていますが、手順としては、

./usim -S

で起動し、日付を入力するところまで完了させ、ターミナル上で、^Cを二回押しエミュレータを終了させます。するとusim.stateというファイルができ、これに状態が記録されているので、次回以降、

./usim -w

と入力することによって、さっと起動できるようになります。

2007-07-12

.1

| 23:06 | .1 - わだばLisperになる を含むブックマーク はてなブックマーク - .1 - わだばLisperになる

前回リスプマシン(以下lispm)のCADRエミュレータについて書きましたが、CADRエミュレータについては情報も少ないようなので、分からないながらも、自分が試してみたことや、lispmエミュレータの近況を自分つらつらと、単発的かつ断片的に書いてみることにしました。

まず、どんなものがあるのか

MIT - CADR

元祖lispmです。

http://www.unlambda.com/cadr/

TI - Explorer

テキサス・インスツルメンツが開発していたlispmです。

Meroko:

http://www.unlambda.com/lisp/meroko.page

Symbolics - VLM

SymbolicsがDEC Alpha用の仮想マシンとして開発したものです。

CADRエミュレータ作者のBrad Parker氏によってLinuxに移植が試みられている様子です。

VLM On Linux

http://labs.aezenix.com/lispm/index.php?title=VLM_On_Linux

XEROX - Interlisp-D

Interlisp系のlispmである、Interlisp-Dの仮想マシン

です。

http://sumim.no-ip.com:8080/collab/76

に詳しい情報があります。

NTT - TAO/ELIS

TAO/ELIS の UNIX への移植/天海良治」という論文もありFreeBSDに移植されているようです。