大谷と申します。

toda@lbm.go.jp writes:
> In article <binuft$49p$1@bluegill.lbm.go.jp> toda@lbm.go.jp writes:
>>>  そもそも言語メカニズムというならCの祖先BCPLや親戚BLISSを調べる
>>>必要はあるんじゃないでしょうか。
>>ですよね。あと、algol 68も見ておきたいんだけど、
>>教科書探しから始めねばならない状況です。
> ということで、とりあえずWebで少しは判らないかと
> いろいろ探してたら、

algol68 struct union esac でググって、
http://www.cs.virginia.edu/~evans/cs655-S00/Spring-1999/Slides/05a68_pasc.pdf
や http://page.inf.fu-berlin.de/~wolff/Algol68-OCCL.html
というのを見つけました。
20年ほど前に解説書を1冊読んだのですが、これを見て少し思い出してきました。

戸田さんのサンプルをalgol68で書くと、

STRUCT (
  INT maindata,
  STRUCT (
    INT subdata,
    [0:3] CHAR subtext
  ) subsets,
  [0:79] CHAR maintext
) datasets;

でしょうか。一番 C と似てますね。(algol68 のプログラムの記述には2種類の文字が
必要なのでとりあえずキーワードや型名を大文字にしました)

union もありますが、これは C とずいぶん違う。C ではどの型のデータが入っている
かはプログラマが管理しますが、algol68 では処理系が管理します。

宣言:
UNION (INT,REAL) foo;

代入:
foo := 1.5;
foo := 123;

参照:
CASE foo IN
(INT i):  print(("integer=",i)),
(REAL f): print(("real=",f))
ESAC

代入した型と違う型で参照しようにも方法が無い。i の有効範囲は , までなので
(REAL f)の後の式では使えません。f も逆に同じ。
print手続きの引数も任意の型のunionです。上記例では、STRUCT(STRING,INT)型や
STRUCT(STRING,REAL)型の表記です。

ちなみに ; は区切りでも終端でもなく演算子です。C の , 演算子と同意。
処理系をさわったことが無いだけに憧れの言語ですね。
ふた昔前の記憶で書いているので間違ってたらごめんなさい。
-- 
oo