当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Inspect.Algebra用法及代码示例


Elixir语言中 Inspect.Algebra 相关用法介绍如下。

一组用于创建和操作代数文档的函数。

该模块实现了"Strictly Pretty" (2000) by Christian Lindig 中说明的函数,并添加了一些小函数,例如对二进制节点的支持和最大限度地利用水平空间的中断模式。

iex> Inspect.Algebra.empty()
:doc_nil

iex> "foo"
"foo"

使用此模块中的函数,我们可以将不同的元素连接在一起并渲染它们:

iex> doc = Inspect.Algebra.concat(Inspect.Algebra.empty(), "foo")
iex> Inspect.Algebra.format(doc, 80)
["foo"]

nest/2 space/2 line/2 函数可帮助您将文档组合成一个刚性结构。但是,当使用 glue/3 group/1 等函数时,文档代数会变得有趣。胶水在两个文档之间插入一个中断。组指示必须适合当前行的文档,否则将中断呈现为新行。让我们用一个 break 将两个文档粘合在一起,将它分组,然后渲染它:

iex> doc = Inspect.Algebra.glue("a", " ", "b")
iex> doc = Inspect.Algebra.group(doc)
iex> Inspect.Algebra.format(doc, 80)
["a", " ", "b"]

请注意,中断按原样表示,因为我们没有达到行限制。一旦我们这样做,它就会被换行符替换:

iex> doc = Inspect.Algebra.glue(String.duplicate("a", 20), " ", "b")
iex> doc = Inspect.Algebra.group(doc)
iex> Inspect.Algebra.format(doc, 10)
["aaaaaaaaaaaaaaaaaaaa", "\n", "b"]

该模块使用字节大小来计算剩余空间。如果您的文档包含字符串,则需要将这些字符串包装在 string/1 中,然后依赖 String.length/1 来预先计算文档大小。

最后,这个模块还包含了 Elixir 相关的函数,有点依赖于 Elixir 格式,例如 to_doc/2

实施细节

Inspect.Algebra 的实现基于Lindig 的 Strictly Pretty 论文,该论文建立在以前的漂亮打印算法之上,但针对严格的语言(例如 Elixir)进行了定制。论文的核心思想是使用显式的文档组,这些文档组被渲染为平面(作为空格的分隔符)或中断(作为换行符的分隔符)。

此实现提供两种类型的中断::strict:flex。当一个组不适合时,所有严格的中断都被视为换行符。然而,每次出现时都会重新评估弯曲断裂,并且可能仍会呈现平坦。有关详细信息,请参阅 break/1 flex_break/1

此实现还添加了 force_unfit/1 next_break_fits/2 ,它们可以更好地控制文档拟合。

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Inspect.Algebra。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。