シェルワンライナー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}