Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題135

問題135 Lispの括弧の整合性の確認

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

全然わからなかった。かっこの対の扱いは難しい。

解答例は

cat sample.lisp | perl -anle '$b=qr/\((?:(?>[^()]+)|(??{$b}))*\)/; /defun/ && !/^$b$/ && print $F[1]'

となる。perl正規表現を理解するのに手間取った。\*1*\)の一番外側はエスケープしたかっこの対になっている。その次(?: ...)となっている対は「または」(A|B)を表すための対だ。そして次の(?>...)は中の正規表現が一度マッチしたらもうそれ以上別の解釈は考えないという意味だ。(?>...)の中の正規表現はここではかっこ以外の文字列を表している。

*1:?:(?>[^()]+)|(??{$b}