Proc Luaの世界①-こんにちはからif文あたりまで

Proc Luaは間違いなく、相当に便利な機能です。今までSASマクロが担ってきた機能の多くはProc Luaでより簡易に記述することができます。
前の記事を読んでいない方は先にご一読ください

「Proc Luaの衝撃」
http://sas-tumesas.blogspot.jp/2016/08/proc-lua.html


今後は、具体的かつ実践的な例をあげる記事と、基礎から一緒に勉強する記事を織り交ぜていきたいと思います。

僕も超初心者なので、多分間違ったことも書いてしまうと思いますが、一緒に切磋琢磨していきたいので適宜指摘や情報交換いただけますと幸いです。
Luaそのものについては、既に良質な情報が公式、非公式を問わずに出揃っているのですが、Proc LuaはあくまでSASの中で動くものなので、ちょっとSASプログラマーにしかわかりにくところがあります。
なので僕が一から解説することも無意味ではないはず、、。ということでいきましょう!

まず最初は以下のコードです

proc lua;
 submit;
print('こんにちは世界')
 endsubmit;
quit;

実行するとログにこのようにでます。




まず、Luaプロシジャはproc luaで始まりquitで終わります。
そしてsubmit;からendsubmit;の間がLuaの世界で、ここにはLuaの文法で記述されたコードが
実行されます。

print関数はログ画面に引数を出力する関数になります。
Luaでは文字列はコーテーションで括りますが、シングルでもダブルでもOKです。
そして、SASと違ってセミコロン「;」は要りません。まあ、つけてもLuaでは空文の意味なので
影響ないですが。

つづいてコメントのやり方について、以下をみてください
proc lua;
/*submitまでのこのスペースはまだSASの世界なのでSASのコメントができる*/
submit;
  --ここからはLuaのやり方でコメントする
  --1行コメントはこのようにバー2連続で書く
print('こんにちは世界')
  --[[
    複数行コメントは
このように書きます
  --]]
 endsubmit;
quit;

とまあ、こんな感じですが、SASの拡張エディタだと色変わらないんでちょっと嫌ですね。

次は変数についてです。

proc lua;
 submit;

  local a =1
  local b='あああ'

print("a=" ..a)
print("b=" ..b)

 endsubmit;
quit;

結果は





local a=1でローカル変数aを定義しそのまま値を代入しています。
local aとして値を入れない宣言もありです。
後で説明しますが、基本localでの定義を推奨します。
これも後で説明しますが、Luaには変数の型というものはなく、
入っている値によって型が動的に決まります。
入っている値が数値なら数値型、文字なら文字型ということです。
print("a=" ..a)..ですが、これは文字列の連結を表します。SASでいうところの||と同じですね


変数についてもう少し見てみます

proc lua;
 submit;

    --こうも書ける
  local c ,d =1 , 2

print("c=" ..c)
print("d=" ..d)

--こうやって中身を入れ替えることもできる
local c ,d = d,c

print("c=" ..c)
print("d=" ..d)

--型はtype関数で調べれる
print("cの型は"..type(c).."です")

--Luaは動的型つき言語→つまり変数は型を持たず、値のみが型を持つ。
c="A"
print("c=" ..c)
print("cの型は"..type(c).."です")

--未初期化の変数には「nil」が入っている
print(zzz)

 endsubmit;
quit;

結果は












です。
 local 変数,変数,変数... =値,値,値...といった書き方がかけるということ
local c ,d = d,cで値が入れ替えられるということ。
またtype関数で型が調べられること。そして型が値によって変わるということを押さえてください。

またnilという概念があって、要するにnullみたいなもんなんですが、未初期化の変数にはnilが入ってます。
いずれまた詳しく掘り下げますが、Luaでは、論理演算において「false」と「nil」だけが偽それ以外は全て真というルールで動きます。つまり0だろうが、長さ0の""のような文字列だろうがそれらを真偽値では真になるので注意です。また関数などでも、指定しなかった引数にはnilがはいるので注意です。

さて、localでローカル変数が定義できるということはグローバルも当然あります。これは何もつけずにそのまま値を代入するとグローバル変数になります。グローバル変数になるとproc lua; quit;が終了してもその変数が残ります。つまり

proc lua;
 submit;
  --local宣言せずに変数をつくるとGlobalになっちゃう。多分それは避けた方がいい
  e = 100
 endsubmit;
quit;

一旦プロシジャを閉じても

proc lua;
 submit;
  --global変数はずっと生きちゃうから
  print ("e="..e)
 endsubmit;
quit;




と変数が生きちゃってます。nilを入れない限り、ずっと参照できます。
それをうまく使うことも当然できますが、しばらくはグローバルで定義せずにひとつのproc luaからquitの間で完結するコードを書いていこうと思います。

つづいて、算術演算子に関しては、まあ普通な感じなので、さっと見て覚えてください

/*算術演算子*/
proc lua;
submit;
 local a ,b, c, d;
 print(3+2)
 print(3-2)
 print(3/2)
 print(3%2) --剰余
 print(3^2)
endsubmit;
quit;










関係演算子については、ちょっと間違いやすいです

/*関係演算子*/
proc lua;
submit;
 local a =1
 local b =2
 local c ='1'
 print(a==1) --★SASと違うから要注意!=1だとエラーになる。
 print(a>b)
 print(a>=b)
 print(a<b)
 print(a<=b)
 print(a~=b) --★^=じゃなくて~=なので注意
 print(a==c) --★型が違うと不等とみなされるから注意!
 endsubmit;
quit;












SASは割り当ての際も=をつなぐし、等しいことも=で表現しますがLuaの等しいは==で表現することに要注意です。僕は既にこれで10回はエラーだしました


最後にIF文について紹介します。
基本的に
IF 条件式 THEN 処理 END と書きます。
SASだとendがつくのは処理が複数で then doの場合のみですがLuaは必ずENDがいるので注意です。
例をみます。

/*if文*/
proc lua;
submit;
if sas.weekday(sas.today()) == 2 then
print('今日は月曜だ')
end  --★if文の終わりに絶対endが必要なことに要注意
endsubmit;
quit;

結果は日によって変わるので省略。

また後日説明しますが、sas.SAS関数名でSASの関数を使うことができます。

proc lua;
submit;
if sas.weekday(sas.today()) == 2 then
print('今日は月曜だ')
print('もう一度言おう今日は月曜だ')
end
endsubmit;
quit;

then からendの間にはいくらでもかけます。

proc lua;
submit;
if sas.weekday(sas.today()) == 1 then
 print('今日は日曜だ')
elseif sas.weekday(sas.today()) == 7 then --★else ifじゃなくてelseifなことに注意
          print('今日は土曜だ')
else
 print('今日は平日だ')
end
endsubmit;
quit;

elseifで条件分岐をいくらでも深くできます。elseifとスペースをいれずに1キーワードで記述することに注意です。

今回はここまで。

0 件のコメント:

コメントを投稿