pyfl输出:简单副作用的魔力

2021-06-08 22:08:08

正如我已经解释的那样,我已经发明并实施了一个实验功能语言 - Pyfl(基于Python的功能语言) - 尝试一些想法。

例如,pyfl具有一组完整的可变绑定运算符(VBOS),其使用线性ASCII形式来表示传统数学的Sigma符号等构造。例如,以下添加了前20个方格

在前一篇文章中,我描述了Pyfl方法的输入,与Haskell的笨重的IO Monad相比,纯粹的功能,纯粹是纯粹的功能,纯粹的功能,并且琐碎地实现。 (顺便说一句,我对Monads或Haskell没有任何反对,我只是对Haskell Io Monad的印象没有印象)。

这次我会谈论pyfl的输出方案。它刻破了三个盒子中的两个盒中的两个 - 它简单且容易实现。这是一些输出(YEP,Pascal的三角形)。我将在这篇文章结束时显示该计划。

不幸的是,我不能声称pyfl输出是功能的。它无耻地导致副作用。我只是不知道如何做得更好。

一个简单的交互式程序将说明该点。在加拿大的公元前在一个阶段,您必须是一定的(不同的)年龄,预约Covid射击。这个pyfl程序询问您的名称和年龄并告诉您您是否符合条件。

查询=如果年龄> 40然后输出(名称^',您符合条件!')否则输出(名称^'对不起,您没有资格。')fi;' =输入('您的姓名:');年龄=输入(名称^'您的年龄请:')

当评估查询时,程序将提示您的姓名,然后,通过名称来解决您的名称,提示您的年龄,然后告诉您您是否符合资格。 (克拉符号站在pyfl for string constenation。)

评估时,“函数”输出打印其参数,这通常是一个字符串。这是一个简洁的副作用。我们也可以辩论输入是否调用副作用,但重要的是它们易于使用和实施。并且由于调用采取函数调用的形式,因此它们可以嵌入在诸如if-weash-fi和vbos的pyfl构造中。

输入和输出的参数可以是任何表达式。它们不一定是字符串常数。特别地,它们可以涉及以前的输入值,如上所述。

还有一个更原始的输出'函数'即输出,但输出通常是优选的,因为它将字符串引号从其字符串参数中传出,如输入。

输出伪函数可以嵌入在Pyfl构造中,如VBOS,Lambda表达式,IF-WEAL-FI等。这是一个打印前10个方格和多维数据集的表的程序:

RES = IN范围(1,10)所有输出(i)&&&产出('')&&产出(i * i)&&产出('')&&输出(i * i * i)&&输出(' \ n')&& ''结尾;

(运营商&&评估其副作用的第一个参数,并丢弃结果。)

结果不是很好。我们没有排队的列。幸运的是,我们可以做得更好。使用Python作为实现语言的优势之一是我们可以以某种方式访问​​所有功能。特别是Python基于具有“孔”的格式字符串具有相当复杂的输出格式系统,用于数据。在Pyfl中,您可以使用另一个输出伪功能Outputf。第一个参数是一个带孔的格式字符串,剩余的参数是将在孔中切入孔的数据项。格式字符串已记录好,对我们有关的是字符串'{:5d} {:5d} {:5d} {:5d} \ n'。

结果要好得多。现在数字在五个字符宽的列中排列。

Python格式化字符串也可以自然地处理浮点数。假设我们想打印前十个整数的广场和多维数据集根,但只想显示四位有效数字。这是完整的程序

这是它的输出(我会在底部的空字符串稍后处理)。这里没有必要进入Python格式字符串的详细信息,因为它们在其他地方良好记录。

列中的打印数字是一件事,但制作三角形有点难得更难 - 没有内在的内容涵盖的Python格式化字符串。相反,我们必须使用Pyfl的计算能力来生成适当的副作用。

SCC(L)= TL(m)!= [] m = l< [0] fby tl(m); k =高清(m); pk = 0 fby k; n = k + pk; n = [] fby n :: n;结果= n :: n; end; tri = i< 18 l = [1] fby scc(l); i = 1个FB输出(SP(35-(宽度(l)div 2))&&输出(Strlist(L))&&输出(' \ n')&&我+ 1;结果= L&& '&#39 ;;结束; sp(j)= IN范围(1,j)所有' '结尾; // j spaceswidth(l)= sumfor h在l中所有w(h)+1端-1; strlist(l)= in in l all str(h)^' '结束; w(h)= 1 +(log10(h)div 1);

函数SCC的第一个清晰度定义了生成成功的三角形行的计算,其中包括作为列表的给定行。因此,SCC([1])是[11],SCC([11])是[11],SCC([11])是[1 3 3 1]等。是的,这是一段时间循环 - 我会在下一个帖子中解释一下,但是让我向你保证你的平均时间是所有合法的,没有副作用。

TRI的下一个定义是另一个循环的另一个定义。 它反复应用SCC从[1]开始,并生成18行的三角形。 它将这些列表转换为字符串并计算其宽度。 随着线条变宽,它会减少左手间距。 我相信现在你相信,就终端来而言,Pyfl可以做任何合理的(输出字符串可以包含控制字符和转义序列)。 然而,我已经获得了教学债务,即(和其他!)循环。 我有一些'拼接去做。 下一篇文章。