我需要修改
中的数学表达式 wave_y + .3 * sin(time * .788) + .005 * (frame % 3)
到
wave_y + .3 * sin(time * .788) + .005 * fmodf(frame, 3)
为此,我编写了自己的Transformator
class PercentToFmodTransformer(ast.NodeTransformer):
def visit_BinOp(self, node):
if type(node.op).__name__ == 'Mod':
result = ast.Call()
result.func = ast.Name(id='fmodf', ctx=ast.Load())
result.args = [node.left, node.right]
result.keywords = []
result.starargs = None
result.kwargs = None
return result
else:
return ast.NodeTransformer.generic_visit(self, node)
转型后我有Expression
Expression(
body=BinOp(
left=BinOp(
left=Name(id='wave_y', ctx=Load()),
op=Add(),
right=BinOp(
left=Num(n=0.3),
op=Mult(),
right=Call(
func=Name(id='sin', ctx=Load()),
args=[BinOp(left=Name(id='time', ctx=Load()), op=Mult(), right=Num(n=0.788))],
keywords=[],
starargs=None,
kwargs=None)
)
),
op=Add(),
right=BinOp(
left=Num(n=0.005),
op=Mult(),
right=Call(
func=Name(id='fmodf', ctx=Load()),
args=[Num(n=3), Name(id='frame', ctx=Load())],
keywords=[],
starargs=None,
kwargs=None
)
)
)
)
但我不知道如何以人类可读的格式打印它。可以这样做我的默认功能或者我应该为此写自己的访客吗?
P.S。我没有要求为我编写此访问者的实现,我只想知道是否可以通过inbox API执行此操作。