※以下すべて妄想です。 bugyo/里々拡張案を読んで思ったこと。†結局whenって ( replace ,( replace ,( if ,(条件式) ,【処理1】 ,【処理2】 ) ,】 ,(han2zen,)) ) ,【 ,(han2zen,() ) 今まで↑のように書いていたのが、 ( when ,(条件式) ,(処理1) ,(処理2) ) このように書けるようになったということ。 when単体は今まででもこういう対処策はあった。 確かに、if文ををネストするときには便利。 ( replace ,( replace ,( if ,(条件式1) ,【 replace ,【 replace ,【 if ,(条件式2) ,{処理A} ,{処理B} 】 ,} ,【han2zen,)】 】 ,{ ,【han2zen,(】 】 ,【処理C】 ) ,】 ,(han2zen,)) ) ,【 ,(han2zen,() ) 「【】」「{}」と、カッコの抽象化を2種類も使っていたのを、 ( when ,(条件式1) ,( when ,(条件式2) ,(処理A) ,(処理B) ) ,(処理C) ) こうスッキリと書けるようになった。 when、while、for。どれもずっと欲しかったものばかりでとても魅力的だ。timesは使い時がイマイチ分かりませんが・・・ しかし、そもそもsatori.dllにifやその他の機能は必要ないから、ssu.dllが作られたはず。 このままではssu.dllの存在価値が危ぶまれる。 satori.dllに新造すべき内部関数†そこで妥協案。 lambda†(lambda,[中身]) 現在の階層の括弧内では展開されても中身は処理されない。ひとつ下位の階層で処理される。 なんとなく仮に名前を付けただけで、LISPのlambdaとは特に関係ない。もっと相応しい名前があるかも。 例†( if ,(条件式1) ,(lambda,(set,hoge,0)) ,(lambda,(set,hoge,1)) ) thru†(thru,[中身]) 中身をそのまま返す。 (replace,[中身],あ,あ) これで代用できなくもない。 そもそもこれはsatori.dllに実装する必要もない。ssu.dllでも十分かもしれない。 例†(thru,あ,あ)→あ,あ 上の二つで実現できるもの†when†(if,[条件式],(lambda,[処理1]),(lambda,[処理2])) 例†( if ,(条件式1) ,(lambda,(set,hoge,0)) ,(lambda,(set,hoge,1)) ) times†forと共用 while†(call,while,(lambda,[条件式]),(lambda,[処理])) ※さらに以下の単語群がセットになります。 @while (A1)( ( if ,(A0) ,while ,nop、 ) ) 例†(set,n,1)( call,while ,(lambda,(n)<=100) ,(lambda ,( iflist ,0== ,(n)%3+(n)%5 ,FizzBuzz ,(n)%3 ,Fizz ,(n)%5 ,Buzz ,(n) )(set,n,(n)+1) ) )(set,n,) for†(loop,thru、(lambda,[繰り返し処理]),[初期値],[終了値],[増加量]) ※カウンタは繰り返し処理の中に自分で作ってください。 例†(set,n,1)( loop ,thru#このthruが100個並んだ後、lambdaの中身が処理され、そして華麗にスルー。 、( ,lambda#このlambdaでloop内では展開されない ,( iflist ,0== ,(n)%3+(n)%5 ,FizzBuzz ,(n)%3 ,Fizz ,(n)%5 ,Buzz ,(n) )(set,n,(n)+1) ) ,1 ,100 )(set,n,) 意見とか† |