Lambdaカクテル

京都在住Webエンジニアの日記です

Common Lispでマサワダを生成します

wwsmawaa

こんばんは。id:Windymeltです。「masawada Advent Calendar 2019」22日目です。昨日はid:kazuhi_raさんの『受肉するmasawadaさん - かずひらの日記』でした。ついに3Dモデルの領域を越えて現実にその姿を現わしたid:masawadaさん。彼はこの混沌とした世界を救う救世主となるのでしょうか。それとも、世界に破滅をもたらす悪党なのでしょうか。受肉した身体は二分されているようですが、今後の活躍に期待したいですね。

aaawssmw

冬になりCommon Lispが美味しい季節になってきましたね。今回は新鮮なCommon Lispでmasawadaを作っていこうと思います。

今回はstring-randomでmasawadaをやっていくことにします。PerlにおけるString::Random、 そしてこれを継承したString-random.jsといったライブラリをご存知でしょうか。 ふだん我々が正規表現を利用するとき、文字列がある正規表現にマッチするかどうかを判断したいわけですが、このstring-randomという名前を冠したライブラリは、 正規表現を与えるとそれにマッチするような文字列を返してくれるというハイ・テックなツールなのです。 今回これでmasawadaという文字列を生成していきたいと思います!

sadmamaw

えーではライブラリを探してみましょう。ありませんね。というわけでライブラリを作っていきましょう。

github.com

既につくりおきしておいたライブラリがこちらになります。どのように実装しているのでしょうか?

なんとCommon Lispの正規表現ライブラリであるcl-ppcreは正規表現をパースしてS式のASTを出力することができるのですが、これにパターンマッチを施して実際にマッチするような文字列を動的に挿入していきます。 ある正規表現にマッチする文字列をいきなり生成するのは大変ですが、正規表現の各構成要素は単純なので簡単に出力できます。 例えば*は直前の文字を0回以上繰り返せばよいので、ランダムな数を決めてその分だけ文字を繰り返して結合する、といった具合です。

mmamsmms

こうして完成したmasawadaさんがこちらになります。

(ql-dist:install-dist "http://dist.ultralisp.org/"
                      :prompt nil)
(ql:quickload :cl-string-random)
(use-package :cl-string-random)

(string-random "[masawada]{8}")
asmaaadw

ちょっと迫力に欠けていて物足りないですね。趣向を凝らしてみましょう。

 (string-random "([mswd]a){4}")
"damasama"

ダマ様になりましたね。尊称でもあるdameにも似た響きを持つ、高貴な律動です。ノートルダムのあのダムです。よりシンプルな正規表現ではどうでしょうか。

 (string-random "([a-z]a){4}")
"eaxaqara"

もはや発声不能。動機は仮。存在不明。生存可能。われわれの皮膚に白く光るのは浪飛沫の足跡か、それとも涙の残滓なのか。 平成が壊しながら押し固めてきたものを洗い流しきれないまま令和という新時代を迎えてしまった日本。我々はどこへと向かうのでしょう?

くりかえす時代の中でたゆたう儚い存在である我々。masawadaが生まれるまでループさせてみましょう。

(loop for s =(string-random "([mswd]a){4}")
  do (format t "~C~A" #\return s)
  do (force-output)
  do (sleep 0.01)
  until (string= s "masawada"))

Image from Gyazo

来年も良い年になるといいですね。明日はid:polamjagさんです。