그동안 파이썬은
조건 표현과
과 with절같이
문법을 바꿔달라는 수 많은 사용자들의 요청을 받아들여 문법을 추가한 사례가
여럿 있기는 했지만, switch-case나 for-from-to 같이 디자인 상의
일관성 문제로 인해서 받아들여지지 않은 문법도 많이 있었습니다.
요즘 계속 영역-특정적 언어(Domain-specific Language)에 대한 사용처가
늘고 있는데 파이썬을 특정 목적에 쓰자면 종종 대형 프로젝트에서는 문법을
고치는 게 득이 될 경우도 많이 생각할 수 있습니다.
그래서 전처리기를 사용해서 쓰는 방법도 있지만, python4ply는 이걸 좀 더
깔끔한 방법으로 처리하기 위해 등장했습니다.
나온지는 꽤 오래되었지만, 갈 수록 중요한 변환점을 찍은 모듈로
지속적으로 언급되고 있습니다.
원래 PLY는 파이썬에서 lex/yacc를
지원하기 위한 파서 제너레이터인데, python4ply는 PLY에서 파이썬을 파싱하고
그걸로 파이썬 바이트코드를 생성해서 직접 파이썬 코드 파싱/컴파일을 만들었기 때문에
그 부분을 직접 조절할 수 있도록 했습니다.
예를 들면 튜토리얼에서 예제로 들고 있는 것에서 이런 문법도 보여주고 있습니다.
1 2 3 4 5 6 7 8 |
<span class="c"># 2진법으로 끊어쓰기</span> <span class="n">amount</span> <span class="o">=</span> <span class="mf">0</span><span class="n">b1_0011_0001_0010_1101_0000_0001</span> <span class="k">print</span> <span class="s">"You owe me"</span><span class="p">,</span> <span class="n">amount</span><span class="p">,</span> <span class="s">"dollars"</span><span class="sb">``</span> <span class="c"># 펄식 정규식 연산자</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">open</span><span class="p">(</span><span class="s">"nucleosome.pdb"</span><span class="p">):</span> <span class="k">if</span> <span class="n">line</span> <span class="o">=~</span> <span class="n">m</span><span class="o">/</span><span class="p">(</span><span class="n">ATOM</span> <span class="o">|</span><span class="n">HETATM</span><span class="p">)</span><span class="o">/</span><span class="p">:</span> <span class="n">count</span> <span class="o">+=</span> <span class="mf">1</span><span class="sb">``</span> |
파싱과 컴파일을 모두 건드리고 있으니 문법은 원한다면 얼마든지 바꿀 수 있는데,
python4ply는 소스 구조도 아주 깔끔하게 잘 정리되어 있는 편이라, DSL을 만들어야
하는 상황이라면 언제나 유용하게 쓸 수 있을 듯 합니다.
사실 python4ply가 나온 이후로 python-dev 메일링에 누군가 새로운 문법 뭔가 좀
넣어달라, 또는 파이썬 3에 2.x호환성 좀 넣어달라 요청만 올라오면 python4ply
URL을 누군가 덥썩 던져주고서는 그 다음부터는 무시하는 분위기가 됐지요. :>
누구나 어렵지 않게 할 수 있을 거라고 생각하고 있던거지만, 실제로 구현이 되고나니
영향을 꽤 많이 미치고 있는게 역시 가능하다고 생각만 하고 있는 것과 실제 구현체가
나온 것은 영향력이 차이가 좀 있군요.
와~ 재밌는 장난감 발견 🙂
소개해주셔서 감사합니다~