プログラミング言語 Scheme 教育環境
NGSCM の開発
角川裕次, 伊東靖英, 山下雅史
広島大学工学部第二類
電気・情報関係学会中国支部第44回連合大会, p.p.383-384 (1993年10月)
1. はじめに
プログラミング言語 Scheme は Lisp の一方言で,
その単純さと強力さのためにプログラミング言語の研究用だけでなく,
プログラミング入門にも適した言語である.
マサチューセッツ工科大学, カーネギーメロン大学,
カルフォルニア大学バークレイ校等,
多くの大学でプログラミング入門の講義で導入されている[1].
特に Lisp 系言語では, 処理系の会話性が言語の理解やプログラム作成の効率
に大きな影響を与えるので, 会話性の高い処理系を用いることが重要と考えられる.
しかし, 学生実験等での Lisp 系言語のプログラミング演習では,
言語処理系とエディタの連係が貧弱であるために, 劣悪なプログラミング環境での
学習を余儀なくされる場合が多い.
我々は学部 2 年生向けに, Scheme を用いてのプログラミング入門を目的とした
学生実験を担当しており, この問題は深刻であると考えた.
本稿では, 快適なプログラミング環境を学生に与えることで
より良い教育効果を得ることを目的として開発した Scheme の教育環境
NGSCM について報告する.
2. 従来の問題点と開発目標
多くの Lisp 系の言語処理系では, 入力の編集機能に1文字削除程度の編集機能しか
用意されていない.
このため, プログラムが大きくなると, エディタでプログラムを書いてセーブした後,
処理系を起動後ロードし実行することの繰り返しが行なわれる.
これでは, プログラム編集時は別としても, プログラム実行の際の入力が非常に苦痛である.
一方, 筆者が普段用いているエディタ GNU Emacs には,
Scheme Interaction モードと呼ばれる, GNU Emacs を Scheme 処理系
のフロントエンドとして用いる機能が用意されている.
これは, Scheme 処理系が下位プロセスとして動作し,
GNU Emacs のバッファに入力された S-式が Scheme 処理系に渡され,
その評価結果がバッファに取り込まれる機能である.
よって GNU Emacs をひとたび起動すれば, Scheme プログラムの作成と実行の
全てが行なう事ができる.
また, 入力した S-式や Scheme の出力全てがバッファに履歴として残るので,
これをカット&ペースト機能で新たな入力として利用でき, 更にエディタの編集機能を
用いて自由な書換えが行なえる.
我々は, これと同様な環境を学生に提供しないと効率の良い学習は不可能と考えた.
学生実験での使用を考えると, 以下の 3 つの条件を満たす必要がある:
- 会話性に優れたシステムであること,
- 小規模の計算機でも効率よく動作すること,
- 移植性の高いシステムであること.
(パーソナルコンピュータでも利用可能であること.)
パーソナルコンピュータで動作させるという条件は, 大学と同じ実験環境で
学生実験の続きや発展した学習を学生が下宿でも可能とするためのものである.
そこで, MS-DOS での動作も目標とする.
GNU Emacs を用いれば良いが, 動作にはかなりの計算機資源を必要とし,
上の条件を満たさない.
そこで, コンパクトなエディタに Scheme 処理系を埋め込むことで,
GNU Emacs での Scheme Interaction モードと同様な環境の開発を開始した.
3. 実装
NGSCM の実装について説明する.
NGSCM はエディタ部とSchemeインタプリタ部より構成される.
エディタやScheme インタプリタを最初から作成するのは大変なので,
フリーソフトウエアを利用した.
エディタ部には GNU Emacs に似た操作感を実現した Ng エディタを,
Scheme インタプリタ部には文献 [2] に準拠した Scheme 処理系 SCM を用いた.
それぞれを独立したプロセスとして動作させ, プロセス間通信を用いて
S-式を Ng からSCM に, SCM による S-式の評価結果を Ng に渡すという解決策が
考えられる. (GNU Emacs ではこの方法を用いている.)
この方法では, マルチタスク及びプロセス間通信が可能なオペレーティングシステムで
ないと実現不可能である.
そこで, 以下の改造を行ない, Ng と SCM を1つのプログラムにまとめて
疑似並行動作を実現した.
- SCM における画面への文字出力を, Ng の Scheme バッファへの
文字挿入にする.
- SCM におけるキーボードからの 1 文字入力を, Ng のバッファからの
1文字読み出しにする.
- Ng において, Scheme の S-式を評価させるキー
(C-j または C-c C-e)
が押されたら, SCM での1 文字読み出しの範囲を Ng のバッファのその S-式に設定する.
そして, SCM の S-式 reader を呼び, 読み出された式を SCM の Scheme 評価子に渡して
式の評価を行なう.
4. 実行例
NGSCM では, Scheme プログラムの作成から実行までの全てを NGSCM を終了することなく
行なうことができる. 例を用いて, その過程を示す.
まず NGSCM を立ち上げ, fact.scm というファイルにプログラムを作成する (図1).
(図1 プログラムの入力)
図1では, NGSCM のマルチウインドウ機能を用いて画面を2つに分割している.
上側のウインドウは Scheme とのやりとりを行なうバッファ(*scheme*
),
下側のウインドウはファイル fact.scm の編集バッファである.
評価された S-式は全てバッファ *scheme*
に挿入される.
バッファ fact.scm において (define (fact n) ...)
の直後で C-c C-e を入力すると, S-式
(define (fact n) ...)
が
Scheme 処理系に渡され, 評価される. そして評価結果が *scheme*
バッファに挿入される(図2).
(図2 Scheme 手続きの定義)
これによって手続き fact
が定義される.
図3では, カーソルを *scheme*
バッファに移し,
手続き fact の呼び出しを行なっている.
>
は Scheme のプロンプトであり,
(fact 10)
が利用者の入力である.
(図3 プログラムの実行)
5. 検討
上で述べた事の他に, Scheme プログラミングを支援する以下の機能が用意している.
- 括弧の自動点滅機能.
閉じ括弧を入力すると, 対応する開き括弧が一瞬点滅する.
- 字下げ機能. プログラムの構造を一目で理解できるよう,
自動的に字下げが行なわれる.
- 自習機能. オンラインで NGSCM の編集機能の自習が行なえる.
これは GNU Emacs の Tutorial 機能を実現したものである.
初心者は, Scheme の文法や組み込み手続きの引数の順番などを十分
に理解していないことが多い. 初心者用のヘルプ機能として, 今後は以下の機能を
NGSCM に持たせることが必要と思われる.
- Scheme の言語仕様書の検索機能.
- 例題を多く含んだ Scheme プログラミングの自習機能.
6. 結論
NGSCM は GNU Emacs と同様な感覚で Scheme プログラムの作成と実行が行なえる.
また非常にコンパクトなので, 小規模の計算機でも十分実用になる.
Sun SPARC Station ELC (主記憶 24 MByte) で X-Window を立ち上げた状態で,
7 ユーザーが同時に NGSCM を実行させても十分なレスポンスタイムが得られた.
NGSCM は Unix オペレーティングシステム(BSD 及び System V)の動作する
多くの機種, MS-DOS, Human 68K (X68000) で稼働している.
NGSCM のソースコードは NetNews に投稿され, 容易に入手可能である[3].
最新版は広島大学の情報工学専攻の計算機
huis.huis.hiroshima-u.ac.jp (IP アドレス 133.41.33.221,
~ftp/lang/scheme/ngscm-1.09.tar.Z) に置かれており,
匿名 ftp で入手可能である.
参考文献
[1] T.Kaufman, Subject: Schools using Scheme,
Newsgroups: comp.lang.scheme,
Date: 11 Aug 93 07:45:18 GMT.
[2] W. Clinger and J. Rees (Ed.),
"Revised$^4$ Report on the Algorithmic Language Scheme."
[3] 角川裕次,
Subject: NGSCM 1.07 - the scheme system SCM under Ng editor [1/16],
Newsgroups: fj.sources,
Message ID: KAKUGAWA.93Jul7185925.
註:現在では、バージョン 2 が配布されている。
gull.se.hiroshima-u.ac.jp (IP アドレス 133.41.33.136,
~ftp/pub/ngscm/) に置かれており,
匿名 ftp で入手可能である.