在python上构建语言。

pydialect的Python项目详细描述


pydialect使python成为一个语言平台,即racket。它提供了 管道,允许在python中创建编译成python的方言 在导入时。

python语言的扩展不需要进入python核心, 或者甚至希望将包含到python核心中,以便有用。

以函数和语法宏为基础,定制语言本身 是程序员在更高层次上提取模式的又一个工具。 因此,除了语言实验之外,这种扩展还可以作为 允许较短和/或更可读的程序的框架。

pydialect把语言创造的力量放在用户的手中,而不是 需要尽最大努力来破解cpython本身或从头实现 编译成python ast或字节码的自定义语言。

pydialect致力于创建扩展python和外观的语言 类似于python,但扩展或修改其语法和/或语义。 因此方言

也就是说,pydialect本身只是一个轻量级的基础设施挂钩,它使 定义和使用方言很方便。实现实际的语义 对于你的方言(所有有趣的事情都发生在这里),你可以 想看看[macropy](https://github.com/azazel75/macropy)。例如 在[unpythonic](https://github.com/Technologicat/unpythonic)中发现;请特别参阅 宏(约占unpythonic的一半)。关于包装一套 把语义学定义成pydialect,看下面的例子 在pydialect分布中。

使用方言的模块示例:

from __lang__ import lispython

print("hello, my dialect is {}".format(__lang__))

c = cons(1, 2)
assert tuple(c) == (1, 2)
assert car(c) == 1
assert cdr(c) == 2
assert ll(1, 2, 3) == llist((1, 2, 3))

x = let[(a, 21) in 2*a]
assert x == 42

x = letseq[((a, 1),
            (a, 2*a),
            (a, 2*a)) in
           a]
assert x == 4

a = lambda x: cond[x < 0, "nope",
                   x % 2 == 0, "even",
                   "odd"]
assert a(-1) == "nope"
assert a(2) == "even"
assert a(3) == "odd"

def fact(n):
    def f(k, acc):
        if k == 1:
            return acc
        f(k - 1, k*acc)  # implicit return in tail position, like in Lisps
    f(n, acc=1)
assert fact(4) == 24
fact(5000)  # automatic TCO, no crash

square = lambda x: x**2
assert square(3) == 9
assert square.__name__ == "square"  # lambdas are auto-named

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
验证Java验证用户输入的一系列数字   java如何在SpringBoot中字段验证失败时在ConstraintViolationException中获取RequestParam名称   java如何解决Vertx阻塞DNS问题   java意外类型平均值   java如何将dataframe的UUID列转换为包含相同十六进制序列的简单字符串?   身份散列映射的java用法   java无法在eclipse中导入现有项目   进程从运行的java程序中获取CPU号   java将文本视图的特定行滚动到顶部在最后一个屏幕上不起作用   无法初始化java SpringSecurityFilterChain   java当我在项目中使用volatile时,为什么下面的代码显示不同的结果?   是否有转换java的标准方法。util。函数,消费者<T>转换为java。util。作用函数<T,Void>   java nginx分块传输编码失败   java如何将几个IF转换为一个循环   java URI从路径中删除/删除