There are no words to descirbe how bodacious this is. 以下妄想です。 #ref(satori-chop.zip) *特殊構文 [#xaec2d5d] 引数は事前に評価(括弧展開)されない。 **when [#m767839f] 外部関数ifと同等。 ***仕様 [#d9861dcb] :呼び出し|(when、式、真の場合[、偽の場合]) :振る舞い|「式」が計算が計算され、結果が0以外なら「真の場合」を返し、0なら「偽の場合」を返す。 ***例 [#o7251c72] *さんぷる1 :ifの場合 (set、変数1、0)(set、変数2、0) (if、1、(set、変数1、1)、(set、変数2、1)) 変数1は(変数1)#=>1 変数2は(変数2)#=>1 :whenの場合 (set、変数1、0)(set、変数2、0) (when、1、(set、変数1、1)、(set、変数2、1)) 変数1は(変数1)#=>1 変数2は(変数2)#=>0 *さんぷる2 :10の階乗は(call、階乗、10)です。 @階乗 (when、(calc、1<(A0))、 (calc、(A0)*(call、階乗、(calc、(A0)-1)))、 1) **times [#sdec22f8] 回数を指定したループ。 loopと違って、引数の括弧は事前に展開されない。 ループ本体はラベルとして呼び出されずに直接評価される。 ラベルは括弧やcallで明示的に呼び出す必要があるので注意。 また、loopとは引数の順番が違うので注意。 (ループ本体が大きくなると予想されるため入れ替えた) ***仕様 [#s75adb80] :呼び出し|(times、回数[、カウンタ初期値=0]、ループ本体) :振る舞い|「ループ本体」を「回数」回繰り返し、戻り値を連結して返す。 -「回数」は式として1回だけ計算される。 -本体および呼び出し先で(C?)と書くことでカウンタを取得できる。 -現ループのカウンタは(C0)。1つ上のカウンタは(C1)。 -「カウンタ初期値」を引数で指定できる。デフォルトの値は0。 -「カウンタ初期値」、「回数」の順で括弧展開、計算される。 ***例 [#kf5eb2b1] *さんぷる1 ピザって10回言って。\w9 :(times、10、ピザφ、\w2) :ここは?\w9 :・・・\w5埼玉。 *さんぷる2 :(times、9、1、(C0)+)10は?\w9 :・・・(call、級数、10)! @級数 (when、(calc、1<(A0))、 (calc、(A0)+(call、級数、(calc、(A0)-1)))、 1) *さんぷる3 :点呼! (times、3、1、(times、3、1、(call、点呼))) *点呼 (C1)年(C0)組、そろいました。 **while [#ob78c036] 条件式によるループ。 ***仕様 [#u440e8ba] :呼び出し|(while、式[、カウンタ初期値]、ループ本体) :振る舞い|「式」を計算した値が真(0以外)である間、ループ本体を繰り返し結果を連結して返す。 -「式」は繰り返す度に再計算される。 -本体および呼び出し先で(C?)と書くことでカウンタを取得できる。 -「カウンタ初期値」は引数で指定する。デフォルトの値は0。 -カウンタはtimes、forとも共有される。 -「式」に先立って「カウンタ初期値」が括弧展開、計算される。 ***例 [#c0503010] *さんぷる1 素数を数えるんだ!\w9 :1、(call、素数、100) :……1は素数じゃないよ。 @素数 (while、(C0)<=(A0)、2、 (set、約数、0) (while、(C0)<(C1)、2、 (when、(C1)%(C0)==0、 (set、約数、1))) (when、(約数)==0、(C0)φ、)) **for [#l4af530b] 内部関数loopと同様。ただし、ループ本体はラベルとして呼び出されない。 ***仕様 [#kc226c50] :呼び出し|(for、開始値、終了値[、増分]、ループ本体) :振る舞い|カウンタが「開始値」から「終了値」に向かって「増分」ずつ進み、その度に「ループ本体」を繰り返すし、結果を連結して返す。 -「開始値」、「終了値」、「増分」は事前に括弧展開され、式として計算される。 -「増分」は正で指定するが、loopと同様に負で指定しても問題ない。(「開始値」と「終了値の」大小関係に応じて修正される。) -「増分」に0を指定することはできない。 -「増分」の初期値は1。 -「開始値」、「終了値」、「増分」の順で括弧展開、計算される。 ***例 [#rd1ecc2c] *さんぷる1 高速に素数を数えるんだ!\w9 :(call、素数、100) :……しかしオーダーは変わらないという……。 @素数 2、3、φ (for、5、(A0)、2、 (set、約数、0) (for、3、(C1)-1、2、 (when、(C1)%(C0)==0、 (set、約数、1))) (when、(約数)==0、(C0)φ、)) #comment