削除された内容 追加された内容
U-ichi (会話 | 投稿記録)
m 体裁を変更
m マークアップ
1行目:
'''Icon'''は、[[アメリカ合衆国|米国]][[アリゾナ大学]]のGriswoldにより開発されたプログラミング言語である。
 
Iconはテキスト処理を目的として作られ、Griswoldが以前に作成した[[SNOBOL]]の後継として作られたが、仕様はかなり異なる。
7行目:
 
== 基本構造 ==
Icon の基本構造は以下のようになる。
# コメント
link ライブラリ
23行目:
end
 
メインルーチンは[[C言語]]と同様にmain[[関数_ (プログラミング) | 関数]] main に記述する。なお Icon は一度中間形式に[[コンパイル]]するとき[[サブルーチン]]の形式をチェックしてから、再度コンパイルしなおして実行ファイルを生成するので、サブルーチンは宣言の必要がなく[[ソースファイル]]のどの位置に書いても良い。言語の構造はちょうど[[C言語]]と[[Pascal]]の中間のような構造になっている。例えば代入式は
x := x + n
でPascalと同じ代入演算子 "<code>:=" </code>を用いるがこの式は Icon では
x +:= n
と、まるでC言語のような省略形式での表記が可能である。他にも関数は Pascal [[Ada ]] のように<code>procedure~end</code>でくくるが、while文やif文などのブロック構造はC言語のように<code>{~}</code>で範囲を指定するなどである。
 
=== データ構造 ===
Icon は後継元である SNOBOL とは違い、多数の[[データ構造]]を持つ。主なデータ構造としては[[関数型プログラミング言語]]の[[線形リスト|リスト]]、SNOBOL からテーブル型([[連想配列]])、Pascal [[集合_ (プログラミング)|集合]]、レコード型([[構造体]])など、あらゆる言語のデータ構造のアイデアを実装している。
 
ただし上記にないデータ構造も、[[Python]] [[Ruby]] と同様に[[配列]]、[[スタック]]、[[キュー]]はリストとの区別が無いだけであり、[[文字列]] はC言語同様、文字型の配列として扱うので、これらのデータ構造の機能をもっていないというわけではない。
 
また Icon の変数は基本的にデータの型を宣言する必要が無いが、これは [[AWK]] のようにデータ型が存在しないというわけではなく、[[プログラミング言語ML|ML]]のような[[型推論]]が行われているだけである。このため、上記のデータ構造を利用する場合は使用前に宣言を行う必要がある。この宣言は代入文の形で行われる、例えば連想配列の場合
t := table()
t["abc"] := 1
となるこれは連想配列 <code>t </code>を使用する前に "<code>t := table()" <code>によって <code>t </code>が連想配列であることを明記している。
 
=== ジェネレータとevery文 ===
ジェネレータとは呼び出しごとに値を返す機構である。一見[[関数_ (プログラミング) | 関数]]と同じに見えるが、返す値が複数であることが大きく違う。
 
例えば
47行目:
else
write("False")
というプログラムがあったときこれは <code>x </code> <tt>1</tt>から <tt>5</tt>または <code>y </code>と等しいなら"<code>True"</code>そうでなければ"<code>False"</code>を返すプログラムである。
 
このジェネレータの値を逐次処理するための Icon の基本ループとしてevery文が存在する。このevery文は例えば
every i := 1 to 5 do
write(i)
56行目:
と記述しても良い。
 
なお、ジェネレータは自分で作成することも可能である、単純に返り値を<code>return</code>ではなく<code>suspend</code>にすることで実装される。例として[[奇数]]を出力し続けるジェネレータは以下のようになる、
procedure odd()
x := 1
65行目:
end
 
イメージ的にとして<code>suspend</code>は値を返した後、サブルーチンを中断せずに次の処理に移るものである。これを
every i := odd() do
write(i)