GNU Smalltalk
GNU Smalltalk(グヌー スモールトーク)はGNUプロジェクトにより開発されているSmalltalk環境。[1] 概要CUI環境で開発できるSmalltalk環境として開発されており、CUIに特化しており基本構成ではその他のSmalltalk環境で一般的な統合開発環境のGUIを備えておらず (Headless mode)[※ 1]、GUIからソースコードを入力して編集することはできない。起動コマンド実行時に指定したソースファイル、またはイメージを読み込んで起動するという他のプログラミング言語では一般的だが、Smalltalk環境では異色の方式をとっている。 特徴インタープリター実行と仮想機械によるイメージファイル実行GNU Smalltalkはフロントエンドとして対話的に実行できるインタープリター(通訳機能)を備えており、代表的な起動コマンドである 独自構文GNU Smalltalkは起動コマンドの引数に指定するソースファイルは、Smalltalk環境の交換用に一般的なファイル用構文であるChunk形式を使うことができるが、ファイル上での編集性を考慮した独自構文を備えている。例えば下記(1)のChunk形式は下記(2)となる。 (1) Chunk形式 Object
subclass: #Example
instanceVariableNames: 'variable0'
classVariableNames: ''
poolDictionaries: ''
category: 'example'.
Example methodsFor: 'Instance Methods'
!
selector0
^ 0.
!
selector1: anArgument
^ 1.
!!
Example class methodsFor: 'Class Methods'
!
selector0
^ 2.
!
selector1: anArgument
^ 3.
!!
Transcript
nextPutAll: 'example';
nl.
(2) 独自構文 #!/usr/bin/gst
Object subclass: Example
[
| variable0 |
<category: 'example'>
selector0
[
<category: 'Instance Methods'>
^ 0
]
selector1: anArgument
[
<category: 'Instance Methods'>
^ 1
]
Example class >> selector0
[
<category: 'Class Methods'>
^ 2
]
Example class >> selector1: anArgument
[
<category: 'Class Methods'>
^ 3
]
].
Transcript
nextPutAll: 'example';
nl.
準標準的な構文標準ではないが他のSmalltalk環境にも存在する拡張構文として次のようなものが存在する。 非定数要素配列Smalltalkの標準的な配列は要素の指定として定数しか指定できないが、GNU Smalltalkでは非定数の要素用の配列構文を用意している。 array := { 1. 1 + 1 }. ".で区切った2番目の要素は通常の定数配列では指定できない。"
名前空間長い名前を省略できる仕組みとして名前空間を備えている。名前空間の解決については、他のSmalltalkと互換性があるが定義については互換性がない。 "名前空間登録"
Smalltalk addSubspace: #SystemExceptions.
"名前解決"
Smalltalk.SystemExceptions.InvalidValue signalOn: 0. "Smalltalk.SystemExceptions.までが名前空間"
"現在の名前空間切り替え"
Namespace current: Smalltalk.SystemExceptions.
なお構文ではないがメッセージ式形式で名前解決することもできる。この場合は、変数に代入した名前空間をさらに参照することができる。 | namespace |
"名前解決"
namespace := Smalltalk.
namespace SystemExceptions InvalidValue signalOn: 0.
標準ライブラリー膨大なクラスを備える他のSmalltalk環境と比べ数は少ないが、基礎機能が保守的なVisualWorksなどと比較して基礎機能に近代的なものが多い。近代的なものとしては下記がある。 このうち1と4について補足する。 反復子専用クラス従来のSmalltalk環境では列挙処理を集合体の抽象クラスであるCollectionが保有していた。列挙処理は必ずしも値を保持する集合体だけでなく入力用のストリームやDBMSに問い合わせた際の問い合わせ結果や生成器にも適用できる。このため他のクラスでも継承できるように集合体のCollectionから列挙処理を分離したものが反復子専用クラスとなっている。 複数例外の捕捉従来のSmalltalk環境では下記(1)の様に同時に1種類しか捕捉することができなかった。GNU Smalltalkでは下記(2)のように複数の例外捕捉を可能にしている。 (1) [
Error signal: '異常発生'.
]
on: Error
do:
[ :exception |
"エラーの例外だけを捕捉。#on:doはこれ以上増やせない。"
].
(2) [
Notification signal: '接続準備完了'.
]
on: Error, Notification
do:
[ :exception |
"エラーと通知両方の例外を1度に補足"
]
on: Exception
do:
[
"その他の例外を捕捉。on:do:はBlockClosureで定義している数だけ並べることができる。"
].
注釈
出典
関連項目
|