[プログラミング演習(LISP)のトップページへ]

演習を始める前に

ここでは,演習を始める前に行う準備を行います.また演習で用いるツールについて,例を用い て簡単に説明します.各種コマンド,ツールに関する詳細な説明は ネットで検索することで調べられます.


もくじ

  1. OSと処理系の選択
  2. UNIXへのログイン方法と仮想端末の開き方
  3. 演習用ディレクトリの作成
  4. emacsによるテストプログラムの作成
  5. Schemeのインタプリタのテスト


OSと処理系の選択

メディアセンターの現在のシステムの場合,OSとしてWindowsか Linuxを選択できます.どちらでもLISP(Scheme)の処理系 (プログラミング言語を計算機で実行するためのプログラムとデータ群)を利用できます. WindowsにはDr. Racket,LinuxにはDr. RacketとMIT/GNU Schemeが インストールされています. 好みにより,どれを利用して頂いても構いません. あるいはファイル容量が許せば,自分の好きなLISP処理系を 自分のホームディレクトリの下にインストールして使用して頂いてもOKです. ただし授業では,Windows環境でDr. Racketを利用する場合をメインに説明していきます.

Dr. RacketもMIT/GNU Schemeも,Windowsあるいは LinuxやFreeBSDなどのFreeなUNIX系OSにインストールして使用することができま すので,自宅等で学習したい場合にはそれらの処理系をInternetから ダウンロードしてインストールするとよいでしょう.


UNIXへのlogin方法と仮想端末の開き方

まず,メディアセンタの利用講習会を受講して,自分のlogin IDで Windowsにloginできるようにしておくことをお勧めします. また,メディアセンタのシステムでUNIXを使用する方法は, 学生のための情報環境活用マニュアル の4. PC 端末サービスの利用方法のあたりに記載されています.

簡単にUNIXへのloginの方法を記しておくと,UNIXを使用には,まずWindowsにloginし, スタート->すべてのプログラム->UNIX(Linux)->ASTEX-X->ASTEX-X(UNIX) を選択し,再びloginIDとパスワードを入力すると,X Window Systemという Window Systemが動作します.

メディアセンターのUNIXでは,MIT/GNU Schemeをコマンドラインで使うようになっ ています. 右上の アプリケーション->システムツール->GNOME 端末 を選択すると, 仮想端末のウィンドウが開きます.この状態で,UNIXの各種コマンドを入力でき ます. 同様の動作を行えば,仮想端末を複数開くことができます.


UNIXの応答が遅い場合について

Windowsの場合には,目の前のPCでWindowsがOSとして動作し,その環境で いろいろなアプリケーションや言語処理系が動きます. UNIXをPCにOSとしてインストールすれば,Windowsの場合と同様に動作しますが, メディアセンタのUNIXの場合には,目の前のPCでUNIXが動作しているのではあり ません. 目の前のPCでは,OSとしてはWindowsが動作し,その上のアプリケーションプロ グラムとしてX Windowサーバ(プロセス)が走ります.また,メディアセンタに設 置されているUNIXサーバ(PC)でXのクライアント(プロセス)が動作します.結果 として,目の前のPCで,あたかもUNIXが走っているように見えるようになってい ます(クライアント・サーバという言葉が交差して,少しわかりにくいかも知れ ません).

センタのUNIXサーバは数台程度しかなく,全学からその数台のPCを共同で利用 することになります.したがって,計算機資源を大量に消費するプログラムが多 数動作すると,応答が遅くなることが予想されます.LISPのプログラムは,その ようなプログラムになる場合も結構あります.この授業では多人数でLISPプログ ラムを同時に動かすわけで,応答が遅くなる可能性が十分にあります. また,通信回線の調子が悪くても,応答が悪くなります. これらのような場合には,WindowsでDr. Racketを動かして演習を行うことを 推奨します.


演習用ディレクトリの作成

まず演習で作成するプログラムを一箇所にまとめて保存するための作業を行いま す.なお,単に作業手順を挙げるだけではなく,そのために必要な概念などにつ いて順を追って説明することにします.

UNIXシステムでは,各ユーザ(利用者)にひとつずつ ホームディレクトリが割り当てられています. ディレクトリとは, MacintoshやWindowsでいうところのフォルダのことで,ファイル,あるいは(さ らに別の)ディレクトリを収納・分類しておく箱のようなものです. 自分のホームディレクトリの配下には, 自由にファイルやディレクトリを作成することが できます.

ファイル,ディレクトリに対する操作を行うには, シェル(ユーザと直接やりとりを行うプログラム. ソフトウェアの階層の一番外側に位置するのでこの名がある)を介して, Unixコマンドを実行し ます. メディアセンターのシステムの場合,bashというシェルがデフォルトになってい ます. しかしこの授業ではtcshというシェルで 説明することにします. bashが動いている状態で,tcsh [Enter]と入力すれば,tcshが動作します. 実際に使ってみるとわかるように,bashに対してもtcshと同様の コマンド入力で動作する場合もかなりありますので, tcshのかわりにbashを利用して頂いても構いません.

シェルを起動した時の カレントディレクトリがホームディレクトリです.カレントディレクトリと は,シェルが現在参照している(基点としている)ディレクトリのことです.シェ ルが処理するのは,特に指定しない限り,カレントディレクトリのファイルやディ レクトリになります.カレントディレクトリはワーキングディレクトリともいい ます.カレントディレクトリは, 次のようにpwdコマンド(print working directory)で確認できます.

                               
%  pwd
/homes/gakubu/01/hzm9999
%
(%はプロンプト記号です.これは入力しません.青い部 分だけ入力します.また最後に[Enter]を入力します.以下同様.)

このとき表示されるのは, ルートディレクトリ(最上位にあるディレクトリ. "/"で表す。)からカレントディ レクトリまでのパス(ファイルシステム中のファイルやディレクトリの位置を表す文字列)です.

システムのすべてのファイルおよびディレクトリは,ルートディレクトリを頂点とした 階層構造で管理されています.つまり,ルートディレクトリ(UNIXでは『/』で表す)の下には,いくつかのディレクトリ(UNIXでは, usr,var,homeなど)があり,それぞれのディレクトリの下にはさらにいくつかの ディレクトリがあるというように,各ファイルは,ルートを根として次々と 枝分かれていく構造のどこかにあるディレクトリの中に収められています. パス,正確には絶対パスとは,ルートディレクトリから,特定のファイルあるい はディレクトリにたどりつくまでの道筋を示したものです.また相対パスとは, ルート以外のディレクトリを出発点としたパスです.パスによって,システムの ファイルあるいはディレクトリは一意に指定できます.

ディレクトリの内容は,lsコマンド(list)で 確認できます.lsにはさまざまなオプションがあります.よく使うオプションは, 「-a」,「-l」でしょう.

               
%  ls
%  ls  -a
%  ls  -l
%  ls  -al

オプションの後に対象とするディレクトリを(複数)指定できます. パスを指定しない場合は,カレントディレクトリの内容を表示します.




それでは,ここで,ホームディレクトリの下に演習用の新しいディレクトリを作 成することにします.ディレクトリの作成には, mkdirコマンド(make directory)を使います.

                   
%  mkdir  scheme

ディレクトリを作成したら,lsコマンドで確認してみて下さい.

次にカレントディレクトリを新しく作成したschemeディレクトリに変更します. カレントディレクトリの変更には,cdコマンド(change directory)を使います.

               
%  cd  scheme

カレントディレクトリを変更することを「ディレクトリを移動する」ともいいます. またカレントディレクトリが〜であるということを「現在〜というディレクトリ にいる」という言い方もします.schemeディレクトリに移動したら,pwdコマン ドでカレントディレクトリを確認してみて下さい.
               
%  pwd
%


emacsによるテストプログラムの作成

プログラムはエディタを用いて記述し,ファイルに保存しておくのが一般的です. この演習では,UNIXの標準的な汎用エディタであるemacsを用います. ここでは,emacsの使い方を学ぶために,まず schemeのごく簡単なテストプログラムを書いてみることにします.

emacsを起動するには, アプリケーション->プログラミング->Emacs テキスト・エディター を選択するか,シェルで

               
%  emacs  &

を実行します.ここで『&』記号は,コマンドをバックグラウンド実行 (コマンドを並行して実行すること。裏で実行するなどと言ったりする。 シェルのプロンプトが直ぐに表示されて、次のコマンド入力を受け付ける)するこ とを意味します. emacsを起動すると,次のような画面が表示されます.この画面の上に プログラムを入力していくことになります. なお,初期画面に表示されているのは説明文で,何か操作をすると消えます. また,下の方にある細い緑色の帯をモード行といいます.またモード行の下の部分を ミニバッファといいます.

emacsの初期画面
emacsの初期画面

emacsでは,[Ctrl],[Alt]などのキーと他のキーを組み合わせて,いろいろな操 作(コマンド入力)を行います.またそのような操作法を以下のように記述します. まずこの独特の記述法を覚えてください.

C-g [Ctrl]を押しながら[g]を押す.
C-x C-c [Ctrl]を押しながら[x]を押す.続けて[Ctrl]を押したまま[x]を離して[c]を押す.
C-x i [Ctrl]を押しながら[x]を押す.続けて[Ctrl]と[x]を離して[i]を押す.
M-w [Alt]を押しながら[w]を押す.
M-x info [Alt]を押しながら[x]を押す.つづけて[Alt]と[x]を離 して[i][n][f][o]と入力し,最後に[Enter]を押す.
注意:: [Ctrl],[Alt]以外のキーは押したらすぐに離します.

表で C-と書いてあるものは,コントロールと読 みます(「C-x」=コントロールエックス). またM-と書いてあるものは,メタと読みま す(「M-x」=メタエックス). この読み方に示されるように,M-に関しては,本来は[Meta]キーを使うことに なっているのですが,[Meta]がない場合は,[Alt](オルト)で代用します. また[ESC](エスケープ)でも代用できます.ただし[ESC]を使う場合は押したらす ぐに離します(M-xと入力するのに,[ESC]を押して離して,つづけて[x]を押して 離します). なお,これらのコマンド入力は,ミニバッファに表示されます.

注意
[Ctrl]キーと[CapsLock]キーを入れ換えると利用しやすいですが, それはxmodmapというコマンドを使用すれば可能なはずです.




それでは,emacsでテストプログラムを作成してみましょう. まずファイルを新規作成します.

C-x  C-f ファイルを開く

これは,ファイルを開くコマンドですが,ファイルがない場合は,新しく作成す ることになります. あとは次の画像で示す例のようにして,ファイル名を入力してください(最後に [Enter]を入力すること).なお,この例のように,schemeのプログラムのファイル名は,必ず「.scm」で終るようにし て下さい.emacsは「.scm」ファイルをschemeのプログラムのファイルと判断し て,scheme編集モードに入ります.

ファイルの新規作成
ファイルを開く(C-x C-f) ファイルを開く(ファイル名の入力) ファイルを開く(Schemeモードになった状態)
ファイルを開く(C-x C-f) ファイルを開く(ファイル名の入力) ファイルを開く(Schemeモードになった状態)

ファイルを開いたら,次の図の通りにプログラムを入力してみて下さい. なお,プログラム中で「;」以降は,行末までコメントになります. その部分はプログラム実行時には無視されます.

テストプログラム
テストプログラム
入力できたら,ファイルをセーブ(保存)してください.

C-x  C-s ファイルをセーブする

ファイルのセーブ
ファイルのセーブ

ファイルをセーブしないと,他のツールからファイルを利用することができません. なお,ファイルをセーブしていない状態では,画面下のモード行の左の方に,『**』が表示されます.ファイルをセーブすると,これが『--』に変わります.つまり『**』は, セーブが必要な変更が行われていることを意味します. 一方『--』は何も変更が行われていないことを意味します.

なお,コメントなどに日本語の文字を入力した場合,セーブする時にEmacsが 最下行にSelect coding system (default euc-jp): などとして, 使用する文字コードシステムをきいてくる場合があります.この場合, GNOME端末の文字コードシステムと同じものを設定します. これを合わせておかないと,catなどの UNIXコマンドで日本語の部分を表示させることができません.

例えばGNOME端末であれば,端末のウィンドウのメニューの, 端末(T)->文字コードの設定(C)->で,現在利用している 文字コード体系を調べたり,変更したりすることができます. これと同じコード体系を選べば,Emacsでセーブした日本語のファイルを 仮想端末で表示させることができます. なお,文字コード体系の名前がEmacsでは小文字になっていますので注意して下 さい.

いますぐに行う必要はありませんが,emacsを終了するには,つぎのコマ ンドを実行します.

C-x  C-c emacsを終了する

このとき,編集してあるのにセーブしていないファイルがあれば, ファイルをセーブするかどうか訊かれます.

emacsに関する詳しい説明,たとえば,カット&ペーストなどの編集機能,複数のファイルを同時に編集する方法,日本語入力の方法などについては, ネットで検索して下さい.


Schemeのインタプリタのテスト

テストプログラムを作成しましたので,次にプログラムを実行してみましょう. シェルで,プログラムをセーブしたディレクトリ(scheme)をカレントディレクト リにしてください.lsコマンドでファイル(test.scm)が存在するかどうか確認し て下さい.確認できたら,次のようにschemeのインタプリタ(scheme解釈システ ム)のschemeを起動して下さい.

               
[a0000000@unix3 ~/scheme]$  scheme
MIT/GNU Scheme running under GNU/Linux
Type `^C' (control-C) followed by `H' to obtain information about
interrupts.
Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007 Massachusetts Institute of Technology
This is free software; see the source for copying conditions. There is
NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.
Image saved on Monday February 5, 2007 at 2:27:13 PM
Release 7.7.90.+ || Microcode 14.18 || Runtime 15.7
1 ]=>

起動メッセージが表示された後の『1 ]=>』がschemeのプロンプトです. ここから式を入力すると,ただちに解釈されて,式の値が評価されます.

それでは,さきほど作成したプログラムをロードして(読み込んで)みましょう. プログラムをロードすると,その内容がすべて評価されます.

               
1 ]=>  (load  "test.scm")

;loading "test.scm"... done
;Value: prev

1 ]=>

では,以下のように入力してみて下さい.値は適当で構いません.

               
1 ]=>  (succ  0)

;Value: 1

1 ]=>  (succ  -3)

;Value: -2

1 ]=>  (prev  2)

;Value: 1

1 ]=>  (exit)


Kill Scheme (y or n)? y
Happy Happy Joy Joy.
[a0000000@unix3 ~/scheme]$

ここに示したように,schemeを終了させるには(exit)を評価します. 代わりに『^D』([Ctrl]+[d])でもOKです.

以上で,schemeの演習用のディレクトリを作成して,さらにschemeの演習の基本ルーチン

を一通り体験したことになります. なお,作成したプログラムがうまく動かない場合には, というルーチンを繰り返すことになります.


Schemeのコマンドラインで編集機能を使う

メディアセンタのMIT/GNU Schemeの場合,コマンド入力行の 編集機能はバックスペースによる最低限のものしかありません. 一方,tcshやbashは, ヒストリ機能を含めてコマンド行の多彩な編集機能を提供しています.

行入力により対話的に動作するプログラムに, いろいろな編集機能を付け加える汎用的なプログラムを, 同僚の日置先生がインストールされています.ここではそれを使って, MIT/GNU Schemeに多機能な編集機能を付け加える方法を紹介します.

これは基本的には,以下のように使用します. なお,ここではshellのPATHにこのコマンドが入っているディレクトリが 入っていない(これを,パスが通っていない,などと言ったりします) として説明します.

               
[a0000000@unix3 ~]$  /public/cgp/bin/rlwrap コマンド名

MIT/GNU Schemeの場合には,以下のようにコマンドを打ち込んで 起動すれば,Schemeでも種々のコマンド業編集機能を利用できます.
               
[a0000000@unix3 ~/scheme]$  /public/cgp/bin/rlwrap scheme


[情報科学のためのプログラミングIのトップページへ]