ラベル : の投稿を表示しています。 すべての投稿を表示
ラベル : の投稿を表示しています。 すべての投稿を表示

筋悪ですが、LINKステートメントとGOTOステートメントについて

SAS Technical News 2010 Autumn 「意外と知らない!? コロンの活用術をご紹介」は僕のお気に入りの号のひとつです。

http://www.sas.com/offices/asiapacific/japan/periodicals/technews/index.html#section=4

SASにおけるコロン「:」はトリッキーかつ結構いい働きをするやつで、これをうまく使えるかどうかで、コードの完成度に差がでると思っています。僕の中では桂馬みたいなイメージです。

で、だいたい上記の号の中でコロンの使いどころについて言及されているのですが、ちょっと勝手に感じたのが、やっぱりSAS的にはLINKステートメントやGOTOステートメントにおけるラベルコロンは紹介すべきではないと考えているのかなということでした。

LINKやGOTOステートメントは、プログラムの途中で指定箇所(ラベルといわれる)にぶっ飛ぶことができる危ない奴です。

GOTO文は筋悪というのは、多くのプログラム言語に当てはまることで、SASにとっても
上から下に流れるSASのシンプルな処理をぶち壊す、やっかいなステートメントです。

恐らく、ほぼ全てのケースにおいてGOTOやLINKを使わずに、目的の処理が果たせるコードはかけるはずなので、使用はお勧めしません。

ただ、コードを書く人も、読むであろう人も全員、熟練者であれば、相当複雑なネストを組む時に、全体をすっきりさせるために使用することはあるのかもしれません。

しかし、もしかしたら、運悪く、どこかで他人の書いたGOTO や LINKのコードに対峙することがあるかもしれません。そんな時の対抗手段として、基本的な挙動は知っておいて損はないと思います。

例えば以下のようなデータセットがあったとします。

data Q1;
do X=1 to 5;
 do Y=2 to 4;
  output;
 end;
end;
run;



















これに対して以下のコードを実行すれば

data A1;
 set Q1;
 by X;
 if first.X then Z=0;
  Z+Y;
run;



















となります。


これをLINKステートメント使って表現すると

data A2;
 set Q1;
 by X;
 if first.X then link FL;
  Z+Y;
 return;

 FL:
  Z=0;
 return;
run;

となりますFLというのがジャンプ先の目印になって
そこからジャンプ先での処理が行われて、returnで戻ってきます。

ちなみにlinkの部分をgotoにすると

data A3;
 set Q1;
 by X;
 if first.X then goto FL;
  Z+Y;
 return;

 FL:
  Z=0;
 return;
run;

returnで停止するので



















僕が知っているのも、ほんとこの程度までです。