なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこで変数分配を使い倒してみる

2020/7/27 訂正・追記:
母艦のサイズを例にした部分「x,y,w,h」の変数に入れていますが、
サイズが返す値は「x1,y1,x2,y2」なので以下は読み替えてください。
(後から気づいた)


「変数分配」っていう命令があります。

【名前】変数分配 (へんすうぶんぱい)
【引数】{=?}AをSへ|AからSに
【説明】配列Aの要素の各値を文字列Sの変数リスト「変数,変数,変数...」へ分配する。

結構便利なのですがややマイナーか。使用例をいくつか。

//抽出文字列+変数分配で使う例
 今日「(####)/(##)/(##)」ワイルドカードマッチ
 抽出文字列「yyyy,mm,dd」変数分配

//区切る+変数分配で使う例
 母艦サイズ「,」区切って「x,y,w,h」変数分配

//二次元配列を反復+変数分配で使う例
 窓列挙してCSV取得
 反復
   対象「handle,クラス名,テキスト,id」変数分配

うん、結構便利!

問題点と工夫

●テスト
  xとは変数
  yとは変数
  母艦サイズ「,」区切って「x,y,w,h」変数分配
  x表示 //→ローカル変数
  y表示 //→ローカル変数
  w表示 //→グローバル変数
  h表示 //→グローバル変数

関数内で変数宣言がされているものはローカル変数になり、
されていないものはグローバル変数に入ります。
これは!変数宣言必要とちょっと相性が悪い感じ。

!変数宣言必要
母艦サイズ「,」区切って「x,y,w,h」変数分配
w表示 //→エラー 厳密に宣言してください

ゲームを作るなら!変数宣言必要にしたほうがよいので工夫します。

//グループメンバに変数分配する
!変数宣言必要
■SIZE型
 ・x
 ・y
 ・w
 ・h

テスト
●テスト
  sizeとはSIZE型
  sizeについて  //~~についてのブロック内で
    母艦サイズ「,」区切る
    それ「x,y,w,h」変数分配 //変数分配すると、メンバに入る
    x表示 //→ size.x が表示される

「(グループ)について」のブロック内で変数分配を使うとメンバに入ります。
結構便利!

便利に使う

csvのデータを加工する際に、見出しをそのまま変数名にすることもできます。

「id,カード名,コスト
1,槍,100
2,斧,200」CSV取得
反復
  もし回数==1ならば
    見出し=対象「,」配列結合 // 見出し=「id,カード名,コスト」
  違えば
    対象見出し変数分配
    カード名表示 //→槍、斧

↑お手軽なプログラム向き

↓重厚なプログラム向き

!変数宣言必要
■カード型
 ・id
 ・カード名
 ・コスト
 
カードとは変数
カードリストとは変数
「id,カード名,コスト
1,槍,100
2,斧,200」CSV取得してカードリスト代入

//カード[id]にCSVのデータをいれる
カードリストロード
●カードリストロード
 cardとはカード型
 見出しとは変数
 カードリスト反復
   もし回数==1ならば
     見出し=対象「,」配列結合
   違えば
     cardについて
       対象見出し変数分配
       cardカード[id]ループコピー

カード[1]カード名表示 //槍
カード[2]カード名表示 //斧

csvデータの列が増えることを見越した書き方になったと思います。
結構便利!
(別件で、自作のシンタックスハイライトが「グループコピー」の「ループ」に反応したので何か考えます)


文字列型になることに注意

言い忘れたことがあります。
変数分配で入った変数は「文字列型」になります。
型によるバグは……あるかもしれないし、ないかもしれない。

 母艦サイズ「,」区切って「x,y,w,h」変数分配
 デバッグ

f:id:tkizzz:20200715202610j:plain
文字列型になる