実際に今書きかけのRasPi用のpythonスクリプトに使ってみました。
いいね!見違えるほどスッキリ!
でも、やっぱり条件が先がいいし、無駄なものがいっぱいついてる...
ながめているうちに気がついた。
もっと単純でよくね?
クイックソートの例でいうと前回はこうでした。
switch()の中に、
最後にすべての 条件式 and do(式1,式2,...) が偽になった時の処理をdo(式1,式2,...)で書きます。
do(式1,式2,...)の中味は順番に評価されます。
その結果がタプルとしてswitch()に渡され、タプルの最後の値が返ります。
書くとき[-1]とかコンマとか忘れそう。いや絶対忘れる...
いいね!見違えるほどスッキリ!
でも、やっぱり条件が先がいいし、無駄なものがいっぱいついてる...
ながめているうちに気がついた。
もっと単純でよくね?
クイックソートの例でいうと前回はこうでした。
box=lambda *x:x
unbox=lambda x:x[-1]
do=box
switch=unbox
qs=(lambda xs :
(lambda
le = [x for x in xs[1:] if x<=xs[0] ] ,
gt = [x for x in xs[1:] if x>xs[0] ] :
switch(
do( [] ) if xs == [] else False
or
do( qs( le ) + [ xs[0] ] + qs( gt ) )
)
)()
)
そもそもelse False orいらない。
式1 if 条件1 else 式2 if 条件2 else ...最後の式
と続けても問題ないみたい。
box=lambda *x:x
unbox=lambda x:x[-1]
do=box
switch=unbox
qs=(lambda xs :
(lambda
le = [x for x in xs[1:] if x<=xs[0] ] ,
gt = [x for x in xs[1:] if x>xs[0] ] :
switch(
do( [] ) if xs == [] else
do( qs( le ) + [ xs[0] ] + qs( gt ) )
)
)()
)
でも、これがいいんじゃね?
box=lambda *x:x
unbox=lambda x:x[-1]
do=box
switch=unbox
qs=(lambda xs :
(lambda
le = [x for x in xs[1:] if x<=xs[0] ] ,
gt = [x for x in xs[1:] if x>xs[0] ] :
switch(
xs == [] and do( [] )
or
do( qs( le ) + [ xs[0] ] + qs( gt ) )
)
)()
)
理屈はほとんど同じです。switch()の中に、
条件式 and do(式1,式2,...)
をorでいくつもつなげていくことができます。最後にすべての 条件式 and do(式1,式2,...) が偽になった時の処理をdo(式1,式2,...)で書きます。
do(式1,式2,...)の中味は順番に評価されます。
その結果がタプルとしてswitch()に渡され、タプルの最後の値が返ります。
あるいは、
見た目気にしなければこれでいいんじゃね?
qs=(lambda xs :
(lambda
le = [x for x in xs[1:] if x<=xs[0] ] ,
gt = [x for x in xs[1:] if x>xs[0] ] :
(
xs == [] and ( [], )
or
( qs( le ) + [ xs[0] ] + qs( gt ) ,)
)[-1]
)()
)
何してるかよくわからないけど、すっきりしていてむしろ漢気を感じる。書くとき[-1]とかコンマとか忘れそう。いや絶対忘れる...
コメント
コメントを投稿