import new
def myimport(filename):
mod = new.module(filename)
f=open(filename)
data = tokenize.untokenize(translate(f.readline))
exec data in mod.__dict__
return mod
这要求您处理您的自定义代码不同于普通的 Python 模块
另一个相当简洁(尽管有些粗糙)的解决方案是创建一个自定义编码(参见 PEP 263) ,如 这个配方所示。您可以将其实现为:
# coding: mylang
myprint "this gets logged to file"
for i in range(10):
myprint "so does this : ", i, "times"
myprint ("works fine" "with arbitrary" + " syntax"
"and line continuations")
警告:
预处理器方法存在一些问题,如果您使用过 C 预处理器,那么您可能对此比较熟悉。主要是调试。Python 看到的都是预处理文件,这意味着打印在堆栈跟踪中的文本等将引用该文件。如果您已经执行了重要的翻译,那么这可能与您的源文本非常不同。上面的例子不会改变行号等,所以不会有太大的不同,但是你改变得越多,就越难找出来。
from goto import goto, label
for i in range(1, 10):
for j in range(1, 20):
print i, j
if j == 3:
goto .end # breaking out from nested loop
label .end
print "Finished"
Iii)现在需要添加语句的语义,因为这个需要编辑
Msytmts/langlet.py 并添加 my _ stmt 节点访问者。
def call_my_stmt(expression):
"defines behaviour for my_stmt"
print "my stmt called with", expression
class LangletTransformer(Transformer):
@transform
def my_stmt(self, node):
_expr = find_node(node, symbol.expr)
return any_stmt(CST_CallFunc("call_my_stmt", [_expr]))
__publish__ = ["call_my_stmt"]
Iv)将 cd 转换为 langlet/mystmts 并输入
python run_mystmts.py
现在开始会议,可以使用新定义的发言:
__________________________________________________________________________________
mystmts
On Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)]
__________________________________________________________________________________
my> mystatement 40+2
my stmt called with 42
要达到一个微不足道的陈述需要很多步骤,对吧?目前还没有一个 API 可以让用户不用关心语法就可以定义简单的事情。但是电子工程学是非常可靠的模块化的一些错误。因此,API 的出现只是时间问题,它允许程序员使用方便的面向对象编程来定义方便的东西,比如中缀操作符或小语句。对于更复杂的事情,比如通过构建一个 anglet 在 Python 中嵌入整个语言,没有办法使用完整的语法方法。
jcomeau@intrepid:~/$ cat demo.py; ./demo.py
#!/usr/bin/python -i
'load everything needed under "package", such as package.common.normalize()'
import os, sys, readline, traceback
if __name__ == '__main__':
class t:
@staticmethod
def localfunction(*args):
print 'this is a test'
if args:
print 'ignoring %s' % repr(args)
def displayhook(whatever):
if hasattr(whatever, 'localfunction'):
return whatever.localfunction()
else:
print whatever
def excepthook(exctype, value, tb):
if exctype is SyntaxError:
index = readline.get_current_history_length()
item = readline.get_history_item(index)
command = item.split()
print 'command:', command
if len(command[0]) == 1:
try:
eval(command[0]).localfunction(*command[1:])
except:
traceback.print_exception(exctype, value, tb)
else:
traceback.print_exception(exctype, value, tb)
sys.displayhook = displayhook
sys.excepthook = excepthook
>>> t
this is a test
>>> t t
command: ['t', 't']
this is a test
ignoring ('t',)
>>> ^D
Traceback (most recent call last):
File "zy.py", line 9, in
myfoo(3)
File "zy.py", line 5, in myfoo
print(num)
SystemError: no locals when loading 'print'