<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wikippe.e-do-match.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=180.144.19.71</id>
	<title>Wikippe - 利用者の投稿記録 [ja]</title>
	<link rel="self" type="application/atom+xml" href="https://wikippe.e-do-match.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=180.144.19.71"/>
	<link rel="alternate" type="text/html" href="https://wikippe.e-do-match.com/index.php/%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/180.144.19.71"/>
	<updated>2026-10-29T05:25:56Z</updated>
	<subtitle>利用者の投稿記録</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://wikippe.e-do-match.com/index.php?title=Icon&amp;diff=159919</id>
		<title>Icon</title>
		<link rel="alternate" type="text/html" href="https://wikippe.e-do-match.com/index.php?title=Icon&amp;diff=159919"/>
		<updated>2014-03-20T17:15:57Z</updated>

		<summary type="html">&lt;p&gt;180.144.19.71: /* ゴール指向評価 */ a &amp;amp;lt; b &amp;amp;lt; cの評価&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Otheruses|プログラミング言語|コンピュータのユーザインタフェース|アイコン}}&lt;br /&gt;
{{Infobox プログラミング言語&lt;br /&gt;
|名前 = Icon&lt;br /&gt;
|パラダイム = マルチパラダイム&lt;br /&gt;
|開発者 = Griswold&lt;br /&gt;
|型付け = 弱い[[動的型付け]]&lt;br /&gt;
|方言 = Unicon&lt;br /&gt;
|影響を受けた言語 = SNOBOL&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Icon&#039;&#039;&#039;は、[[アメリカ合衆国|米国]][[アリゾナ大学]]のグリスウォルド（{{lang|en|Griswold}}）により開発されたプログラミング言語である。&lt;br /&gt;
&lt;br /&gt;
Iconはテキスト処理を目的として作られ、Griswoldが以前に作成した[[SNOBOL]]の後継として作られたが、仕様はかなり異なる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Iconはプログラミング言語として広く普及しているとはいえないものの、そのユニークな機能の一部は、新世代のプログラミング言語の[[Python]]や[[Ruby]]に直接・間接に影響を与えている。--&amp;gt;&lt;br /&gt;
言語の特徴としては、&#039;&#039;&#039;ゴール指向評価&#039;&#039;&#039;（原語：{{lang-en-short|goal-directed evaluation}}）、呼び出しごとにデータを返す&#039;&#039;&#039;[[ジェネレータ (プログラミング)|ジェネレータ]]&#039;&#039;&#039;、手続きをそのものを変数に格納する「コ・エクスプレッション」（{{lang|en|co-expression}}）などがある。&lt;br /&gt;
&lt;br /&gt;
Iconの後継には[[Unicon]]がある。&lt;br /&gt;
&lt;br /&gt;
== 基本構造 ==&lt;br /&gt;
Iconの基本構造は以下のようになる。&lt;br /&gt;
 # コメント&lt;br /&gt;
 link ライブラリ&lt;br /&gt;
 &lt;br /&gt;
 procedure main(args)&lt;br /&gt;
 &lt;br /&gt;
    メインルーチン&lt;br /&gt;
 &lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 procedure 関数(引数)&lt;br /&gt;
 &lt;br /&gt;
   サブルーチン&lt;br /&gt;
   &lt;br /&gt;
   return サブルーチンの返り値（省略可）&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
メインルーチンはmain[[関数 (プログラミング)|関数]]に記述する。なおIconは一度中間形式に[[コンパイル]]するとき[[サブルーチン]]の形式をチェックしてから、再度コンパイルしなおして実行ファイルを生成するので、サブルーチンは宣言の必要がなく[[ソースコード]]のどの位置に書いても良い。&lt;br /&gt;
&lt;br /&gt;
代入式には[[糖衣構文]]がある。例えば、&lt;br /&gt;
 x := x + n&lt;br /&gt;
は、&lt;br /&gt;
 x +:= n&lt;br /&gt;
と、表記が可能である。&lt;br /&gt;
&lt;br /&gt;
ブロック構造は&amp;lt;code&amp;gt;{～}&amp;lt;/code&amp;gt;で範囲を指定する。&lt;br /&gt;
&lt;br /&gt;
=== データ構造 ===&lt;br /&gt;
Iconは[[線形リスト|リスト]]、テーブル型（[[連想配列]]）、[[集合 (プログラミング)|集合]]、レコード型（[[構造体]]）など、多数の[[データ構造]]を提供している。&lt;br /&gt;
例えばリストを得るには&lt;br /&gt;
 cat := [&amp;quot;muffins&amp;quot;, &amp;quot;tabby&amp;quot;, 2002, 8]&lt;br /&gt;
などとすればよい。&lt;br /&gt;
&lt;br /&gt;
ただし上記にないデータ構造も、[[配列]]、[[スタック]]、[[キュー (コンピュータ)|キュー]]はリストとの区別が無いだけであり、[[文字列]] は文字型の配列として扱うので、これらのデータ構造の機能をもっていないというわけではない。&lt;br /&gt;
&lt;br /&gt;
またIconの変数は基本的にデータの型を宣言する必要が無いが、データ型が存在しないというわけではなく、[[型推論]]が行われているだけである。このため、上記のデータ構造を利用する場合は使用前に宣言を行う必要がある。この宣言は代入文の形で行われる、例えば連想配列の場合&lt;br /&gt;
 t := table()&lt;br /&gt;
 t[&amp;quot;abc&amp;quot;] := 1&lt;br /&gt;
となる。これは連想配列&amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;を使用する前に&amp;lt;code&amp;gt;t := table()&amp;lt;code&amp;gt;によって&amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;が連想配列であることを明記している。&lt;br /&gt;
&lt;br /&gt;
=== ジェネレータとevery文 ===&lt;br /&gt;
[[ジェネレータ (プログラミング)|ジェネレータ]]とは呼び出しごとに値を返す機構である。一見[[関数 (プログラミング)|関数]]と同じに見えるが、返す値が複数であることが大きく違う。&lt;br /&gt;
&lt;br /&gt;
例えば&lt;br /&gt;
 if x = ((1 to 5) | y) then &lt;br /&gt;
   write(&amp;quot;True&amp;quot;)&lt;br /&gt;
 else&lt;br /&gt;
   write(&amp;quot;False&amp;quot;)&lt;br /&gt;
というプログラムがあったときこれは&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;が&amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;から&amp;lt;tt&amp;gt;5&amp;lt;/tt&amp;gt;または&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;と等しいなら「&amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt;」そうでなければ「&amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt;」を表示するプログラムである。&lt;br /&gt;
&lt;br /&gt;
このジェネレータの値を逐次処理するためのIconの基本ループとしてevery文が存在する。このevery文は例えば&lt;br /&gt;
 every i := 1 to 5 do &lt;br /&gt;
   write(i)&lt;br /&gt;
と表記すると1～5までの数字を画面に印字する。このevery の後に来る文はジェネレータであればなんでもよいので上の文は&lt;br /&gt;
 every write(1 to 5) &lt;br /&gt;
と記述しても良い。&lt;br /&gt;
&lt;br /&gt;
なお、ジェネレータは自分で作成することも可能である、単純に返り値を&amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt;ではなく&amp;lt;code&amp;gt;suspend&amp;lt;/code&amp;gt;にすることで実装される。例として[[奇数]]を出力し続けるジェネレータは以下のようになる、&lt;br /&gt;
 procedure odd()&lt;br /&gt;
    x := 1&lt;br /&gt;
    repeat {&lt;br /&gt;
       suspend x&lt;br /&gt;
       x +:= 2&lt;br /&gt;
    }&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
イメージとしては&amp;lt;code&amp;gt;suspend&amp;lt;/code&amp;gt;は値を返した後、サブルーチンを中断せずに次の処理に移るものである。これを&lt;br /&gt;
 every i := odd() do&lt;br /&gt;
    write(i)&lt;br /&gt;
と実行した場合、永久に奇数を表示し続ける。&lt;br /&gt;
&lt;br /&gt;
== ゴール指向評価 ==&lt;br /&gt;
Iconの中心的な特徴の1つは[[制御構造]]を[[真理値]]によるものから、&#039;&#039;&#039;成功&#039;&#039;&#039;か&#039;&#039;&#039;失敗&#039;&#039;&#039;によるものへと変更したことである。このモデルでは、&lt;br /&gt;
:&amp;lt;code&amp;gt;if a &amp;amp;lt; b&amp;lt;/code&amp;gt;&lt;br /&gt;
のような単純な比較は多くの言語のように&lt;br /&gt;
:「もし式全体が真と評価されるならば」&lt;br /&gt;
という意味ではなく、&lt;br /&gt;
:「もし処理全体が成功ならば」&lt;br /&gt;
というような意味である。この場合は比較が成り立つなら、&amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt;演算子は成功する。よってIconとその他の言語で実行結果は同じとなる。この方式がより興味深いのは、&lt;br /&gt;
:&amp;lt;code&amp;gt;if a &amp;amp;lt; b &amp;amp;lt; c&amp;lt;/code&amp;gt;&lt;br /&gt;
のような場合である。&amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt;演算子は、比較が成り立つときは成功であると同時に、二番目の引数を値として返す。したがって、&amp;lt;code&amp;gt;a &amp;amp;lt; b&amp;lt;/code&amp;gt;の部分を評価して成功すれば、値として&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;を返すので、つづいて&amp;lt;code&amp;gt;b &amp;amp;lt; c&amp;lt;/code&amp;gt;を評価することになる。当然、評価の時に一度でも失敗すれば、全体として失敗である。&lt;br /&gt;
このような比較は、ほとんどの言語ではこのまま記述することができないが、Iconでは可能である。&lt;br /&gt;
&lt;br /&gt;
この方式の有用性がより明確になるのは、現実の例で考えたときである。Iconでは&lt;br /&gt;
 if a := read() then write(a)&lt;br /&gt;
は標準入力から標準出力へと1行をコピーする。この例はファイルが存在しないなどの理由で&amp;lt;code&amp;gt;read()&amp;lt;/code&amp;gt;がエラーを発生したときでも正しく動作する。その場合は、&amp;lt;code&amp;gt;a := read()&amp;lt;/code&amp;gt;が失敗し、&amp;lt;code&amp;gt;write(a)&amp;lt;/code&amp;gt;は呼ばれない、という単純な動作である。&lt;br /&gt;
&lt;br /&gt;
成功と失敗は[[例外処理]]のように関数を遡る、つまりネストした関数呼び出しの中で失敗が起こると呼び出し側の関数も失敗する。例として、入力ファイルの内容すべてを出力するプログラムは&lt;br /&gt;
 while write(read())&lt;br /&gt;
と書ける。&amp;lt;code&amp;gt;read()&amp;lt;/code&amp;gt;が、例えばファイルの終わりに達して。失敗すると、呼び出しを遡って&amp;lt;code&amp;gt;write()&amp;lt;/code&amp;gt;も同様に失敗する。よってファイルの内容すべてを出力して停止する。比較のためにJava風の[[擬似コード]]を考える。&lt;br /&gt;
 try {while ((a = read()) != EOF) write (a) ;}&lt;br /&gt;
 catch (Exception e) {/* 何もしない */}&lt;br /&gt;
この場合、2つの比較が必要とされる。1つはファイルの終端（&amp;lt;code&amp;gt;EOF&amp;lt;/code&amp;gt;）であり、もう1つはその他のすべてのエラー（&amp;lt;code&amp;gt;Exception&amp;lt;/code&amp;gt;）である。&lt;br /&gt;
&lt;br /&gt;
「何らかのゴールに達するまで評価が続けられる」という意味で、Iconではこのような方式を&#039;&#039;&#039;ゴール指向評価&#039;&#039;&#039;という。上の例でのゴールはファイル全体を読み出すことであり、まだ読むべき情報が有るあいだは&amp;lt;code&amp;gt;read()&amp;lt;/code&amp;gt;は成功し続け、無くなったら失敗する。従って、戻り値を調べる文や余分な構文は必要なく、ゴールが言語によって直に記述される。&lt;br /&gt;
&lt;br /&gt;
== 関連項目 ==&lt;br /&gt;
*[[SNOBOL]]&lt;br /&gt;
&lt;br /&gt;
== 外部リンク ==&lt;br /&gt;
* [http://www.cs.arizona.edu/icon/ The Icon Programming Language]&lt;br /&gt;
* {{dmoz|Computers/Programming/Languages/Icon/|Icon}}&lt;br /&gt;
&lt;br /&gt;
[[Category:プログラミング言語|ICON]]&lt;/div&gt;</summary>
		<author><name>180.144.19.71</name></author>
	</entry>
</feed>