てきとう

てきとう

Gem #2

http://www.adacore.com/2007/05/21/gem-2/

「aggregateで型の既定値使えるようにしたよ!」

#1の例で相変わらずZはエラーですが、Bの初期値として<>を与えることで、

X:T; -- 正しい。X.A=42, X.B='@'
Y:T := (A=>99, B=>'0'); -- 正しい。 X.A=99, X.B='0'
Z:T := (A=>64, B=> <>); -- 正しい。 X.A=64, X.B='@'

T宣言時の初期値を使うことができます。
元記事の最後に触れられている注意は、型宣言で既定値が設定されていないスカラ値は(当然)不定ということです。*1
以下のような場合Wの要素は不定です

   type U is array(1..5) of Character;
   type V is array(1..5) of S;
   W:V:=(others=> (others=> <>));

が、表記上初期化されているので単に初期化されていない場合に通常出る警告が出ません。(少なくともウチのGNAT 4.4.1では)

*1:2012でスカラも既定値の設定できるようになるらしい

Gem #1

http://www.adacore.com/2007/05/14/gem-1/

「limitedでもaggregate使えるようにしたよ!」

例えば、以下のTとX,Y,Zを考えたとき、

type T is limited record
   A:Integer:=42;
   B:Character:='@';
end record;
X:T;
Y:T:=(A=>99,B=>'0');
Z:T:=(A=>64);

Ada95では、

X:T; -- 正しい。 X.A=42, X.B='@'
Y:T:=(A=>99,B=>'0'); -- コンパイルエラー
Z:T:=(A=>64); -- コンパイルエラー

となるわけです。
しかし、Ada05ではlimited型でもaggregateで初期化できるため、

X:T; -- 正しい。 X.A=42, X.B='@'
Y:T:=(A=>99,B=>'0'); -- 正しい。 X.A=99, X.B='0'
Z:T:=(A=>64); -- コンパイルエラー

Yもコンパイルが通ります。
aggregateなので型が合えばothersでまとめて初期化ができます。

type U is limited record
   A,B:Integer;
end record;
V:U:=(others=>42);

基本的に書くコトがない

なんかネタで縛りかければ持続するかな、とか(以前の記憶から目を逸らしつつ)
というわけで1日1gem斜め読み開始。
横に読もうが縦に読もうが得られる情報に大差がないお察しな英語レベルですけど。

Erlang Programming買ってきた

前述の

not spawn(m,f,a).

は、こっちでも

not spawn(m,f,a).

だった。*1


日本語の方も読み終わってないし、暇になったら読みます。

*1:『「以下は誤りです。」部分が「not」のみ』なのはそうだったけど。

Erlang プログラミング買ってきた

とりあえず、P.93、罠のマークのパラグラフの最後、

not spawn(m,f,a).

は、

spawn(m,f,a).

だと思う*1のですが、今一つ確信がないし、いずれにせよ誤りだからどうでもいいか。


という訳でまだ100ページ読んでません。
遅々として進まなくて読み終わる気がしない…何故だ…

*1:spawn/3はpid()返すのでnotは意味不明な上、その上の正しいコードとの対比にもなっていない。「以下は誤りです。」部分が「not」のみでそれが残ってたとかだろうか。