2

ドメイン固有言語を Python のスーパーセットとして構築したいと考えています。次のような不可解なコマンド

f7:10y=x^2

タイピングを最小限に抑えるように設計されたものは、プレーンな Python に解析されます。

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

実行される前に。おそらく、コマンドライン インターフェイスは IPython になるでしょう。

適切なアーキテクチャは何でしょうか: IPython コマンドライン シェルまたはそのカーネル デーモンで暗号からプレーンへの Python 変換を実装する必要がありますか? 役立つライブラリ / チュートリアル / サンプルはありますか?

またはより一般的に: Python に複雑な構文糖衣を追加する方法の例はありますか?

4

2 に答える 2

1

どこでも機能するソリューションは、ここでは実際にはオプションではありません。あなたが達成しようとしているのは、Python パーサーのコアを変更することです。

オプションは次のとおりです。

  1. プリパーサーを使用します。IPython 内には、これに使用できるフックがあります: http://ipython.org/ipython-doc/dev/config/inputtransforms.html

    ユースケースの例を次に示します。

    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)
    
  2. 変更を加えて Python を再コンパイルする

  3. Rubyのように、この点でより柔軟な言語を使用してください

于 2014-12-03T16:50:09.437 に答える
1

PyPy を使用すると、これはかなり簡単に実行できます。文法ファイルに何かを追加するだけで完了です。

例を次に示します: https://bitbucket.org/adonohue/units/src/bb1b20dd739f73fe495723d24cd266b67549f5c9/unitPython/patches?at=default

これにより、unitsライブラリは次のようなことを行うことができます:

print(2cm / 0.5 s)
-> 4.0 cm / s
于 2014-12-03T15:27:45.907 に答える