COME FROM

名詞

‘go to’と双対をなす、半ば神話的な言語構文。COME FROM<label>は、参照されたラベルを一種の落とし戸のように振る舞わせる。つまり、プログラムがそのラベルに到達すると、制御は静かにautomagicallyCOME 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のDOCOME 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を実行する。それは厳密にデバッグ補助として意図され、それを本番コードで使うほど錯乱した者には恐ろしい結果が約束されていた。しかしながら、本番用言語ではすでにもっとひどいことが行われていた。疑う者はCOBOLALTER動詞を考えてみればよいのだ。COME FROMがその名前のもとで初めてサポートされたのはその15年後、C-INTERCALにおいてだった(INTERCALretrocomputingを参照)。事情に詳しい観察者たちは今なおその衝撃から立ち直れずにいる。