FORA/教程
FORA教程是使用FORA编程语言的实用指南。它通过使用示例来演示一些简单程序的开发,从而教会读者。每个示例都引入了新的功能,因此,通过掌握这些示例,一位称职的技术人员将准备好应对更高级的项目。
假设读者具有逻辑思维能力和基本的数字能力。熟悉C、Python或Java等语言将有所帮助,因为FORA与这些语言类似。理解面向对象编程很有用,但不是必需的。示例以简洁的自文档编程风格编写,易于理解。避免使用编程“技巧”,因为结果通常会导致难以维护的代码。
FORA提供了一个平台来开发程序,这些程序可以动态扩展以使用所有可用的计算机资源来执行复杂的计算。如果您拥有一个32核的CPU,那么FORA程序将动态地使用尽可能多的核心来最小化其运行时间。类似地,在云环境中,计算可以在多台刀片计算机之间分配。因此,与等效的C程序相比,使用FORA代码可以更快地解决许多问题。
FORA解释器动态编译代码,因此执行效率与用C编写的程序类似,但使用解释器进行开发比使用编译器快得多。因此,FORA允许比传统语言更快地开发和修改数学模型。
FORA程序是一系列FORA语句,通常存储在硬盘上。程序可以引用库中的FORA模块。通常,程序开发为一组模块。每个模块都以交互方式进行测试,然后作为模块安装到库中。标准FORA虚拟机有两个文本编辑器,适合编写FORA代码
- "gedit"是一个基于屏幕的编辑器,可从“应用程序/附件”菜单中获得。
- 可以使用同一菜单中的终端访问旧版“vi”编辑器。
作者更喜欢使用“vi”。
标识符名称遵循标准的编程约定。示例使用“驼峰式命名法”风格,使代码更易于理解。在FORA中,所有标识符都是对象,它们在使用时会被动态类型化。内置函数提供字符串和基本整数类型之间的强制转换。下表说明了它是如何工作的。
代码 | 动态对象类型 | 强制转换函数 |
---|---|---|
a=1 | Int64(带符号64位整数) | a=Int64("123") |
a=1s32 | Int32 | a=Int32("123") |
a=1s16 | Int16 | a=Int16("123") |
a=1s8 | Int8 | a=Int8("123") |
a=1u64 | Uint64(无符号) | |
a=1u32 | Uint32 | |
a=1u16 | Uint16 | |
a=1u8 | Uint8 | |
a=true | Uint1 | |
a="Hello" | String | a=String(123) |
a=1.0 | Float64 | |
a=1.0f32 | Float32 | |
a=1.0; a=1 | 最终Int64 | |
a=fun(x){x*x} | 函数 | |
a=(1,2) | Tuple(Int64,Int64) | |
a=(1,'Fred') | Tuple(Int64,String) | |
a=[1,2,3] | Vector(Int64) | |
a=[1,'Fred'] | Vector(AnyConstant) | |
a=['Fred'] | Vector(String) |
FORA“类型”解释命令返回任何作用域内FORA对象的类型。
FORA在支持它的硬件上默认使用64位整数。在许多系统中,64位算术比32位计算慢。在优化模块代码时,使用适当的整数大小通常会带来性能优势。
FORA支持以下运算符
运算符类别 | 支持的运算符 |
---|---|
算术 | +,-,*,/,%,** |
比较 | ==,!=,>,<,>=,<= |
连接 | + |
赋值 | = |
按位 | ,^,<<,>> |
逻辑 | and,or,not |
优先级 | (,) 作为匹配对 |
块 | {,} 作为匹配对 |
运算符含义和优先级遵循行业标准。
在标准FORA VM上,从“应用程序/附件”菜单打开一个终端窗口。
然后输入“fora”加载解释器。
您现在可以输入您的第一行FORA代码作为“println("Hello World")”。FORA内置函数print和println提供基本的控制台输出,主要用于程序测试。
您已经编写并测试了您的第一行FORA代码,并且应该看到类似于图像的结果
使用您喜欢的文本编辑器创建文件hello.fs作为hello程序的源文件。它应该包含FORA语句“println("Hello World")”。然后将文件保存到磁盘。
在另一个终端窗口中输入“fora hello.fs”。
您的第一个FORA程序已运行,您应该看到类似于图像的结果
本教程从hello.fs开发greet.fs,并使用一个简单的函数来个性化我们的程序。
使用您喜欢的文本编辑器,根据图像代码创建greet.fs。
打开另一个终端窗口,并在交互模式下运行FORA解释器以测试greet函数。
它工作正常,因此按Control-D退出FORA解释器。
您现在有一个包含源代码的窗口和一个使用FORA解释器的窗口。更改您的源代码以使用澳大利亚的“G'day”,而不是英文的“Hello”。现在点击向上箭头键,它会显示最后一个命令。按Enter键测试您的代码更改。您拥有一个简单有效的测试环境。
现在 greet 函数已经过测试,我们可以将其包含在一个经过测试的例程库中。默认情况下,FORA 会在当前目录中搜索扩展名为 .fora 的模块库。我们将把我们的库命名为 tutorial.fora,并在当前目录中创建此文件 (mkdir tutorial.fora)。
我们将 greet.fs 复制到库中,并将函数声明更改为适合模块函数,并进行相应的文档说明。
现在,我们使用不同的 FORA 选项从模块库运行 greet 函数。首先,我们使用 -e 选项来评估表达式;在本例中为函数调用语句。然后,我们使用不带任何选项的交互方式运行解释器。最后,我们使用 -i 选项运行 FORA 源文件 base.fs(如下所示)并交互式地测试模块。按 Control-D 退出。
此程序展示了一个简化编码和节省输入的巧妙技巧。
迭代器和迭代器函数是 FORA 语言的一个非常强大的功能。本教程使用一个简单的示例来展示如何使用这些功能。
迭代器函数被重复调用以返回值,直到它完成。潜在地,函数可能永远不会结束,因此它可以被视为当前值和由尚未返回的值组成的尾部。返回值是迭代器。迭代器通常与以下结构一起使用
for 迭代器 in 迭代器函数 { 函数 }
首先,我们编写一个迭代器函数 sequence(start,end) 以返回范围 start 到 end 中的所有整数。默认情况下,范围为 1 到 5。我们创建了一个名为 seq.fora 的文件,如下所示,并将其保存到磁盘。
yield 语句将迭代器返回给调用方。
我们加载 FORA 解释器并使用 "for 迭代器 in 迭代器函数" 结构来测试我们的代码。
现在代码已经过测试,我们将其添加到 tutorial.fora 中。将来,它将被访问为 tutorial.sequence,并且文件 seq.fora 应该被删除。
现在,我们将 sequence 程序修改为从文件中读取行。readFile 迭代器函数将文件名作为参数。该函数直接使用 Python 文件访问原语,以及局部变量。创建一个包含所示代码的文件 rd.fora。
我们解释新功能。
- 在函数内部,let 指令将标识符绑定到其存储位置,并且必须在第一次引用标识符时使用。
- Python 的 open 函数将文件链接到 PythonObject。使用 'rb' 或 'wb' 进行读取或写入。
- size 函数返回字符串中的字符数。
- Python 的 readline 函数读取下一行文本(包括换行符)来自链接到文件的 PythonObject。在文件末尾,将返回一个零长度字符串。
由于测试程序是非平凡的,因此我们创建了一个文件 rdTest.fs 并使用 FORA 交互式地测试该函数。
我们解释测试程序。
- 文件名是硬编码的,因此我们不必在每次测试时都输入它。列出此简短测试程序的源代码就足够了。请注意,由于此代码以交互方式运行并且不是函数,因此不应使用 let 指令。
- 打印标题行并初始化行计数。
- 调用迭代器函数以返回文件中的每一行。每一行都按如下方式处理。
- 打印行号以及行内容。请注意,由于每一行都以 EOL 字符结尾,因此使用 print 而不是 println。
- 最后,println 整洁地完成列表。
请注意,我们使用 '-i' 编译器选项以交互方式运行 FORA 解释器。
作为一项技术练习,更改 rdTest.fs 以将行号打印为一个零填充的 3 位数字字段。提示:需要替换第 5 行。
现在 readFile 函数已经过测试,可以将其作为经过测试的函数添加到模块 tutorial.fora 中。然后应该删除 rd.fora。