| パラダイム | マルチパラダイム:構造化、テキスト指向 |
|---|---|
| 家族 | スノボル |
| デザイン: | ラルフ・グリスウォルド |
| 初登場 | 1977年 |
| 安定版リリース | 9.5.24a / 2024年1月17日[1] |
| タイピングの規律 | 動的 |
| Webサイト | www.cs.arizona.edu/アイコン |
| 主な実装 | |
| アイコン、Jcon | |
| 方言 | |
| ユニコン | |
| 影響を受けた | |
| スノボル、SL5、アルゴル | |
| 影響を受けた | |
| ユニコン、Python、Goaldi、[2] jq | |
Icon は、コードが有効な値とともに「成功」を返すか、有効なデータが返されないことを示す「失敗」を返す「目標指向実行」の概念に基づく非常に高水準のプログラミング言語です。特定のコード ブロックの成功と失敗は、その後の処理を指示するために使用されますが、従来の言語では、同じ目的を達成するためにプログラマが記述したブール ロジックを使用するのが一般的です。基本的な制御構造のロジックは Icon では暗黙的であることが多いため、一般的なタスクは明示的なコードが少なくても完了できます。
Icon は、 SNOBOL言語の主要な貢献者であったベル研究所を去ったラルフ・グリスウォルドによって設計されました。SNOBOL は、1970 年代初期の基準では時代遅れと見なされる構文を持つ文字列処理言語でした。アリゾナ大学に移った後、彼は SL5 で基礎となる SNOBOL の概念をさらに発展させましたが、その結果は失敗だと考えました。これにより、大幅に更新された Icon が生まれ、SNOBOL のような言語の短いが概念的に密度の高いコードと、CやPascalなどのALGOLに触発された言語のより馴染みのある構文が融合されました。
Icon のインスピレーションとなった言語と同様に、Icon の主な使用分野は文字列とテキスト パターンの管理です。文字列操作は、たとえば「world」内の「the」の検索など、失敗することがよくあります。ほとんどの言語では、無効な結果の使用を避けるためにテストと分岐が必要です。Icon では、このようなテストのほとんどが不要であるため、記述する必要があるコードの量が少なくなります。複雑なパターン処理は、Perlなどの専用言語に似た数行の簡潔なコードで実行できますが、他の ALGOL のような言語のユーザーには馴染みのある、より関数指向の構文が保持されています。
Icon はオブジェクト指向ではありませんが、1996 年に Idol というオブジェクト指向の拡張機能が開発され、これが最終的にUniconとなりました。Icon は他の言語にも影響を与え、特にそのシンプルなジェネレータは大きな影響力を持っていました。Icon のジェネレータはPython言語に大きな影響を与えました。[3]
歴史
スノボル
SNOBOL の元々の取り組みは、遡って SNOBOL1 と呼ばれ、1962 年秋にベル研究所プログラミング研究部で開始されました。[4]この取り組みは、多項式の操作、記号積分、マルコフ連鎖の研究に SCL 言語を使用しようとした際のフラストレーションに対する反応でした。学部長のチェスター・リーによって書かれた SCL は、遅く、低レベルの構文であったため、単純なプロジェクトでも大量のコードが必要でした。COMIT 言語を簡単に検討した後、6 人の部のメンバーであるイヴァン・ポロンスキー、ラルフ・グリスウォルド、デビッド・ファーバーは、これらの問題を解決するために独自の言語を書くことにしました。[5]
最初のバージョンは1963年初頭にIBM 7090で実行され、夏までに構築され、ベル全体で使用されていました。これはすぐにSNOBOL2につながり、多数の組み込み関数と外部アセンブリ言語コードへのリンク機能が追加されました。1964年4月にリリースされ、主にベル内で使用されましたが、プロジェクトMACでも一部使用されました。システム関数の導入は主にユーザー関数の必要性を示すものであり、1964年7月にリリースされたSNOBOL3の主要な機能でした。[6]
SNOBOL3 の導入は、ベル研究所の計算部門における大きな変化と一致しており、これにはGE 645メインフレームの導入も含まれ、SNOBOL の書き直しが必要となった。代わりにチームは、仮想マシン上で動作する新しいバージョンを書くことを提案した。このバージョンは SNOBOL Intermediate Language (SIL) と名付けられ、十分に強力なプラットフォームに簡単に移植できるようにした。この提案は 1965 年 9 月に SNOBOL4 として承認された。この頃、1966 年 8 月には大幅に改良されたバージョンの言語の計画が浮上した。 [7]言語のさらなる作業は 1960 年代を通じて続けられ、特に後のバージョンでは連想配列型が追加され、彼らはこれをテーブルと呼んだ。
SL5はアイコンにつながる
グリスウォルドは1971年8月にベル研究所を離れ、アリゾナ大学の教授となった。[8]彼は当時、研究ツールとしてSNOBOL4を導入した。[9]彼はSNOBOLのサポートと進化を継続するために国立科学財団から助成金を受けた。[10]
SNOBOLは1960年代初頭に開発された言語であるため、その構文はFORTRANやCOBOLなどの初期のプログラミング言語の特徴を帯びている。特に、これらの言語の多くはパンチカードで入力され、列レイアウトが自然であったため、この言語は列に依存している。さらに、制御構造は、 ALGOL 60の導入後に必須の機能になりつつあったブロックの使用ではなく、コードの周りの分岐にほぼ完全に基づいていた。彼がアリゾナに移った頃には、SNOBOL4の構文は絶望的に時代遅れになっていた。[11]
グリスウォルドは、SNOBOL の基盤となる成功/失敗の概念を、if/then のような従来のフロー制御構造で実装する取り組みを開始しました。これが SL5 (SNOBOL Language 5) になりましたが、結果は満足のいくものではありませんでした。[11] 1977 年に、彼は言語に戻って新しいバージョンを検討しました。彼は、SL5 で導入された非常に強力な関数システムを放棄し、より単純な停止/再開の概念を採用し、次の原則に基づいて SNOBOL4 の自然な後継となる新しい概念を開発しました。[11]
- SNOBOL4の哲学的および意味的基礎
- SL5の統語的基礎
- 一般化された手順メカニズムを除くSL5の機能
新しい言語は当初 SNOBOL5 と呼ばれていましたが、基本的な概念以外は SNOBOL とは大きく異なっていたため、最終的に新しい名前が求められました。「C」へのオマージュとして「s」を検討しましたが、その名前を使用した文書の組版に問題があったため、最終的には放棄されました。一連の新しい名前が提案され、放棄されました。Irving、bard、および「The Language」の「TL」です。この頃、Xerox PARC はグラフィカル ユーザー インターフェイスに関する作業について発表を開始し、「icon」という用語がコンピューター用語集に登場し始めました。名前を最初は「icon」に変更し、最終的に「Icon」を選択するという決定が下されました。[11] [a]
言語
基本的な構文
Icon言語は、構造化プログラミング言語のALGOLクラスから派生したもので、CやPascalに似た構文を持っています。Iconは、代入構文、キーワード、類似の構文を使用する点で、Pascalに最も似ています。一方、Iconは実行グループを構造化するためにCスタイルの中括弧を使用し、プログラムはと呼ばれる手続きを実行することから始まります。[13]:=proceduremain
Icon は多くの点で、ほとんどのスクリプト言語(およびIcon の元となったSNOBOLと SL5) と機能を共有しています。変数を宣言する必要がなく、型は自動的にキャストされ、数値は文字列に自動的に変換され、その逆も自動的に行われます。[14]多くのスクリプト言語に共通する (ただしすべてではない) もう 1 つの機能は、行末文字がないことです。Icon では、セミコロンで終わらない行は、意味がある場合は暗黙のセミコロンで終わります。[15]
プロシージャはIconプログラムの基本的な構成要素です。Pascalの命名法を使用していますが、C関数のように動作し、値を返すことができます。Iconにはキーワードはありませんfunction。[16]
目標指向実行
SNOBOL の重要な概念の 1 つは、その関数がマジックナンバーやその他のテクニックを使用するのではなく、言語のプリミティブとして「成功」または「失敗」を返すことでした。[17] [18]たとえば、別の文字列内の部分文字列の位置を返す関数は、ほとんどの言語ランタイムシステムで見られる一般的なルーチンです。JavaScriptでは、「Hello, World!」プログラム内で単語「World」の位置を見つけたい場合があります。これは で実行され、7 を返します。代わりに を要求すると、検索語が文字列に表示されないため、コードは「失敗」します。JavaScript では、ほとんどの言語と同様に、マジックナンバー (この場合は -1) を返すことでこれが示されます。[19]position = "Hello, World".indexOf("World")position = "Hello, World".indexOf("Goodbye")
SNOBOLでは、このような失敗は特別な値を返しますfail。SNOBOLの構文は、操作の成功または失敗に基づいて直接動作し、別のテストを記述することなく、コードのラベル付きセクションにジャンプします。たとえば、次のコードは「Hello, world!」を5回出力します。[20]
* Hello World を出力する SNOBOL プログラム
I = 1
LOOP OUTPUT = "Hello, world!"
I = I + 1
LE ( I , 5 ) : S ( LOOP )
END
LEループを実行するために、インデックス変数Iに対して小なり演算子が呼び出され、それがS成功すると、つまりIが5未満であれば、名前付きラベルに分岐しLOOPて続行されます。[20]
GOTOIcon は成功または失敗に基づくフロー制御の概念を保持しながら、言語をさらに発展させました。1 つの変更点は、ラベル付きのような分岐を、1960 年代後半にコンピュータ業界を席巻していた構造化プログラミングスタイルに合わせてブロック指向構造に置き換えたことです。 [11] 2 つ目は、呼び出しチェーンに沿って「失敗」を渡すことができるようにし、ブロック全体が全体として成功または失敗するようにしたことです。これは Icon 言語の重要な概念です。従来の言語では、ブール論理に基づいて成功または失敗をテストし、その結果に基づいて分岐するコードを含める必要がありましたが、このようなテストと分岐は Icon コードに固有のものであり、明示的に記述する必要はありません。[21]
たとえば、Java プログラミング言語で書かれた次のコードについて考えてみましょう。関数を呼び出してread()(以前に開いた) ファイルから文字を読み取り、その結果を変数 に割り当てa、writeの値をa別のファイルに s します。その結果、あるファイルが別のファイルにコピーされます。readは、最終的にはファイルから読み取る文字がなくなる可能性があり、最初の呼び出しでそうなる可能性もあります。その場合、a不確定な状態になり、null ポインタ例外 がwrite発生する可能性があります。これを回避するには、この状況で は特殊な値 (end-of-file) を返します。そのためには、を
回避するための明示的なテストが必要です。readEOFwrite
while (( a = read ()) != EOF ) { write ( a ); }
対照的に、Iconでは、read()関数はテキスト行またはを返します&fail。は、&fail単に の類似物ではありません。これはEOF、コンテキストに応じて言語によって「処理を停止する」または「失敗ケースを実行する」という意味として明示的に理解されるためです。Iconでの同等のコードは次のとおりです。[18]
これは、「read が失敗しない限り write を呼び出し、そうでなければ停止する」という意味です。[18] Java の例のようにマジックナンバーに対するテストを指定する必要はありません。これは暗黙的であり、結果として得られるコードは簡素化されます。成功と失敗は呼び出しチェーンを通じて渡されるため、関数呼び出しを他の関数呼び出しに埋め込むことができ、ネストされた関数呼び出しが失敗したときに停止します。たとえば、上記のコードは次のように短縮できます。[22]
このバージョンでは、read呼び出しが失敗すると、write呼び出しは失敗し、 はwhile停止します。[22] Icon の分岐およびループ構造はすべて、プログラマーが提供する任意のブールテストではなく、その内部のコードが成功または失敗することに基づいています。は、その「テスト」が値を返すとブロックをif実行し、を返すとブロックを実行するか、次の行に移動します。同様に、は失敗を受け取るまでブロックを呼び出し続けます。Icon はこの概念を目標指向実行と呼んでいます。[23]thenelse&failwhile
成功と失敗の概念を例外の概念と対比させることが重要です。例外は異常な状況であり、予期される結果ではありません。Icon での失敗は予期される結果です。ファイルの末尾に到達することは予期される状況であり、例外ではありません。Icon には従来の意味での例外処理はありませんが、例外のような状況では fail がよく使用されます。たとえば、読み取られるファイルが存在しない場合は、read特別な状況が示されることなく fail になります。[18]従来の言語では、これらの「その他の条件」を自然に示す方法はありません。追加のマジックナンバーが使用される場合もありますが、より一般的には、例外処理は値を「スロー」するために使用されます。たとえば、Java コードで見つからないファイルを処理するには、次のように記述します。
try { while (( a = read ()) != EOF ) { write ( a ); } } catch ( Exception e ) { // 何か他の問題が発生しました。この catch を使用してループを終了します}
この場合、2 つの比較が必要です。1 つは EOF 用、もう 1 つはその他のすべてのエラー用です。Java では例外をロジック要素として比較できないため、Icon の場合のように長いtry/catch構文を代わりに使用する必要があります。また、Try ブロックは、例外がスローされない場合でもパフォーマンスの低下を招きますが、これは Icon では通常回避される
分散コストです。
Icon は、微妙な違いはあるものの、この同じ目標指向メカニズムを使用して従来のブール テストを実行します。 のような単純な比較は、ほとんどの言語のように「条件式の評価の結果が true 値になるか、または が true 値を返す場合」を意味するのではなく、「条件式 (ここでは 演算子 )が成功し、失敗しない場合」のような意味になります。この場合、比較が true の場合、演算子は成功します。は、式が成功した場合は 節を呼び出し、失敗した場合は または次の行を呼び出します。結果は、他の言語で見られる従来の if/then に似ており、はが より小さい場合にを実行します。微妙な点は、同じ比較式をどこにでも配置できることです。たとえば、次のようになります。
if a < b then write("a is smaller than b")<<ifthenelseifthenab
<もう 1 つの違いは、演算子は成功した場合は 2 番目の引数を返すことです。この例では、bが より大きい場合は の値が書き込まれ、それ以外の場合は何も書き込まれません。これは自体がaテストではなく、値を返す演算子であるため、それらを連結してなどを使用できるようになります。 [22]は、ほとんどの言語で のような 2 つの不等式の結合として記述する必要がある一般的な比較の種類です。
if a < b < cif (a < b) && (b < c)
目標指向実行の重要な側面は、手順が失敗した場合にプログラムを以前の状態に巻き戻す必要がある場合があることです。このタスクは、バックトラッキングと呼ばれます。たとえば、変数を開始位置に設定し、値を変更する可能性のある操作を実行するコードについて考えてみましょう。これは、たとえば、カーソルを文字列内でスキャンしながら進める文字列スキャン操作では一般的です。手順が失敗した場合、その変数のその後の読み取りでは、内部で操作されていた状態ではなく、元の状態が返されることが重要です。このタスクのために、Icon には可逆代入演算子<-と可逆交換 があります。<->たとえば、大きな文字列内でパターン文字列を見つけようとしているコードを考えてみましょう。
このコードは、i検索の開始位置である 10 に移動することから始まります。ただし、 がfind失敗すると、ブロック全体が失敗し、望ましくない副作用iとして の値が 10 のままになります。を に置き換えると、ブロックが失敗した場合に が以前の値にリセットされることを示します。これにより、実行における
アトミック性の類似性が提供されます。i := 10i <- 10i
発電機
Icon の式は単一の値を返すことがあります。たとえば、5 > xx の値が 5 未満の場合は x を評価して返し、そうでない場合は失敗します。ただし、Icon には、成功または失敗をすぐに返さず、呼び出されるたびに新しい値を返すプロシージャの概念も含まれています。これらはジェネレーターと呼ばれ、Icon 言語の重要な部分です。Icon の用語では、式または関数を評価すると、結果シーケンスが生成されます。結果シーケンスには、式または関数によって生成できるすべての値が含まれます。結果シーケンスがなくなると、式または関数は失敗します。
Icon を使用すると、任意のプロシージャで、 、failキーワードを使用して制御される単一の値または複数の値を返すことができます。これらのキーワードのいずれかがないプロシージャは を返します。これは、プロシージャの実行が まで進むたびに発生します。例:
returnsuspend&failend
を呼び出すとf(5)1が返されますが、 を呼び出すとf(-1)が返されます&fail。これにより、明らかでない動作が発生する可能性があります。たとえば、は失敗し、 の操作を中断するwrite(f(-1))ため、何も出力されません。[24]fwrite
プロシージャをジェネレータに変換するには、キーワードを使用します。これは、「この値を返し、再度呼び出されたときに、この時点で実行を開始する」ことを意味します。この点では、 Cとの概念suspendの組み合わせのようなものです。たとえば、次のようになります。[18]staticreturn
iは、 a で始まり a で終わる一連の数値を返しj、その後&failを返すジェネレータを作成します。[b]はsuspend i実行を停止し、状態をリセットせずに の値を返しますi。同じ関数が再度呼び出されると、その時点から以前の値を使用して実行が再開されます。この場合、 によって が実行されi +:= 1、while ブロックの先頭に戻ってループし、次の値を返して再び中断します。これが がi <= j失敗するまで続き、失敗するとブロックを終了して を呼び出します。これにより、反復子を簡単に構築failできます。 [18]
ジェネレータービルダーのもう 1 つのタイプはオルタネーターです。これはブールor演算子のように見え、動作します。たとえば、
次のようになります。
これは「y が x または 5 より小さい場合...」と言っているように見えますが、実際にはリストの末尾から外れるまで値を返すジェネレーターの短縮形です。リストの値は、この場合は という操作に「注入」されます。<したがって、この例では、システムは最初に y < x をテストし、x が実際に y より大きい場合は x の値を返し、テストは成功し、y の値が節に書き出されますthen。ただし、x が y より大きくない場合は失敗し、オルタネーターは y < 5 を実行して続行します。そのテストが成功すると、 が書き込まれます。y が x または 5 より小さい場合、オルタネーターはテストを終了して失敗し、 はif失敗し、 はwrite実行されません。したがって、y の値が x または 5 より小さい場合はコンソールに表示され、ブール の目的が達成されますor。関数は、パラメータの評価が成功しない限り呼び出されないため、この例は次のように短縮できます。
内部的には、オルタネータは単なる ではなくor、任意の値のリストを作成するためにも使用できます。これは、次のように任意の値を反復処理するために使用できます。
整数のリストは多くのプログラミング コンテキストでよく見られるため、Icon にはアドホックto整数ジェネレータを構築するためのキーワードも含まれています。
これは短縮することができます:
アイコンは厳密に型指定されていないため、オルタネーター リストにはさまざまな種類の項目を含めることができます。
これは、x の値に応じて 1、"hello"、およびおそらく 5 を書き込みます。
同様に、結合演算子、&はブール演算子と同様の方法で使用されるand。[25]
このコードは、ItoJxに代入される初期値0を呼び出し、返します。次に、論理積の右側を実行し、x % 20に等しいので、値を書き出します。次に、ItoJジェネレータを再度呼び出してxに1を代入しますが、右側は失敗し、何も出力されません。結果は、0から10までのすべての偶数のリストです。[25]
ジェネレータの概念は、文字列操作で使用すると特に便利で強力であり、Icon の全体的な設計の大きな基礎となっています。indexOf多くの言語で使用されている操作を考えてみましょう。この関数は、ある文字列を別の文字列内から検索し、その位置のインデックスを返します。見つからない場合はマジックナンバーを返します。たとえば、次のようになります。
s = "全世界は舞台である。そして男も女もみな役者に過ぎない" ; i = indexOf ( "the" , s ); write ( i );
これは文字列をスキャンしs、最初に出現する「the」を見つけて、そのインデックス(この場合は 4)を返します。ただし、文字列には文字列「the」のインスタンスが 2 つ含まれているため、2 番目の例を返すには、別の構文が使用されます。
j = indexOf ( "the " , s , i + 1 ); write ( j );
これは、位置 5 からスキャンを開始するように指示するため、前に見つけた最初のインスタンスとは一致しません。ただし、「the」の 2 番目のインスタンスがない可能性があり、最初のインスタンスもない可能性があります。そのため、からの戻り値は、indexOf一致がないことを示すために使用されるマジック ナンバー -1 に対してチェックする必要があります。すべてのインスタンスの位置を出力する完全なルーチンは次のとおりです。
s = "全世界は舞台である。そして男も女もみな役者に過ぎない" ; i = indexOf ( "the" , s ); while i != - 1 { write ( i ); i = indexOf ( "the" , s , i + 1 ); }
Icon では、同等のものfindはジェネレーターなので、同じ結果を 1 行で作成できます。
もちろん、入力のある時点の後の文字列を見つけたい場合もあります。たとえば、最初の 4 列に行番号、スペース、そしてテキスト行が含まれているテキスト ファイルをスキャンする場合などです。ゴール指向実行を使用すると、行番号をスキップできます。
位置は、「the」が位置 5 以降に出現する場合にのみ返されます。それ以外の場合、比較は失敗し、失敗が書き込みに渡され、書き込みは行われません。
演算子everyは に似ておりwhile、ジェネレータによって返されたすべての項目をループし、失敗した場合は終了します。[24]
everyと の間には重要な違いがありますwhile。 はwhile最初の結果を失敗するまで再評価しますが、 はeveryジェネレータから次の値を取得します。は実際にはSmalltalkeveryのブロックと同様の方法で関数に値を注入します。たとえば、上記のループは次のように書き直すことができます。[24]
この場合、iからjまでの値が注入されsomeFunction、(潜在的に)複数行の出力が書き込まれる。[24]
コレクション
Icon には、スタックやキューとしても使用できるリスト、テーブル(他の言語ではマップまたは辞書とも呼ばれます)、セットなど、いくつかのコレクション タイプが含まれています。Icon ではこれらを構造と呼びます。コレクションは固有のジェネレーターであり、bang 構文を使用して簡単に呼び出すことができます。たとえば、 次のようになります。
前の例で見たように、失敗の伝播を使用して、テストとループを組み合わせることができます。
リスト コレクションはジェネレーターなので、bang 構文を使用してさらに簡略化できます。
この場合、 の bang により、writeIcon は配列から 1 行ずつテキストを返し、最後に失敗します。は、標準入力から 1 行を読み込む&inputのジェネレーターベースの類似物であり、ファイルが終了するまで行の読み取りを続けます。
read!&input
Icon は型がないので、リストにはさまざまな型の値を含めることができます。
項目には他の構造を含めることができます。より大きなリストを作成するために、Icon にはlistジェネレーターが含まれていますi := list(10, "word")。これは、「word」のコピーを 10 個含むリストを生成します。他の言語の配列と同様に、Icon では項目を位置で検索できます (例)。weight := aCat[4]配列のスライスが含まれているため、他のリストの要素から新しいリストを作成できます。たとえば、aCat := Cats[2:4]は「tabby」と 2002 を含む aCat という新しいリストを生成します。
テーブルは本質的には整数ではなく任意のインデックス キーを持つリストです。
このコードは、不明なキーのデフォルト値として 0 を使用するテーブルを作成します。次に、キーが "there" と "here"、値が 1 と 2 である 2 つの項目をテーブルに追加します。
セットもリストに似ていますが、特定の値のメンバーは 1 つだけ含まれています。Icon には、++2 つのセットの和集合、**積集合、差集合を生成する が含まれています。Icon には、さまざまな文字を含むセットである、定義済みの「Cset」が多数含まれています。Icon には、、、、の--4 つの標準 Cset があります。新しい Cset は、たとえば のように、文字列を一重引用符で囲むことで作成できます。
&ucase&lcase&letters&digitsvowel := 'aeiou'
文字列
Icon では、文字列は文字のリストです。リストとしてはジェネレーターなので、bang 構文を使用して反復処理できます。
文字列の各文字を別々の行に出力します。
括弧内の範囲指定を使用して、文字列から部分文字列を抽出できます。範囲指定では、1 つの文字または文字列の一部へのポイントを返すことができます。文字列は、右または左からインデックス付けできます。文字列内の位置は、文字1 A 2 B 3 C 4の間で定義され、右から−3 A −2 B −1 C 0で指定できます。
例えば、
最後の例では、終了位置の代わりに長さを使用しています
添え字指定は、式内の 左辺値として使用できます。これを使用して、文字列を別の文字列に挿入したり、文字列の一部を削除したりできます。例:
文字列スキャン
文字列の処理をさらに簡素化するために、 で呼び出されるスキャン?システムがあり、文字列に対して関数を呼び出します。
Icon は、 の左側をsubject?として参照し、それを文字列関数に渡します。 は、検索テキストをパラメータ 1 として、検索する文字列をパラメータ 2 として、2 番目のパラメータとして受け取ることを思い出してください。2番目のパラメータの使用は暗黙的であり、プログラマが指定する必要はありません。複数の関数が 1 つの文字列に対して順番に呼び出される一般的なケースでは、このスタイルによって結果のコード長が大幅に短縮され、明確さが向上します。Icon 関数シグネチャは定義内で subject パラメータを識別するため、この方法で
パラメータをホイストできます。find?
は?単なる構文糖の形式ではなく、後続の文字列操作のための「文字列スキャン環境」も設定します。これは 2 つの内部変数に基づいています。&subject;&posは&subject元の文字列へのポインターにすぎず、&posはその文字列内の現在の位置、つまりカーソルです。Icon のさまざまな文字列操作手順では、これら 2 つの変数を使用するため、プログラマが明示的に指定する必要はありません。たとえば、次のようになります。
次のように生成されます。
subject=[これは文字列です]、pos=[1]
組み込み関数とユーザー定義関数を使用して、スキャン対象の文字列内を移動できます。組み込み関数はすべて、デフォルトで になり&subject、&posスキャン構文を使用できるようになります。次のコードは、空白で区切られたすべての「単語」を文字列に書き込みます。
この例では、いくつかの新しい関数が導入されています。 はposの現在の値を返します。 この関数が必要で、 の値を直接使用しない理由は&posすぐにはわからないかもしれません。は変数であるため、 の値を取ることができませんが、 プロシージャでは可能です。 したがって、の軽量ラッパーが提供され、に対するブール テストを手書きで作成しなくても、Icon の目標指向フロー制御を簡単に使用できます。 この場合、テストは「is &pos zero」であり、これは Icon の文字列位置の奇数番号では行末です。 がゼロでない場合、 はを返します。これは で反転され、ループが続行されます。
&pos&pos&failpospos&pos&pospos&failnot
manyは、現在の から始まる、指定された Cset パラメータの例を 1 つ以上検索します&pos。この場合、スペース文字を探しているため、この関数の結果は の後の最初のスペース以外の文字の位置になります&pos。は、たとえばが文字列の末尾から外れた場合に、再び の可能性を伴ってその位置にtab移動します。 は、基本的に の逆です。つまり、指定された Cset の直前の位置を返し、次に例では を別の でその位置に設定します。交替は、行末で停止する場合にも使用されます。
&pos&failmanyuptomany&postab
この例は、より適切な「単語区切り」Cset を使用することで、より堅牢にすることができます。この Cset には、ピリオド、カンマ、その他の句読点、およびタブや非改行スペースなどのその他の空白文字が含まれる場合があります。この Cset は、manyおよびで使用できますupto。
より複雑な例では、言語内でのジェネレータと文字列スキャンの統合を示します。
批判
ローレンス・トラットはIconに関する論文を書き、その実際の応用を検証し、いくつかの懸念事項を指摘した。その中には、文字列処理に由来するものの、他の分野ではそれほど意味をなさない実用的な決定がいくつか含まれていた。[ 24]
手続きの最後にデフォルトで失敗するという決定は、ジェネレータのコンテキストでは意味をなしますが、一般的な手続きの場合はあまり意味がありません。上記の例に戻ると、write(f(-1))期待される出力は出力されません。ただし、次のようになります。 [24]
10 が印刷されます。この種の問題は、対話型デバッガでもすべてのコードが呼び出されますが、x期待される値を取得することはないため、まったく明らかではありません。これは、プログラマがどの言語でも知っておく必要がある「落とし穴」の 1 つとして無視することもできますが、Tratt はさまざまな Icon プログラムを調査した結果、プロシージャの大部分がジェネレータではないことを発見しました。これは、Icon のデフォルトの動作が、その構成要素のごく一部でのみ使用されているが、他のすべての構成要素で潜在的なエラーの主な原因となっていることを意味します。[24]
もう一つの問題は、ブールデータ型[c]と従来のブール論理の欠如です。成功/失敗システムは、最終的な目的が値を確認することであるほとんどのケースで機能しますが、それでも一見単純なコードで奇妙な動作を引き起こす可能性があります。[25]
このプログラムは「取得済み」と出力します。その理由は、テスト がc値を返すからです。その値は で&null、初期化されていないすべての変数のデフォルト値です。[26] は &null有効な値なのでif c成功します。これをテストするには、テスト を明示的にする必要がありますc === &null。Tratt は、それが「c はゼロか」または「c は存在するか」をテストしていると誤って想定し、自己文書化コードを損なうと考えました。[25]
参照
注記
- ^ 1985年のインタビューによると、グリスウォルドは「アイコン」という用語は、 Smalltalkがしばらく後に一般に公開されるまで使用されていなかったと述べています。彼は、この用語が、言語にグラフィカルな要素があると思っていた人々を混乱させていることに不快感を示しました。[12]
- ^ この場合、 は の直前にあるため必須ではありません。わかりやすくするために追加されています。
failend - ^ ただし、Trattが指摘するように、K&R Cにも明示的なブール型がなく、偽の場合は0、真の場合は0以外の値を使用します。[24]
参考文献
引用
- ^ Townsend, Gregg (2024年1月26日). 「バージョンを9.5.22eに更新」. GitHub .
- ^ 「Goaldi」。GitHub。
- ^ Schemenauer, Neil; Peters, Tim; Hetland, Magnus Lie (2001 年 5 月 18 日). 「PEP 255 – シンプルなジェネレーター」. Python 機能強化提案. Python Software Foundation . 2012 年2 月 9 日閲覧。
- ^ グリスウォルド1981、601、602頁。
- ^ グリスウォルド1981、602ページ。
- ^ グリズウォルド1981、606頁。
- ^ グリズウォルド1981、608ページ。
- ^ グリズウォルド1981、609頁。
- ^ グリズウォルド1981、629頁。
- ^ シャピロ1985年、346頁。
- ^ abcde グリズウォルド&グリズウォルド1993、53ページ。
- ^ シャピロ1985年、350ページ。
- ^ グリスウォルド&グリスウォルド 2002、p.xv。
- ^ グリスウォルド&グリスウォルド 2002、p.xvi。
- ^ グリスウォルド&グリスウォルド 2002、10ページ。
- ^ グリスウォルド&グリスウォルド 2002、p.1。
- ^ グリスウォルド&グリスウォルド 2002、4ページ。
- ^ abcdef Tratt 2010、p.74。
- ^ “Array.prototype.indexOf()”. MDN Web Docs . 2023年6月27日.
- ^ ab Lane, Rupert (2015 年 7 月 26 日). 「SNOBOL - 入門」. MTS をお試しください。
- ^ トラット2010、73ページ。
- ^ abc グリズウォルド1996、p.2.1。
- ^ グリズウォルド 1996、1ページ。
- ^ abcdefgh Tratt 2010、75ページ。
- ^ abcd Tratt 2010、76ページ。
- ^ グリスウォルド&グリスウォルド 2002、128ページ。
文献
- グリスウォルド、ラルフ、グリスウォルド、マッジ (2002)。アイコンプログラミング言語 (第 3 版)。ピアツーピア通信。ISBN 1-57398-001-3。
- Griswold , Ralph; Griswold, Madge (1993 年 3 月)。「Iconプログラミング言語の歴史」。SIGPLAN Notices。23 ( 3): 53–68。doi :10.1145/155360.155363。S2CID 861936 。
- Griswold, Ralph (1981)。「13」。Wexelblat, Richard (編) 『SNOBOL プログラミング言語の歴史』。プログラミング言語の歴史。Academic Press。
- Griswold, Ralph (1996 年 3 月 2 日)。「Icon プログラミング言語の概要; バージョン 9」。アリゾナ大学コンピュータ サイエンス学部。
- Tratt, Laurence (2010 年10月 18 日)。「アイコンのような表現評価システムの経験」( PDF)。第 6 回動的言語シンポジウムの議事録。pp. 73–80。doi :10.1145/1869631.1869640。ISBN 9781450304054.S2CID 14588067 。
- シャピロ、エズラ (1985 年 7 月)。「SNOBOL とアイコン」。Byte。pp . 341–350。
外部リンク
- 公式サイト
- GitHubのアイコン
- ミネソタ大学チャールズ・バベッジ研究所のスティーブン・ワンプラー氏への口述歴史インタビュー。ワンプラー氏は、1970 年代後半の Icon 開発に関する取り組みについて語ります。
- ミネソタ大学チャールズ・バベッジ研究所のロバート・ゴールドバーグ氏への口述歴史インタビュー。ゴールドバーグ氏は、イリノイ工科大学の教室で「Icon」に取り組んでいたときのグリスウォルド氏とのやり取りについて語ります。
- ミネソタ大学チャールズ・バベッジ研究所のケネス・ウォーカー氏への口述歴史インタビュー。ウォーカー氏は、Icon プロジェクトの作業環境、グリスウォルド氏とのやり取り、Icon コンパイラーに関する自身の作業について説明します。
- Rosetta Code 比較プログラミングタスク プロジェクト サイトのアイコン プログラミング言語ページ
