2014-12-03 4 views
2

파이썬의 수퍼 세트로 도메인 특정 언어를 만들고 싶습니다. 입력을 최소화 할 수 있도록 설계파이썬 위에 도메인 특정 언어를 구문 분석하는 방법은 무엇입니까? IPython과 어떤 아키텍처가 필요합니까?

f7:10y=x^2 

같은 크립 틱 명령이 실행되기 전에 일반 파이썬

for k in range(7,10): 
    f[k].set_y(expr='x^2') 

로 해석해야한다. 아마도 커맨드 라인 인터페이스는 IPython이어야한다.

적절한 아키텍처는 무엇입니까? IPython 명령 줄 셸이나 해당 커널 데몬에서 암호화되지 않은 Python 변환을 구현해야합니까? 유용한 라이브러리/튜토리얼/예제가 있습니까?

이상 : 파이썬에 복잡한 구문 설탕을 추가하는 방법에 대한 예가 있습니까?

답변

1

모든 곳에서 작동하는 솔루션이 정말로 여기에 옵션을 선택하지 않습니다

다음은 예입니다. 달성하고자하는 것은 파이썬 파서의 핵심을 수정하는 것입니다.

옵션은 다음과 같습니다

  1. 가 preparser를 사용합니다. IPython 내에서 사용할 수 훅이 거기에 있습니다 : 여기

    http://ipython.org/ipython-doc/dev/config/inputtransforms.html이 사용 사례에 대한 예입니다 : 당신의 수정

  2. 사용이 점에서 더 유연 언어와

    import re 
    
    range_search = re.compile(''' 
        (?P<variable>.+) 
        (?P<start>\d+):(?P<stop>\d+) 
        (?P<k>[^=]+)=(?P<v>.+) 
    ''', re.VERBOSE) 
    
    range_replace = '''for k in range(\g<start>, \g<stop>): 
        \g<variable>[k].set_\g<k>(expr='\g<v>')''' 
    
    print range_search.sub(range_replace, 'f7:10y=x^2') 
    
    @StatelessInputTransformer.wrap 
    def inline_loop(line): 
        return range_search.sub(range_replace, line) 
    
  3. 다시 컴파일 파이썬 루비 같은 모양

+0

마지막 두 옵션은 내 응용 프로그램 컨텍스트에서 제외됩니다. 필자는 적절한 사전 작성자 (prepser)와 IPython과 통합하는 방법을 물을 의도였습니다. –

+0

@ JoachimWuttke : 추가 된 예보기 – Wolph

1

PyPy를 사용하면이 작업이 상당히 쉽습니다. 문법 파일에 몇 가지를 추가하면됩니다. https://bitbucket.org/adonohue/units/src/bb1b20dd739f73fe495723d24cd266b67549f5c9/unitPython/patches?at=default

는 그것은 units 라이브러리가이 같은 일을 수행 할 수 있습니다 :

print(2cm/0.5 s) 
-> 4.0 cm/s 
+0

고맙습니다. @ Wolph. 좋아 보인다. 이제 누군가 내 질문에 IPython 통합에 대해 조언 할 수 있는지 여부, 제 2 부 질문을 기다립니다. PyPy가 쉘이나 커널에 들어가겠습니까? –

+0

필자는 이것을 테스트하지는 않았지만이 작업을하기 위해 사용자 정의 Pypy 설치 내에 IPython을 간단히 설치할 수 있다고 가정합니다. – Wolph

+0

이제는 PyPy가 CPython의 최상위에 있지는 않지만 다른 자유도 (예 : Cython으로의 마이그레이션)를 막을 수있는 Python의 대체품이라고 생각합니다. 따라서 정확하게 내가 원하는 해결책은 아닙니다. –