TUTScheme Tips
OSによって改行コードが異なるため,Windows上のエディタで書いたプログラムをCygwin上のTUTSchemeでロードするとうまく読み込めないことがあります.その解決法としてこんな方法もあります.
- 以下を内容とするファイルを(改行コードが)Cygwin形式のファイルとして作成する.ファイル名は何でも構いませんが,ここではmy-dos2unixとします.
#!/bin/sh
dos2unix < $1
- 1 のファイルに対して,以下のコマンドにより実行権を与える.
$ chmod +x my-dos2unix
- 以下を内容とするファイルをCygwin形式のファイルとして作成する(ここではファイル名をdosload.lspとする).ただし,変数 *my-dos2unix-path* の値は 1で作成したファイルのパス名とする(下記は cygwin のホームディレクトリに置いた場合).
(define *my-dos2unix-path* (format #f "~a/my-dos2unix" (getenv "HOME")))
(define (load filename)
(let ((p (run-process *my-dos2unix-path* filename :output :pipe)))
(if *loading-message*
(format #t "Loading ~a...~%" filename))
(let loop ((x (read (process-output p))))
(if (eof-object? x)
(if *loading-message*
(begin
(close-input-port (process-output p))
(display "Finished.")
(newline)))
(begin
(eval x)
(loop (read (process-output p))))))))
4. TUTScheme において dosload.lsp をロードした後は,Windows形式のファイルを load 関数でロードできるようになります(scheme.lsp に書いておけば便利).ただし,少し手抜きのためファイル名は文字列で与えてください(記号は不可).
- TUTSchemeにはEmacsライクなエディタMINEが組み込まれています(UNIX系のみ).
使用例:
> (ed 'foo) ;; foo.lspのエディット
プログラムを書いたらC-x y
...するとファイルのセーブ・エディタの終了・foo.lspのロードが行われる.
> ... ;; プログラムの実行
> (ed) ;; foo.lspの再エディット(今度はファイル名を省略可)
EmacsからTUTSchemeを使う
(setq scheme-program-name "/usr/local/bin/tus")
;; Schemeプログラムのファイルの拡張子を .lsp にするなら以下も追加
(setq auto-mode-alist (cons '("\\.lsp$" . scheme-mode)
auto-mode-alist))
EmacsからM-x run-schemeを実行すると,TUTSchemeがEmacsのバッファの中で起動する.これでTUTSchemeをEmacs上から利用できるようになるが,便利なのは下記の機能.
Emacsで(既存の,あるいは新規に)Schemeのプログラムファイルを開く
(ここではfoo.lspを開くとする).この際,Scheme modeになっていることを確認(モードラインが「--:-- foo.lsp ... (Scheme) ...」のように"(Scheme)"が示されていればOK.そうでなければ上記のauto-mode-alistを適切に設定するか,M-x scheme-modeを実行).また,TUTSchemeのバッファ(*scheme*バッファ)とfoo.lspのバッファを2分割するなどして両方を表示しておく.
プログラムを書いたら,foo.lspのバッファでC-c C-l RET を実行する.すると,foo.lspがTUTSchemeへロードされる(TUTSchemeのバッファでそれが確認できるはずである).この後,プログラムをあれこれ実行するためにTUTScheme のバッファから式を入力してもよいが,foo.lspのバッファから式を入力することもできる.例えば,foo.lspのバッファに「(+ 1 2)」と書き込んでC-c C-eを実行すると「(+ 1 2)」がTUTSchemのバッファへ送られて評価・結果の表示が行われる:
...
(+ 1 2) C-c C-e
--:** foo.sp .... (Scheme)----....
> (+ 1 2) ;; foo.lspバッファの「(+ 1 2)」がC-c C-eによってTUTSchemeに入力される
3
>
-u:** *scheme* ....
その他:TUTSchemeのバッファでは,M-p や M-n で(Emacsによる)ヒストリ機能が使える.
- 大域変数 *inline-functions* の値を #t にしてから関数定義を行うと,
組込み関数のいくつかをインライン展開し,実行速度が向上します
(TUTSchemeの実行方式は,コンパイル&バイトコードインタプリタ方式です).
但し,デバッグの時に少し困ることがあるかも知れません.
- TUTSchemeは,起動時に環境変数 SCM_DIR が示すディレクトリの下にあ
るファイル scheme.lsp を読み込みます.例えば,SCM_DIR を /home/xxx/scm
と設定しておけば,起動時に /home/xxx/scm/scheme.lsp を読み込みます.
よく使うユーザ定義関数や,*inline-functions* の設定を scheme.lsp に書
いておくと便利です.
- 関数sctopを書き換えると,自前のread-eval-print loopを使うことがで
きます.
> (define (sctop)
(display "=> ")
(write (eval (read)))
(newline)
(sctop))
sctop
> (sctop)
=> (+ 1 2)
3
=>
- 関数save-imageを使って,ヒープイメージをファイル(saved_image)にセー
ブすることができます.TUTScheme起動時にこのヒープイメージを指定するこ
とで,セーブ時点のヒープを利用できます.
> (define (sctop) ...)
sctop
> (sctop)
=> (save-image)
#t
=> (bye)
% /usr/local/lib/tus/raw_tus -h32 -l./ # -l<ヒープイメージファイルを置くディレクトリ>/
TUTScheme version 1.4g
(C) Copyright Taiichi Yuasa, 1991. All rights reserved.
If you find any bug, please send bug reports to
komiya@kuis.kyoto-u.ac.jp.
=>