使用Python的漂亮打印Lisp

马克斯·马里什(Max Malysh)

有没有一种方法可以在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python漂亮打印库

来自分类Dev

(漂亮)在Common Lisp中打印大对象

来自分类Dev

python pdb自动漂亮打印

来自分类Dev

python漂亮的打印简单如果

来自分类Dev

Lisp在一行上打印漂亮的对象

来自分类Dev

python中的漂亮多项式打印

来自分类Dev

如何“漂亮地打印” python熊猫DatetimeIndex

来自分类Dev

漂亮的打印多项式与字典python

来自分类Dev

漂亮的打印多项式与字典python

来自分类常见问题

如何使用Go漂亮地打印JSON?

来自分类Dev

在TextArea中使用vkbeautify漂亮打印结果

来自分类Dev

Jackson JSON 使用注释漂亮地打印

来自分类Dev

读取LaTeX表达式并使用python将其漂亮地打印为ASCII

来自分类Dev

如何使用lxml和python漂亮地打印xml文件的子树?

来自分类Dev

使用漂亮的汤和python打印重音符号和外来字符

来自分类Dev

Python漂亮的列表打印字典,缩写长列表

来自分类Dev

用python的gdb漂亮打印递归结构

来自分类Dev

将漂亮的打印表解析为Python对象

来自分类Dev

如何在Python中漂亮地打印CSV文件

来自分类Dev

从命令行漂亮地打印Python字典

来自分类Dev

自定义python对象的漂亮打印__str__

来自分类Dev

在Python中漂亮地打印字典矩阵

来自分类Dev

如何在Python中漂亮地打印CSV文件

来自分类Dev

从命令行漂亮地打印Python字典

来自分类Dev

在GDB中使用漂亮的打印机遍历链接列表

来自分类Dev

使用Jackson库的定制漂亮打印机

来自分类Dev

使用免费的monad和GADT进行漂亮的打印

来自分类Dev

使用Rook时如何使JSON响应漂亮地打印?

来自分类Dev

仅当漂亮打印时才坚持使用2种布局