WSN追加案: ステップ汎用操作の模索と選択中のステップの導入

Issue #485 resolved
req created an issue

エクセルのような表計算ソフトやティラノビルダーの変数設定を見てみます。そしてtwitterでの面白いアイディアの数々を見ます。

まず、??Randomのように??Selectedという考え方を導入します。 選択中のメンバならぬ選択中のステップですね。 これをステップ系コンテントで使えることと考えます。

そしてステップで汎用操作を行うことを考えます。

まず、ステップのリストを登録するテーブルと、ターゲットステップ指定をコンテントのダイアログに用意します。

  1. 足し算 ターゲットステップを対象に、ステップのリストのステップのインデックスと、数値入力の値を、ターゲットステップのインデックスに足し、ターゲットステップのインデックスを変更します。オーバーフローしたら段階数になることにします。数値入力の初期値を0にします。(合計の要素を含みます。)
  2. 引き算 足し算と同様に行い、アンダーフロー起こしたら1になることにします。
  3. かけ算 足し算と同様に行い、数値入力の初期値は1です。
  4. 割り算 ターゲットステップを対象に、数値入力の値を、ターゲットステップのインデックスに対して割り算し、その商をターゲットステップのインデックスとして変更します。数値入力の初期値は1です。0は入れられません。
  5. 余り算 割り算と同様に行い、その余りをターゲットステップのインデックスとして変更します。0は入れられません。
  6. 文字列連結 ステップのリストのステップや文字列や数値を連結します。
  7. 選択 ステップを選択中のステップにします。
  8. 順位選択 ステップのリストのステップの中の段階の順位(最大・中間順位・最小)のステップを見つけて、そのステップを選択中のステップにします。
  9. 解除 選択中のステップの選択状態を解除します。

汎用変数とやること被らないかとのご指摘もあるかと思いますが、ステップの数値管理は直観的で分かりやすい、実数は使い勝手が難しい(文系にやさしくない)、難しい関数も同様だなどの理由で挙げてみました。固定値の様に、ステップでは出来ないこともあるので、別にあっていいと思います。

どうでしょうか? Wsn.2 でやれなどと言いませんが一応 major に上げます。

Comments (13)

  1. hand.onlooker

    name.reqさんのアイデアを整理します。四則計算コンテントのデータとしては

    • ステップA (演算結果/代入先)
    • ステップB (計算用の入力値)
    • 定数C

    で、用意する演算を模式的に書くと

    1. 足し算 A←B+C (AにB+Cの値を代入/CはAの最大値を超えない)
    2. 引き算 A←B-C (AにB-Cの値を代入/CはBの最大値を超えない)
    3. 掛け算 A←B × C (AにB×Cの値を代入/CはAの最大値を超えない)
    4. 割り算 A←B ÷ C (AにB÷Cの値を代入/Cは0でなくBの最大値を超えない)
    5. 余り算 A←B mod C (AにBをCで割った余りを代入/Cは0でなくCはBの最大値を超えない)

    ですね。元のアイデアでは3.~5.ではAとBは同じものだったのですが、一貫性を考えればAとBは別でもいいはずです。

    これをどうやって実現するかかという方針がいくつもあるので、よく吟味すべきです。とりあえず自分が思いつく実現法を描きます。

    1.ステップ増加・減少コンテントを拡張する。

    ステップ増加・減少コンテントをそれぞれ足し算・引き算に拡張します。つまり、従来のステップ増加・減少「A←A+1」「A←A-1」を、パラメータと演算結果のステップが同じで、定数設定が1の足し算・引き算とみなします。

    そしてさらに掛け算・割り算・余り算コンテントを追加します。つまりコンテントが3つ増えることになりますが、アイコンは直観的に書きやすくはあります。

    XMLデータに互換性がなくなるのであまり良い案でないかもしれません。

    2.ステップ代入コンテントとして拡張する。

    従来のステップ代入コンテントにname.reqさんのアイデアで述べたような機能を加えます。

    つまり、ステップ代入コンテントの編集画面に、6つのラジオボタン(「単純代入」「足し算」「掛け算」「割り算」「剰余算」)をと数値入力用スピナーを追加し、「単純代入」が選ばれたときは、数値入力のスピナーを無効化するように設定しておきます。

    「単純代入」が選ばれたときは、従来のステップ代入コンテントと同様の処理をします。

    これも互換性がかなり落ちるのでよろしくないかもしれない。

    3.玄人向けの黒魔術としてデザインする。

    name.reqさんのアイデアをそのまま新コンテントとするには、あまりにも機能が足りません。そこで、多数のステップからなる複合的な演算を一度に行うべく、 以下の新コンテントを作ります。

    データは

    • 代入先ステップ名
    • 数式

    という2つの文字列で、数式の計算結果を指定されたステップに代入するというものです。数式は

    • 3 * $ステップ1$ + 2 * $ステップ1$ * $ステップ2$ +12

    といったようにステップの参照を含んだ文字列で、色々な予約語が使えるとうれしいかもしれません。

    構文解析が必要で、スクリプト内にスクリプト機能を作るようなことをするため実装が相当に困難です。(頑張れば)拡張性がかなりあるので、将来新機能を思いついたときに、「計算コンテントの拡張」で済ませられること、玄人向け機能をはっきり分離できるのがこの方針の長所です。

  2. req reporter

    用意する演算を模式的に書くと

    CはAの最大値を超えない を B+C、BxCにする必要はあると思いますが、模式的に書かれた通りだと思います。0除算など補足して頂いてありがとうございます。

    1.ステップ増加・減少コンテントを拡張する。 3.玄人向けの黒魔術としてデザインする。

    を解決する妙案が1つ浮かびました。Wsnが、この機能を実現した暁に、

    黒魔術的で使用頻度も低いと思われる、ステップ増加・減少コンテントをステップ汎用操作コンテント1コンテントにしてしまい、シナリオ読み込み時、ステップ増加・減少はステップ汎用操作コンテントに置き換えてしまいます。以前のWsnやクラシックに戻すときは、ステップ+-1がある場合だけ、戻します。CWXスクリプトも貼り付け時、ステップ増加・減少はステップ汎用操作に置き換えます。

    更に、課題の ステップのリストを登録するテーブル とありますが、例えばステップ値設定のテーブルは、インデックスと値名称で2列ですよね。 そこで同様に ステップのリストを登録するテーブル を 5列にします。 

    あと、主目的のコンボボックスを用意し、このリストには、四則計算・値文字列操作・選択・順位選択・解除が選べることにします。

    汎用変数であればご提案以上の表現が可能になるのではないか

    一部これも考慮に入れて、列は、種別 と ソースステップ と 数値 と 文字列 と 演算 と考えます。

    種別は、

    四則計算の場合:段階ステップ・数値になり、5列目が有効になります。演算のリストは開始・足し算・引き算・掛け算・割り算・余り算ですが、1行目は開始しか出てきません。

    値文字列操作の場合:文字列ステップ・数値・文字列、

    選択の場合:対象ステップ

    順位選択の場合:順位対象ステップ(2行目以降はこれだけ)、順位(1行目はこれだけ)

    解除の場合:何も出ません。

    というリストがでます。ソースステップは、段階ステップと文字列ステップ・順位対象ステップは存在するステップ名のリストです。対象ステップを選んだ場合は、存在するステップ名のリストで、2行目以降の選択が出来ません。

    数値、順位を選ぶと、3列目が有効になり、数値代入できます。文字列を選ぶと、4列目が有効になり、文字列入力出来ます。演算子には優先順位 * / % >  + - があるので括弧は不要でしょう。

    すると1コンテント減り、四則計算と文字列連結と文字入力と選択と解除が出来るようになります。


    CWXスクリプト記述例を考えます。例えば四則計算について、イメージとして

    $ステップ0 = 3 * $ステップ1 + 2 * $ステップ1 * $ステップ2 +12

    こう書きたいとします。

    opstep "ステップ0", calc , [begin, number, 3][multi, step, "ステップ1"][add, number, 2][multi, step, "ステップ1"][multi, step, "ステップ2"][add, number, 12]
    

    値文字列操作について、例えばイメージとして、

    $ステップ0 = $ステップ1 + $ステップ2 + " 追加文字列です。:" + 998

    こう書きたいとします。

    opstep "ステップ0", text , [step, "ステップ1"][step, "ステップ2"][text, " 追加文字列です。:"][number, 998]
    

    同様に、選択・順位選択・解除 も書きます。

    マクロならばどうとでもしますが、CWXスクリプト風に書くとこんな感じかなあと思っています。

  3. hand.onlooker

    私の挙げた3つの案を統合する案をname.reqさんは考えておられるのですね。

    まとめると、内部的には「3.玄人向けの黒魔術としてデザインする」で書いたような仕様としておいて、従来のステップ増加・減少コンテントに似たインターフェースをかぶせるといったところでしょうか。

    個人的にはあまり良い案とは言えません。コンテントの設定で外見が変わるというのはかなりマズいですし、従来のコンテンツから玄人向けの黒魔術を分離するというコンセプトも損なわれています。

    それから、私の挙げたものも例に過ぎず、もっと良いものがあるような気がするので、下手に飛びつくのは得策ではないです。

  4. req reporter

    コンテントの設定で外見が変わるというのはかなりマズいです

    自分の認識が正しければ、クーポン複数化は外見変わります。

    従来のコンテンツから玄人向けの黒魔術を分離するというコンセプトも損なわれています。

    ステップには既に ステップ変更 があり、段階が 値名称 で表記されるため、文系にやさしい仕様になっています。

    その反面、ステップ増加・減少は、ステップの段階が今どこにあるかが分かりずらいので、言ってしまえばこれは、既に玄人向けの黒魔術用コンテントと言っていいと思います。ステップの段階をインクリメント・デクリメントして速度を上げたい(インクリメント・デクリメントは段階値代入よりごく僅かに速いが、pyではそれすらも怪しい)人しか使うメリットないのです。

    その玄人向けの黒魔術用コンテントのダイアログが、四則計算用にパワーアップすることは、望まれこそすれ、否定されることはないのではないかと私は考えます。既に分離されていると考えているのです。

    ティラノビルダーの変数設定を見てください。これに近いことしていると思います。

    私の挙げたものも例に過ぎず、もっと良いものがあるような気がするので、下手に飛びつくのは得策ではないです。

    いえいえ面白いアイディアには飛びついていきます。もっといいアイディア出されたらそれも考慮に入れていきます。


    問題点があって、それがCWXスクリプト記述例と、+ × + × + となっているときに計算順が分かりにくいという点です。

  5. tachi gigas

    恐れ入ります。

    汎用変数であればご提案以上の表現が可能になるのではないか、というのが僕の意見です。四則演算も論理演算 Issue #487 も片付きます。ただし実現可能性やシナリオ作者側のデバッグは汎用変数の方が遥かに困難です。これに関して僕は銀の弾丸を持ち合わせていないので、まぁどちらか一方を切り捨てる事になるかと思います。

    四則演算はHAND様がパッケージとして公開されていますし、論理演算はコンテント数個で簡単に再現できるため、性急なものではないと感じます。

    それと無礼を承知で申し上げますが、インターネット上で拾得したアイディアをさも自分の物として扱う(少なくともその様に読み取れます)のは極めて問題があるのではないでしょうか?

  6. req reporter

    ご意見ありがとうございます。

    汎用変数であればご提案以上の表現が可能になるのではないか、というのが僕の意見です。四則演算も論理演算 Issue #487 も片付きます。

    汎用変数 #400 改めてみました。こうすればいいのです。

    • 工夫すればある程度文字列を操れますが、柔軟な操作はできません。

    これは、四則演算に文字列連結を足すのです。上のアイディアに修正かけます。CWXスクリプト記述例なども付けておきます。

    • カードの配置位置など様々な場面で使用する事ができません(それらの値は固定値で指定しなければなりません)。

    これは困りましたね。用途が違います。ステップなので固定値は入れられないのでこれは出来ません。ですが、1コンテント減り、計算も出来、文字列連結・選択・解除も出来るのであれば、そこまで必要ないのでは? 汎用変数が必要になったら、クーポン連番増加で、1~3個のコンテントだと明言しています。そのためだけに後で導入してもいいのでは?

    それと無礼を承知で申し上げますが、インターネット上で拾得したアイディアをさも自分の物として扱う(少なくともその様に読み取れます)のは極めて問題があるのではないでしょうか?

    実のところをいいますと、名前を出してほしくないということですが、ダイレトクメールで、アイディアを出すのはいいのですと言ってもらってます。もう1人のアイディアソースは hand さんでもうここにいます。

    アイディアがあったとします。ネットに書き留めておいたとします。非公開にしてないので、自分が見ました。どこにも形になっていません。形にする意思があるかないかは個人次第です。それをいいね!欲しい!と思い、ここで形にすること試みることを tachi gigas さんは止めるのですか? 

    自分は福岡に恩のある親戚のおばが入院したので行ってきました。耳が遠いし一方的に話して不満・不安を取り除くことが出来ないので、自分は意思疎通を図るため筆談ノートを用意しました。それを見て親戚は耳が遠い人に筆談するのは当たり前と言っていましたが、やっていませんでした。それである程度分かってもらえました。アイディアあったってやるかやらないかは大違いなのです。

    さも自分のものだと言ったかのように捉えられたかもしれないので、いただきました。は消しました。

    カードワースは成熟している面もあり、同意を取り付けるのは必然とおっしゃるかもしれませんが、道端に転がっていたアイディアを無断であったとしても形にしようと試みて何が悪いのと思います。


    あれ?文字列連結を加えたことで、段階(インデックス)を操作しているのと、値文字列 を操作しているのが混ざることになるのか?

  7. tachi gigas

    具申を聞き入れて下さりましてありがとうございました。ただ僕はname.reqさんの行動理念に関しては何一つ申し上げてません。また、ご承知の通りCardWirthは非常に厳しい界隈ですので、よろしくお願いします。

  8. 守屋 花

    開発とは関係がないので、本当はここでこんな事を言いたくはないのですが…。

    「貴方がどう思っているのか」と「他人が貴方をどう捉えるのか」は違います。 信頼関係が必要な場所でそれが損なわれる様な言動をとるのは貴方にとって不利益です。 良いアイデアがあったとしても、提唱者に信頼が置けないのであれば、協力も賛同もされにくいでしょうね。とだけ申し上げておきます。

  9. req reporter

    前と同様、ご意見ありがとうございます。「他人が貴方をどう捉えるのか」にもそれなりに考えて、信頼確保に努めたいとも思いますが、何分人間関係にうまくないところが自分にはあります。何とか自分なりに良いと思われるアイディアを繰り出して、多めの同意を得られるよう模索していきますのでそれでよろしいでしょうか?

  10. hand.onlooker

    tachi gigas さん

    「3.玄人向けの黒魔術としてデザインする。」はまんま汎用変数に繋がる案ですね、見落としていました。

    name.req さん

    アイディアがあったとします。ネットに書き留めておいたとします。非公開にしてないので、自分が見ました。どこにも形になっていません。形にする意思があるかないかは個人次第です。それをいいね!欲しい!と思い、ここで形にすること試みることを tachi gigas さんは止めるのですか? 

    そういう状況では引用するのがマナーだとは思います。 「○○さんのtwitterでの意見で~」くらいのソースの指示があるといいですね。

  11. req reporter

    そうですね、hand さんにも引用したこと言ってませんでしたし、hand さんの twitter での意見で~と書いていませんでしたね。

    ちなみに ステップ選択コンテントのアイディアは hand さんの twitter でのアイディアで、親切・便利さの追求の、CardWirthPyなるべくコンテントは増やさない方針にしてくれるとありがたい とか、ステップ増加・減少コンテントはあまり使わないかなというのは、hand さんの twitter でのつぶやきであることを明言します。

  12. req reporter

    今1つアイディア思いついたので書くだけ書いておきます。後どうするか知りません。自分の不用意な発言を咎めるのなら、あなたの不用意な発言でやる気を損ねることもあることも知ってください。マクロももういいや。自分もナイーブなところあるのです。

    これは hand さんと twitter で話していて出たのですが、例えば   (後にマクロでCWXスクリプトを囲む記号が必要になると思いますが、それと被らないようにする。マクロ仕様案では )をステップを表す記号と考え、コンパイルチェックから外し、

    $ステップ0 = 3 * $ステップ1 + $ステップ2 / 2 +  $ステップ3 % 3 
    

    とイメージ的に書けるとします。四則演算を

    #ステップ0# = 3 * #ステップ1# + #ステップ2# / 2 +  #ステップ3# % 3 
    

    のように書けるようにするかです。その他 文字列連結・最大・最小・中間順位 などはどうするか考える気になっていません。

  13. Log in to comment