有没有一种方法可以在Python中漂亮地打印Lisp风格的代码字符串(换句话说,就是一串平衡的括号和文本),而无需重新发明轮子呢?
我认为,如果可以的话,一种合理的方法是生成Python列表或自定义对象而不是字符串,并使用@saulspatz建议的pprint模块。
整个问题看起来像是XY问题的一个实例。为什么?因为您正在使用Python(为什么不是Lisp?)来操纵表示生成的Lisp样式代码的字符串(为什么不是数据结构?),所以Lisp样式定义为“一堆括号和文本”。对于“如何漂亮打印?”这个问题,我会回答“我不会从这里开始!” 。除了使用现有的轮子之外,最好不要重装轮子的最佳方法是坚持简单的输出格式。
但是首先,为什么要打印漂亮的东西?谁将看结果代码?
根据您使用的确切的Lisp方言和代码的预期用途,您可以将代码的格式设置为非常不同的格式。例如,考虑一下换行符,缩进和文本的最大宽度。在Common Lisp的美化打印机是格外进化,我怀疑你想有可配置的同一水平。如果使用Lisp,一个简单的调用pprint
可以解决您的问题,但是您使用的是Python,因此请坚持使用最合理的输出,因为漂亮的打印是一堆蠕虫。
如果您的代码是供人类读者使用的,请:
这很丑:
( * ( + 3 x )
(f
x
y
)
)
这个更好:
(* (+ 3 x)
(f x y))
或者简单地:
(* (+ 3 x) (f x y))
但是在打印之前,您必须解析输入字符串并确保其格式正确。由于您生成表格的方式,也许您确定它的格式正确,但是我认为打印机应该忽略这一点,而不要做太多的假设。如果将漂亮的打印机传递给Python代表的AST(而不是字符串),这会更容易,如注释中所建议。您可以构建数据结构或自定义类,然后使用pprint(python)模块。如上所述,如果可以更改生成Lisp样式代码的方式,这似乎是您要解决的问题。
使用字符串,您应该处理任何可能的输入并拒绝无效的输入。这意味着要检查括号和引号是否平衡(当心转义符),等等。实际上,您不需要真正构建用于打印的中间树(尽管它可能对程序的其他部分有所帮助),因为Lisp-样式代码由易于嵌套且使用前缀表示法的形式组成:您可以从左到右扫描输入字符串,并在看到括号时根据需要打印(打开括号:递归;关闭括号,从递归返回)。当您初次遇到未转义的双引号时"
,请阅读下一个双引号,"
...再加上简单的打印方法就可以满足您的需求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句