Home > プログラミング > wake で遊ぶ

wake で遊ぶ

shinhさんの作った言語 wake がゴルフ場に入ったので遊んでみたのだけど… まだ言語の癖が分かっておらずプログラム書くのが難しい.

とりあえず最初の方の問題の permutator を sed のプログラムから移植してみた.

元のsedプログラムはこんな感じ:

s/.*/:&%/
:
s/\(.*\)\(:.*\)\(.\)%\(.*\)/\1\2%\3\4\n\1\3\2\4%/gm
s/\(.*\):%$\|.*:%.\+\n/\1/gm
t

で,移植したwake のプログラムはこんな感じ:

:!$<%
(.*)(!.*)(.)%(.*):$1$2%$3$4 $1$3$2$4%
.*!%.+:
(.*)!%:"$1\n"

元のプログラムが s コマンドしか使っておらず,かつ,置換ができなくなるまで繰り返すだけなので,wake プログラムもほとんど同じ構造.s コマンドを明記しない分とエスケープが多く無いことなどによりコードサイズも縮んだ.

sed だとレコードの切れ目を改行で表現して m オプションで一気に処理するけれど,wake だと右辺のスペースでレコードぶった切って処理してあげる形になるのね.これに気づかず右辺に空白入れないとこうなる:

:!$<%~
([^~]*)(![^~]*)([^~])%([^~]*)(.*):$1$2%$3$4~$1$3$2$4%$5
[^~]*!%[^~]+~(.*):$1
([^~]*)!%~(.*):"$1\n"$2

全部に付いている (.*) が明らかに無駄.ここは別処理なのでスペースで切っておくべし.

嵌りどころ:空文字列をマッチしたグループを右辺にそのまま使用する場合,最初のルールに":$<"とか書いておくと無限ループする.

さて,次は何をやろうかね.

★下記に2つの英単語をスペースで区切って入力してください

Home > プログラミング > wake で遊ぶ

Search
Feeds

Page Top