帮助识别Python模块(预处理器?) "python -m dg
在这张图片的背景中 你可以看到一些代码,看起来像是用一种扩展的Python方言写的。要把它处理成“正常”的Python代码,需要用“python -m dg”这个命令。谷歌上没有关于“python -m dg”的搜索结果,而yandex.ru上只有一页缓存,简要提到一个例子。
python -m dg <<< 'sum $ map int $ str 2 ** 1000'
这个似乎相当于
sum(map(int, str(2**1000)))
你知道这到底是怎么回事吗?我想看看这个工具,但找不到任何链接……
4 个回答
3
-m
这个标志在使用python
时是用来指定一个模块dg.py
的。(你可以试试输入python -m this
,这就相当于在python命令行中输入import this
。)
看起来dg.py
是一个用来解释某种自定义语言的工具。你图片的上半部分看起来像是用这种"dg
"语言写的代码片段。它是在KDE环境下运行的,并且似乎使用了Qt库。不过我在网上找不到相关的信息。
4
真有趣——不过,正如其他回答所说,这是一种完全不为人知的语言。你是怎么在那张截图的背景中找到它的?我不得不在GIMP里调亮图片,才能明白你在说什么。
这个语言的语法有点像Python——它用__init__()
来初始化对象,而且似乎有类似Python的for
循环(不过这里好像只用在整数上?)——但它也借鉴了其他语言的很多特点:
- 像Ruby那样的
do
…end
来表示代码块的开始和结束。 - 从Smalltalk和Ruby中,方法的参数直接用空格分开,而不是用标点符号来分隔。
- 这个语言似乎无法处理
a.b.c
这种写法,尽管从1970年左右C语言发布以来,运算顺序都是从左到右的。相反,这个奇怪的语言让你必须写成{a.b}.c
,除非我在这里误解了什么特殊情况。 - Lambda函数使用括号和箭头。
- 正则表达式在语法中有直接支持,使用
r/.../
的格式。
对于那些看不清图片的人,这里有一段代码片段,展示了以上五个特性(这些特性出现在大括号内的一层深处,我们看不到大括号的开始):
def __init__(self parent: nil) do
{super}.__init__ parent;
self.setLayout {QGridLayout};
transform = (t) -> {r/([^>])\n/.sub '\]<br />' t};
for c in (0 4) {self.layout}.setRowStretch c 1;
for c in (0 3) {self.layout}.setColumnStretch c 1;
{self.layout}.addWidget {QLabel {transform self.text}} 1 1;
{self.layout}.addLayout {
sublayout = {QHBoxLayout};
sublayout.addWidget {QLineEdit};
sublayout.addWidget {QPushButton '<…Russian text…>'};
return sublayout;
} 2 1;
{self.layout}.addWidget {QLabel {transform self.footer}} 3 1;
end;
我大胆猜测这个语言是直接编译成C++的,因为在这个漂亮的语法下,我看不到任何需要动态语言的东西。
4
dg是一种自定义语言,它可以转换成CPython 3.4(或更新版本)的字节码。
项目的GitHub链接是:https://github.com/pyos/dg