どさにっき(アナログ) 〜2010年10月上旬〜

by やまや
<< = >>

2010年10月3日(日)

Lisp like Evaluation

_ あなごるさん。Lisp な S 式表記の四則演算をしてみましょう。

_ すでに突っ込まれてるように、問題に不備があって題意を正しく実装すると正解にならないし、出力が小さすぎるのでマジメに解くより解答を即値で埋めこんだ方が小さくできておもしろくない。問題に不備がなく埋め込みできないサイズだったとしても、sh なら lisp の処理系を呼ぶだけだからなおさらおもしろくない(すでに bash で30バイトの解を投稿してる人がいるが、たぶんスクリプト側で不備を修正して lisp を呼びだす、という内容だと思う)。

_ ので、あなごるとは無関係に解いてみる。sh (bash) で。

sed 's,(,$(echo ,g;s,),|(read a b;bc<<<${b// /$a })) ,g;s,*,\\*,g'>>$0
m4<<_
あなごるではサイズ節約のためたいてい最終行の改行は省略するが、これは改行必須。(+ 1 2) のような S 式を $(command + 1 2 ...) の形に書き換えてるだけ。書き換えかたが変態だが。しかも、スクリプトが自分自身に追記するという変態的動作をする。ただし、各行末尾に不要な空白が入る。m4 を "tr -d \ " または "awk NF=1" に変えれば空白も消える。

_ 自己追記をしないバージョンはこっち。改行不要。末尾空白が入るのは同じ。

sed 's,(,$(echo ,g;s,),|(read a b;bc<<<${b// /$a })) ,g;s,*,\\*,g;1im4<<_'|sh
やってることは同じ。生成したスクリプトを自分自身に追記して同一プロセス内で実行するか、別プロセスにパイプで渡して実行するかの違いだけ。

cd -

_ tips - 君はpushd|popdを知っているか?

たいていの「上に行きたい場合」というのは単に「元いたところに戻りたい」なのでこれで間に合うし
うーん。「元いたところに戻りたい」なら pushd/popd じゃなくて、それこそ cd じゃね?
% cd -		# 直前にいたディレクトリに戻る
ディレクトリ変更はかならずシェルの内部コマンドなので(ちゃんと理由があるのでわからない人は考えてみよう)シェルによって挙動がビミョーに異なるけど、たいていのシェルで cd - は使える。pushd/popd と違って複数のディレクトリをスタックに積んではくれないけど、たいていの「元いたところに戻りたい」場合というのは単に「2つのディレクトリを行ったり来たりしたい」なので、移動したディレクトリの履歴をいくつも覚えておく必要はほとんどない。

_ それはそうと、

alias cd="pushd"
ふつー引数なしで cd を叩くとホームディレクトリへの移動だけど、引数なしの pushd はディレクトリスタックの表示。このエイリアスは引数なしのときの挙動が変わってキモい。これまで cd で済んでたことが、このエイリアスを使うと cd ~ とタイプ数が増えてしまってめんどくさくないかしらん。慣れちゃえばいいのかもしれんけどさ。


<< = >>
やまや