2

我想构建一种特定于领域的语言作为 Python 的超集。神秘的命令,如

f7:10y=x^2

旨在最小化类型的应被解析为纯 Python

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

在被执行之前。可能,命令行界面应该是 IPython。

什么是合适的架构:我应该在 IPython 命令行 shell 或其内核守护进程中实现从隐秘到普通的 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 回答