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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS