在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