#:g1: frontpage

 

Medleyを使ってみよう(2)

Posted 2015-07-15 05:06:39 GMT

 Medleyを使ってみようシリーズの第二回、前回は4年半前でした。
過去のmedley関係の記事は、こんな感じです。

Medleyとは

Medleyとは、Interlisp-Dが仮想マシン化したものです。
LinuxやIRIX(MIPS)、Solaris(SPARC)等で動くようですが、自分は、古いLinuxで動かしています。

Metaキーはいずこ

Medleyを触って早10年位になります。特に何もしてないのですが、Metaキーがどこに割り当てられているかが分からず、エディタでは苦労して入力していました。
便利機能の殆どがMetaキーに割り当てられていて、Metaキーが使えないとマウスでポチポチやって文字を入力する位しかないのです。
これではいかんと思い、MetaキーがXではどこに割り当てられることになるのか探ってみたところMedleyではAlt_Lに割り当てられることが判りました。

xmodmapで

clear    mod1
keycode  キー番号 = Alt_L
add     mod1    = Alt_L

のようにすればOKですが、自分は、左Metaキーには、Meta_Lを割り当てているため、Alt_Lを有効にするために、Xnestで別ディスプレイを開いて設定しています。
vncでできると良いのですが、どうもAlt_Lがどんどん別の場所にずれて行くという謎現象が解決できず。

SEditのコマンド

SEditでのカーソル移動と範囲選択

カーソルの移動は基本的にマウスでしかできません。キー操作も用意されていそうなものですがマニュアルを眺めても見付けられず…。
選択ですが、左クリックをすると範囲が外側に伸びてゆきます。
左クリックだと1つの式しか選択できないのですが、複数を選択したい場合は、先頭要素を真ん中クリックで選択し、最後尾を右クリックすると、箱状に範囲が選択されます。

SEditでの基本S式編集コマンド

さて、Interlisp-Dの構造エディタのSEditのコマンドですが、主な所ではこんな感じになっています。

Delete、c-h 後一文字を削除
c-w 選択を削除
m-u アンドゥ
m-r リドゥ
m-f 検索
c-m-f 後へ検索
m-s 置換
c-m-s 選択を削除
c-m-; 選択をコメントアウト
m-o 別エディタで編集
m-e 式をeval
m-x 式をマクロ展開して元の式と置き換え
m-/ 所謂スプライシング “(x y z) ⇒ x y z”
m-i インスペクト
m-j 範囲を結合(シンボルの場合は、シンボル名が結合、リスト、文字列等、色々結合可能)
m-( 括弧で囲む
m-) 括弧で囲む。カーソルは後へ
m-, 選択に,を付ける
m-@ 選択に,@を付ける
m-. 選択に,.を付ける
m-' 選択に'を付ける
m-` 選択に`を付ける
c-c コンパイル
c-x 評価
c-m-c コンパイルしてエディタを閉じる
c-m-x 評価してエディタを閉じる

選択となっているのは、1つ以上の要素を編集対象としています。

編集する上で便利なのは、さくさく削除するc-wと、検索(選択される)&削除 or 置換 でしょうか。
カーソル移動がダルいのでm-fで移動するのもありだと思います。

別エディタを開くm-oについては、Emacsでいうとm-.のような感覚です。

対話的に書く

ちょっと書いては評価スタイルの場合ですが、SEditだとエディタの画面1つには1式しか表示されないので、リスナーと行ったり来たりになります。
redofixuseがあるので、そこそこ動作確認もできますが、(sedit:sedit '(foo 1 2 3))や、(sedit:sedit '(macroexpand '(mac x y z)))として別エディタを開いて、この式をm-eする方が楽な気もします。

まとめ

久々にMedleyのことを書いてみました。
Interlisp-Dの環境も大体使える位まで把握したい所です。


HTML generated by 3bmd in SBCL 1.2.13

medley/miscの紹介

Posted 2014-06-18 16:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の170日目です。

medley/miscとはなにか

 medley/miscは、CMUのAIレポジトリに置かれているXerox Medleyで動くInterlisp-Dや、Xerox Common Lisp用のプログラム集です。

パッケージ情報

パッケージ名medley/misc
配布サイトPackage: lang/lisp/code/impdep/medley/

インストール方法

 特にパッケージシステム的なものもないのでファイルをloadします。

試してみる

 配布されているmisc.tgzの中身のうちソースコードは大体下記の通りです。

  • PRINTSERVER
  • canvasconverter
  • doc-objects
  • heffron-postscript
  • makefiletextpatch
  • nsasciipatch
  • pp-code-file
  • rolo
  • starbg
  • tmax-ngraph
  • activeregions
  • cd
  • documentationpatch
  • fontsampler
  • hgraph
  • makegraph
  • nscopyfile
  • preemptive
  • rpc
  • step-command-menu
  • tmax-ngroup
  • add-sedit-commands
  • chat
  • donz
  • ftpserverpatch
  • hpgl
  • manager
  • nsdisplaysizes
  • pressfromns
  • rpccommon
  • storage
  • tmax-number
  • address
  • cl-ttyedit
  • granite
  • idlehax
  • nsprotection
  • prettyfileindex
  • rpclowlevel
  • systats
  • tmax-xref
  • airegions
  • clock
  • dovekeyboards
  • graph-pcl
  • inspectcode-tedit
  • mandelbrot
  • nstalk
  • rpcos
  • talk
  • todo
  • airegions-demo
  • closeallpatch
  • dpupftppatch
  • graphcalls
  • invisiblewindow
  • mathtons
  • nstalkgap
  • printermenu
  • rpcportmapper
  • talkgap
  • trajectory-follower
  • analyzer
  • commands
  • dspgraphtranspatch
  • grep
  • iptalk
  • microtek
  • pac-man-idle
  • profiler
  • rpcrpc
  • trickle
  • ansikeypad
  • commentstrings
  • dspscale
  • grid-icons
  • keyobj
  • microtekprint
  • pacman
  • promptreminders
  • rpcstruct
  • tcptime
  • ttytalk
  • ansikeypaddata
  • common-makefile
  • editbg
  • kinetic
  • missile
  • pagehold
  • proofreader
  • rpcxdr
  • turbo-windows
  • autobind
  • commwindow
  • editkeys
  • kotologo
  • mlabel-demo.mlabel
  • phone-directory
  • ps-send
  • screenpaper
  • tedit-emacs-translator
  • twodgraphics
  • background
  • compilebang
  • environmentpatch
  • h-env
  • layout-sedit
  • mlabel
  • pict
  • ps-tty
  • sedit-compile
  • teditkey
  • unboxedops
  • background-parc.press
  • courierdefs
  • equationforms
  • h-load
  • piece-menus
  • qedit
  • sedit-menu-always
  • tedittalk
  • uuencode
  • background-rhine.press
  • courierevalserve
  • equations
  • life
  • monitor
  • planets
  • qix
  • setdefaultprinter
  • therm
  • vstats
  • courierimagestream
  • etherboot
  • lispxconvert
  • multich
  • play
  • readais
  • showtime
  • tiled-sedit
  • wdwhacks
  • background-twodollar.press
  • courierserve
  • etherinfo
  • h-patches
  • multimenu
  • plot
  • readbrush
  • singlefileindex
  • tinytidy
  • who-line
  • backgroundimages
  • dateformat-editor
  • h-source
  • loadfiletypepatch
  • multiple-hardcopy
  • plotexamples
  • readdatatype
  • sketchtalk
  • tmax
  • whocalls
  • bitmap
  • daybreakkeyboards
  • fbsettypepatch
  • hanoi
  • loadmenuitems
  • multiw
  • plotobjects
  • region
  • solid-movew
  • tmax-date
  • xcl-bridge
  • boundary
  • defaultsubitemfn
  • fillregion
  • hashbuffer
  • lookupinfiles
  • neaticons
  • plotobjects1
  • register-machine
  • solitaire
  • tmax-endnote
  • bsearch
  • finger
  • hashdatum
  • macpaint
  • notepad
  • port-clfile
  • remotepsw
  • spellingarray
  • tmax-index
  • calendar
  • dirgrapher
  • fm-creator
  • headline
  • notepad-corestyles
  • postscript
  • resize-filebrowser
  • split-file

 拡張子があったりなかったりするのですが、ファイルの先頭に、

(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP")

(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "XCL")

のように書いてファイルでのLisp方言とリードテーブルを切り換えることができたようです。
前者は、Interlispのリードテーブルを用いてInterlispパッケージで読み込み、後者は、Xerox Common Lispのリードテーブルを用いてXCLパッケージで読み込みという具合。

 試してみた感じでは、InterlispのリードテーブルはCommon Lispの用にシンボルの大文字小文字を大文字に統一したりはしないようで、逆に大文字で書いてやる必要があるみたいです。
この辺りはファイルによってまちまちで、Interlisp-DではCommon Lispの環境も統合されていたため、Interlisp-Dの記述の中にCommon Lispの記述があったり、Common LispのリードテーブルでInterlispのコードを読み込んでみたりと、結構自由だったみたいです。

 あまりInterlispのコードも目にしないと思うので上記からgrepのコードを記載してみます。
記法の簡単な解説ですが、

  • (* ...)がコメント
  • []は超括弧。対応した[]同士で閉じるか、開いた(を]一つで全部閉じる
  • rpaqqは、defvarみたいなもの
  • 関数の定義は、defineq(LISP 1.5のdefineの流儀)
  • bindというのは、Common LispのLOOPの元になったFOR。LOOPでいうLOOPキーワードを関数名として利用することもできたので、bindから書かれています(LOOPでいうと、(with foo x in ...)と書いているようなもの

というところです。

 スタイルの特徴としては、Interlisp-DはSmalltalkのようにイメージ指向なためファイルを編集するということがあまりありませんでした。(もちろん書き出すことは可能です。)
コードの整形や、日付等のコメントの挿入も自動でやってくれるため、そんな雰囲気がコードにも出ているかなと思います。

(FILECREATED "14-May-86 08:04:43" {DSK}<LISPFILES>GREP.;1 2502   

      changes to:  (FNS DOGREP)

previous date: " 5-Mar-86 12:15:18" {DANTE}<LISPNEW>LISPUSERS>GREP.;1)

(* Copyright (c) 1984, 1985, 1986 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT GREPCOMS)

(RPAQQ GREPCOMS ((FNS DOGREP GREP PHONE) (FILES BSEARCH) (INITVARS (PHONELISTFILES)))) (DEFINEQ

(DOGREP [LAMBDA (STR FILES) (* Newman "14-May-86 08:04")

(* * Originally coded by Larry Masinter.)

(* * No longer permanently modifies the DSPFONT when DSPFONT is not the same as the DEFAULTFONT. -DVN "14-May-86 08:03:59")

(if (LISTP FILES) then (for FILE in FILES do (DOGREP STRS FILE)) elseif (STRPOS "*" FILES) then (DOGREP STRS (DIRECTORY FILES NIL "*" "")) else (RESETLST (INFILE FILES) (RESETSAVE NIL (LIST (QUOTE CLOSEF?) (INPUT))) (RESETSAVE NIL (LIST (QUOTE DSPFONT) (DSPFONT))) (bind FOUND for STR inside STRS do (SETFILEPTR NIL 0) (bind POS while (SETQ POS (FFILEPOS STR NIL NIL NIL NIL NIL UPPERCASEARRAY)) do (OR FOUND (PROGN (PRINTOUT NIL T .FONT COMMENTFONT "(from " (INPUT) ")" .FONT DEFAULTFONT) (SETQ FOUND T))) (COPYCHARS NIL T (OR (BFILEPOS [CONSTANT (MKSTRING (CHARACTER (CHARCODE CR] (INPUT) 0 POS) 0) POS) (DSPFONT BOLDFONT) [COPYCHARS NIL T POS (SETQ POS (IPLUS POS (NCHARS STR] (DSPFONT DEFAULTFONT) (COPYCHARS NIL T POS (ADD1 (FILEPOS (CHARACTER (CHARCODE CR)) NIL POS])

(GREP (LAMBDA (STRS FILES) (* lmm " 1-Apr-85 15:27") (RESETLST (DOGREP STRS FILES))))

(PHONE [LAMBDA (NAME) (* lmm " 5-Mar-86 12:14") (GREP NAME (OR PHONELISTFILES (PROMPTFORWORD "Name of directory file: "]) ) (FILESLOAD BSEARCH)

(RPAQ? PHONELISTFILES ) (PUTPROPS GREP COPYRIGHT ("Xerox Corporation" 1984 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (392 2368 (DOGREP 402 . 2000) (GREP 2002 . 2091) (PHONE 2093 . 2366))))) STOP

 さらについでに、上記のqeditというリストで作ったキューをGUIで操作できるという謎のプログラムを起動したスクリーンショットを載せてみます。

qedit-il

まとめ

 今回は、medley/miscを紹介してみました。
medley/miscは、かなり雑多なファイルの寄せ集めです。一個ずつ紹介すればネタも増えて嬉しいなと思いましたが、さすがに需要がないかと思い、まとめて紹介することにしました。
個別に紹介したいものがあれば、別途紹介記事を書くかもしれません。

Medleyを使ってみよう(1)

Posted 2010-11-12 14:25:00 GMT

80年代初頭で二大LISPといえば、MacLISPとInterlispのことだったらしいですが、今の二大LISPといえば、Common LispとSchemeで、MacLISP系のCLやEmacs lispに触る機会はあってもなかなかInterlisp系に触る機会もなくなってしまいました。
ほぼ見掛けなくなったInterlispですが、実はMacLISP系/Interlisp系ともにLispマシンが作成されていて、MacLISP系は、CADR〜Symbolics、Interlisp系は、XeroxのInterlisp-Dと進化をしていったようです。
このInterlisp-Dなのですが、最終的には専用マシンが仮想マシン化されていて、仮想マシン化されたものは、Medleyと呼ばれているようです。
このMedleyなのですが、丁度5年程前に、
- Swiki: Interlisp-D
の記事を読んで面白いと思ってちょっといじってみていました。
- #:g1: Interlisp-Dを使ってみる
当時はLISPのことは殆ど分からなかったのですが、今なら少しは分かるようになったので、改めていじってみようかなと思います。

起動させる

とりあえず、上記のInterlisp-D紹介ページのリンクを辿って
ftp://ftp.parc.xerox.com/pub/lfg/ldex
ftp://ftp.parc.xerox.com/pub/lfg/lfg.sysout.gz
をダウンロードします。
ldexに実行属性をつけ、
./ldex lfg.sysout
で起動すれば良いのですが、libcのバージョンやらなにやらで起動しないことが結構あります。
OSが変わる度に動いたり動かなくなったりすることも多いので、今回は、qemuや、VMware上で動かしてみることにしました。
ちなみに、自分は、VirtualBoxで試しています。
自分が動くことを確認したのは、ちょっと古めのKNOPPIX V3.6-2004です。
KNOPPIX_V3.6-2004-08-16-EN.iso
を探してこのLiveCDから起動するのが簡単かなと思いました。
LiveCDでOSを起動させ、仮想マシンに上記のダウンロードしたファイルを設置し、
./ldex lfg.sysout
として起動してみます。
送信者 LISP

という感じで起動します。
実は、このMedleyはこれ単体で配布されているのではなく、LFGというアプリケーションを動かす環境として配布されているらしいのですが、Medleyもほぼ丸ごと付属してきている、ということらしいです。
とりあえず、Medleyの環境を使いたいので、LFGのアプリは、ウィンドウの画面の上で右クリックしてぽちぽち消して行きます

LISP環境の起動の仕方

送信者 LISP

LISP環境としては、Interlispだけでなく、Xerox Common Lisp(CLtL1)も起動します。この環境もなかなかレアではないでしょうか。
起動方法ですが、右クリック→EXEC→でXerox Common Lispでリスナーが開きます。
ヘルプは、リスナー上で、:?するとヘルプ一覧が出てきます。

関数を定義して遊ぶ

関数の定義は、
(ed 'foo)
などとすると、エディタが開くので、それを編集するという流れになります。既存の定義も同じようにして編集できます。

環境はイメージ指向

今の馴染みの開発/実行環境は、関数定義などは、ファイルに書き出すというファイル指向だと思いますが、Medleyは、同じXeroxのSmalltalkと同じようにイメージ指向です。
環境の保存には、右クリックメニューからSaveVMを選択しイメージの状態を保存します。
この方法だと、ホームディレクトリ直下にlisp.virtualmemというイメージが保存されます。
次回起動時には、
./ldex lisp.virtualmem
とすることによって保存した仮想マシンの状態をそのまま復活させることができます。

ということで今回はざっと導入までを調べてみましたが、結局CLの方を触ってばかりで、全然Interlispの方は触っていませんでした。
徐々に、Interlispの世界も探っていきたいと思います。

Interlisp-Dを使ってみる

Posted 2005-11-15 04:27:00 GMT


Lispマシンについて適当に検索とかをしていたら、XeroxのLispマシンの環境がLinux等で使えるらしいとのウェブページをみつけました。

面白そうなので、早速ページの情報を元に早速探索開始。
とりあえず、Linuxで説明の通り起動してみて適当にいじってみましたが、ちょっといじっただけでも非常に面白いです。
特筆すべきは、ホストOSとの親和性が非常に高いところで、ホストOSとのファイルのやりとりが非常に良く考えられていて、ホストOSのファイルにInterLisp-D風にバージョン番号が振られていたり(恐らく、ファイルのタイムスタンプをみて番号を振っていると思われる。自分は、EMACSのバックファイルにはバージョン番号を振っているので、foo.el.~12~のようなファイルが沢山あり、それが、foo.el;12のようになっている)時刻もホストOSから取ってくるし、感心することしきりです。まだ、それほど深くは探究できていませんが、他にも色々あるに違いありません。

InterLisp-Dの入門マニュアルもPDFファイルでダウンロードできるので、それを参照しながらLispのインタープリタで遊んでもみましたが、これまたコマンドインタープリタとして新しい発見というか、便利だなと思うアイディアに溢れている感じです。

それと、bitsavers.orgに保存されているマニュアルのInterLisp-D: Friendly Primer 18.2章のMaking Your Own SYSOUT Fileによれば、InterLisp上から(sysout '{dsk})とすれば、ディスクに今の実行環境がそのままダンプできるっぽいので、実行してみたところ、そのまま簡単にダンプできました。
それを使用して、ホストOSから
ldex ./.SYSOUT
の様に実行するとスナップショットを取った環境が起動します。うーん、ステキー(゜∀゜)━( ゜∀)━(  ゜)━(  )━(  )━(゜  )━(∀゜ )━(゜∀゜)━━━!!