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

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

なでしこ3の回数とか対象がうつろいやすい件

なでしこ3は回数が変わりやすい?

なでしこ3では回数がグローバル変数になっているようです。(v3.3.76時点)
なでしこ1ではローカル変数のような動きでした。

例)関数Aを呼んだあと回数を表示させた結果が異なる

●関数A
 10回
   それ回数 //回数を変更

3回
  関数A
  回数表示 //なでしこ1→1,2,3 なでしこ3→10,10,10

なでしこ1では「1,2,3」が表示されるのに対し、
なでしこ3では「10,10,10」が表示されます。
このコードでは回数で試しましたが、対象も同じような感じです。

対象、対象キーも同様

なでしこ3では回数対象対象キー抽出文字列グローバル変数です。(v3.3.76時点)
なでしこ1でも抽出文字列グローバル変数ですが、回数対象は違うみたいです。

以下のコードもなでしこ1と3で対象が異なっています。

「あいう」文字列分解して反復
  「かきく」文字列分解して反復
    それ対象  //か,き,くに対象を変更
  対象表示 //なでしこ1→あ,い,う なでしこ3→く,く,く

なでしこ3では対象が変わりやすくなった

なでしこ3では対象が変わる機会が増えました。
切り取る命令では、切り取った前半と後半をそれ対象に分けて代入します。
DOM部品のクリック時などのイベントでは、対象に発生した部品が入ります。
AJAX送信時などでは、対象に受け取った情報が入ります。

なでしこ1では反復以外では勝手に変わらない屈強な変数だった対象が変化しやすくなりました。

秒待つの最中に対象が変わる!

x秒待つで待っているときにイベントが走るときがあります。
このとき対象が変わっていることがありえます

以下のプログラムでは「秒待つ」している間にボタンクリックのイベントが起きた場合、対象が変わります

//サンプル(なでしこ3)
「ぼたん」ボタン作成
それクリックした時:
  //特になし(イベントが走ると対象がボタンに変わる)

「あいうえお」文字列分解して反復:
  1秒待つ  //ここでボタンをクリックすると対象が変わる
  対象表示

特殊変数を破壊から守る方法は……

※(マニュアルには特殊変数「それ」特殊変数「対象」といった記述あり)

関数の開始時に特殊変数をスタックに積んで、関数から戻る前にスタックから降ろせばよさそうです。

特殊変数用 = []
●特殊変数セーブ:
 特殊変数用{"回数":回数,"対象":対象,"対象キー":対象キー,"抽出文字列":抽出文字列}配列追加
●特殊変数ロード:
 変数 sore=それ
 変数 obj=特殊変数用から配列ポップ
 回数=obj["回数"]。 対象=obj["対象"]。 対象キー=obj["対象キー"]。 抽出文字列=obj["抽出文字列"]。
 sore戻す

●ユーザー定義関数
 特殊変数セーブ //回数や対象を保存
 //ここで回数や対象が変わる処理
 特殊変数ロード //回数や対象を復元
 戻る

……関数はともかく、イベントによる対象変更には無力です。どうにもならないね!

そのうち慣れる

ユーザー定義の関数を呼んだ後や、待つのあとは回数や対象は不定なものとして扱うしかなさそうです。
なでしこ1の挙動がステキだっただけに残念です。