编程语言
首页 > 编程语言> > 使用Python的漂亮打印Lisp

使用Python的漂亮打印Lisp

作者:互联网

有没有办法在Python中漂亮地打印Lisp风格的代码字符串(换句话说,一堆平衡的括号和文本)而无需重新发明轮子?

解决方法:

简短的回答

我认为合理的方法是,如果可以的话,是生成Python列表或自定义对象而不是字符串,并使用pprint模块,如@saulspatz所建议的那样.

答案很长

整个问题看起来像是XY-problem的一个例子.为什么?因为你使用Python(为什么不是Lisp?)来操作表示生成的Lisp风格代码的字符串(为什么不是数据结构?),其中Lisp风格被定义为“一堆括号和文本”.
对于“如何漂亮印刷?”的问题,我将回复“I wouldn’t start from here!”.
除了使用现有的车轮之外,不用重新发明车轮的最佳方法是坚持简单的输出格式.

但首先,为什么你需要漂亮的印刷?谁会看看结果代码?

根据您使用的确切Lisp方言和代码的预期用法,您可以非常不同地格式化代码.例如,考虑文本的换行符,缩进和最大宽度. Common Lisp pretty-printer特别发展,我怀疑你想要具有相同级别的可配置性.
    如果您使用Lisp,对pprint的简单调用可以解决您的问题,但您使用的是Python,因此暂时坚持使用最合理的输出,因为漂亮的打印是一种蠕虫.

如果您的代码适用于人类读者,请:

>不要在自己的行上放置右括号
>不要垂直对齐打开和关闭括号
>不要在左括号之间添加空格

这很难看:

 ( * ( + 3 x )
     (f 
        x
        y
     )
 )

这个更好:

(* (+ 3 x)
   (f x y))

或者干脆:

(* (+ 3 x) (f x y))

See here了解更多详情.

但在打印之前,您必须解析输入字符串并确保其格式正确.由于你如何生成表单,也许你确定它是格式良好的,但我认为打印机应该忽略它而不是做太多的假设.如果你通过漂亮的打印机传递一个由Python对象代表的AST而不仅仅是字符串,这将更容易,如评论中所建议的那样.您可以构建数据结构或自定义类并使用pprint(python)模块.如上所述,如果您可以更改生成Lisp样式代码的方式,那么这似乎是您的理由.

对于字符串,您应该处理任何可能的输入并拒绝无效的输入.
这意味着检查括号和引号是否平衡(小心转义字符)等.
实际上,您不需要真正构建用于打印的中间树(尽管它可能对程序的其他部分有帮助),因为Lisp样式的代码由易于嵌套的表单组成,并使用前缀表示法:您可以从左到右扫描输入字符串,并在看到括号时打印(打开括号:递归;关闭括号,从递归返回).当你第一次遇到一个未转义的双引号“,读到下一个”,…
这与简单的印刷方法相结合,可满足您的需求.

标签:python,pretty-print,lisp,s-expression
来源: https://codeday.me/bug/20190706/1398273.html