COME FROM
名詞
‘go to’と双対をなす、半ば神話的な言語構文。COME FROM<label>は、参照されたラベルを一種の落とし戸のように振る舞わせます。つまり、プログラムがそのラベルに到達すると、制御は静かにautomagicallyにCOME FROMの次の文へ転送されます。COME FROMは、1973年のDatamation誌に掲載された(そして1984年4月号の『Communications of the ACM』に再録された)R. Lawrence Clarkの『A Linguistic Contribution to GOTO-less programming』で初めて提案されました。これは当時激しく繰り広げられていた‘構造化プログラミング’のholy warsをパロディ化したものでした(considered harmfulを参照)。神話的には、いくつかの変種として代入COME FROMや計算COME FROMがあります(FORTRANのいくつかの厄介な制御構文や一部の拡張BASICをパロディ化したものです)。もちろん、同じラベルから来るCOME FROM文を複数持つことで、マルチタスク(または非決定性)を実装することもできるでしょう。
ある意味でFORTRANのDOはCOME FROM文のように見えます。終端の文番号/CONTINUEに到達した後、制御はDOの次の文から続きます。一部の寛大なFORTRANはその文に(CONTINUE以外の)任意の文を許したため、次のような例につながりました。
DO 10 I=1,LIMIT
C imagine many lines of code here, leaving the
C original DO statement lost in the spaghetti...
WRITE(6,10) I,FROB(I)
10 FORMAT(1X,I5,G10.4)
ここで落とし戸はラベル10の付いた文の直後にあります。(ラベルが制御の流れとはまったく関係がないように見えるため、これは特に驚くべきことです!) 油断している読者には十分驚きですが、この形のCOME FROM文は完全に一般的というわけではありません。結局のところ、制御はいずれ次の文に渡されるのです。一般形の実装は1975年頃のUnivac FORTRANに委ねられました(ただし10年前のIBM 7040にもほぼ同様の機能が存在していました)。AT 100という文はCOME FROM 100を実行します。それは厳密にデバッグ補助として意図され、それを本番コードで使うほど錯乱した者には恐ろしい結果が約束されていました。しかしながら、本番用言語ではすでにもっとひどいことが行われていました。疑う者はCOBOLのALTER動詞を考えてみればよいのです。COME FROMがその名前のもとで初めてサポートされたのはその15年後、C-INTERCALにおいてでした(INTERCAL、retrocomputingを参照)。事情に詳しい観察者たちは今なおその衝撃から立ち直れずにいます。