SAS

Proc luaって何に使うの??

SASをけちょんけちょんにけなしているくせに、グラフパッケージを制作しているという変な人ことSupermanJPです。

まあグラフパッケージと語っているからそれなりに完結させないとね。。。

グラフマクロを作成するときにテキストを操作したいことがあったので今回初めてproc luaを使ってみました。
proc luaなんていろんな方がさんざん使ってきているので今更感すごいのですが、ブログ放置しすぎて記事書かないとやばいので今回は使用した感想を語っていきます。

Proc luaとは

SAS内でプログラミング言語であるLuaを実行することができるプロシジャです。
SAS環境からデータを相互に利用できるようになっており、一時期メタプログラミングとかで話があったやつですね。

SASと違ってリスト等のデータセット以外の構造体を利用でき、SASコードを生成、実行ができます。SASマクロの代わりに使えるとか。
知らない人はproc luaでググろう!

使用した感想

私の場合はグラフマクロに渡す引数のテキストを加工するのにproc luaを使用しました。引数は数値が半角スペースで区切られているリスト形式のテキストです。
このテキストからグラフ定義に渡すテキストを生成するコードをluaで書いて、それ以外は通常のSASコードを書きました。

例えば以下のようなテキストを

1 2 3 4 5

こんな感じのテキストに変換するプログラムをluaで書いています。

-5 -4 -3 -2 -1 0 1 2 3 4 5

テキストを区切り文字で分割して要素ごとに処理するのは
SASだとちょっとめんどいかなと思ってこの方針を採用しています。以下は使用した所感です。

SASマクロ内で使えない

Luaの予約語には”%”が使われている箇所があります。例えばluaのstringライブラリを使うと正規表現を使用できるのですが、エスケープ文字は”%”を使っています。
”%”はSASのマクロステートメントを識別する記号として使われています。そのためなのかSASマクロ内でproc luaは使えないようです。proc luaをネストしたマクロは実行するとエラーとなります。

回避方法としてはproc luaのコードのみ別ファイルにして%includeで呼び出す方法があります。別言語なので別ファイルとして管理するのはまあOKかな。

tableの降順ソートがサポートされていない

luaはテーブルというRでいうベクトルに似た構造体があり、要素をソートするsortメゾッドが用意されていますが、降順を指定するキーワードが存在しません。
ではどうやって降順ソートをするかというと、以下のように記述することで実現できます。

table.sort(テーブル名, function(a,b) return a< b end)

luaの特徴として、変数と関数は同じ扱いのようですね。引数に関数をとることもできます。

まあできるのでいいんですが、普通のプログラミング言語は引数とかで降順に指定できるのが一般的かと思いますのでこの仕様はどうなんでしょうね。他言語のようにdescendingキーワードを用意してほしかった。

文字列分割関数がない

pythonでいうsplit関数のようなものがなく、forループとテキスト関数の組み合わせで実施するしかありません。
SASよりは簡単だとは思いますがマジでくそ。

活用事例が探しにくい

リファレンスは日本語のものがあるのですが、luaの最新の活用例とかがあんまり見つからなくてちょっと不便でした。最新のTOIBE indexを見る限りだと、luaってSASよりも順位が低いんですよね。。。どんどん利用者が減っているみたいですし、luaを積極的に学習する理由がないのも悲しいところ。

あくまでSASコードを生成する言語

あくまでSASコードを生成する言語という位置づけであり、SASの機能拡張につかうのはちょっと違うのかなと思いました。というのもSASプログラムの任意の場所から既存のluaのコードを呼び出して実行するといった使い方ができないみたいなんですよね。マクロの完全上位互換とは言えない気がします。マクロだと%マクロ名で自由に呼び出せますけど、luaの場合は外部ファイル化して%includeで呼び出す形にするしかなさそうでした。

私の場合は好きな時に拡張機能を関数っぽく呼び出せるようにしたかったので、拡張機能をluaのみで記述するのはやめて、テキスト処理の部分だけluaで書いて外部ファイルとする形にしました。

マクロの代わりに利用する価値あるの?

今回のようなテーブルという構造体でテキストを操作する用途だったらluaを使うメリットは一応あるとは思いますが、レアケースなのではないでしょうか。ほとんどの場合既存のマクロステートメントで記述可能だと思いますのでproc luaってあまり利用されないんじゃないかなと思いました。

たしかluaを使ってドキュメントからプログラムを生成することができるみたいな話を聞いたことあるけど、それできるのってCdisc関係だけでしょう。仮にそのようなプログラムを開発してもイレギュラーな処理が必要になったらしたら途端に使えなくなるのではないでしょうか。工数かけて開発するメリットあるのかな?既存のプログラムを持ってきて修正したほうが早い気がします。

少なくとも私の業務ではluaを積極的に使うメリットはないですね。