在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如何将jasper集成到jhipster项目中   java无法忽略lombok注释   关于tomcat日志的java问题   java@Autowired未设置字段>NullPointerException   GUI提交按钮不工作   java气泡和选择排序   java如何编写规则来匹配两个数组?   java如何找出某个字符在字符串中的第一次、第二次或第三次出现?   java通过字符串引用id   javascript在网络视图中加载在线图表   java保留web应用程序中用户更改的日志   在安卓中尝试使用Mandrill SMTP发送电子邮件时出现java错误   用java语言将a2b4c5等字符串转换为AABBCCCCC的程序是什么?   java无需TODO即可删除所有注释   java JMX MBean在应用程序部署时自动注册   java如何使用JSON解析从任何url解析数据   java@transactional注释类使用代理包装,但未创建事务   JavaFx转换和打印