Fun 语言简介

Fun 是一种易学易用的支持面向对象和函数式特性的结构化命令式编程语言. Fun 的语法非常简单清晰, 主要语法来自 Ada 语言, 为了简洁, 适当的做了一些改变. 语法主要从以下几个方面着重考虑, 多用英文关键字(虽然实际上也支持中文关键字, 但不提倡用中文编程. Fun 选用的关键字都是优先考虑最常用的, 即使英文基础不高, 也完全不是问题), 少用符号, 易读易写易修改. Fun 是纯粹的块结构语言, 除了命令, 其他全部是块结构(甚至取消了一行 if 的用法). 块之间任意嵌套, 不做限制, 也就是你可以在 if 里面声明函数或者类, 任意的. Fun 支持常见的控制结构. Fun 支持异常处理, 用法比较像 Delphi, 只不过同时支持 "except" 和 "finally". Fun 是一种动态类型语言, 类型无需声明, 类型之间在需要的时候自动转换, 当然 Fun 也提供了显式转换功能. Fun 支持基于类的单继承面向对象功能, 支持少量的运算符重载. Fun 支持函数式用法, 用法跟 Lisp 和 Javascript 差不多. Fun 实现了一个非常简单高效的垃圾回收器, 程序员无需关心内存释放问题. Fun 支持 Perl 兼容的正则表达式, 处理文本非常方便. Fun 的基础结构是一种类似于 Lisp 的表, 用来支持各种数据结构, 如数组, 字典等.

控制结构

Fun 选用类 Ada 语言的控制结构语法. 用过 Ada 语言的人就会知道, Ada 式语法非常简单清晰, 易读, 易于输入, 易于修改. Ada 语言算是 Pascal 语言的进化版, 比如去掉了 Pascal 里面不合理的分号分隔用法, 改为分号结束(初学 Pascal 的人几乎一定会在这个地方载跟头, 就像初学 C 的人也几乎一定会在 = 和 == 这个地方载跟头一样). Fun 修改了少数几个地方, 目的也是为了更清晰易读易输入, 比如将 "when ... =>" 改为 "when ... do", 增加了 "while ... do" 和 "for ... do", 等. Fun 的异常处理主要来自于 Delphi, 做了些增强, 让 "except" 和 "finally" 可以同时用. 因为是动态类型, 所以去掉了 "on", 如果程序员需要判断处理, 可以用 "case" 替代.

变量

Fun 是一种命令式语言, 变量算是一种核心概念, 程序通过修改变量的值来修改程序的执行状态(纯函数式语言则不同, 完全无需变量, 程序流程相当于一连串函数串联起来). Fun 语言的变量是动态类型的(不是无类型), 声明时无需声明类型, 类型取决于变量的值, 同一个变量取不同的值, 其类型也不同. 变量在不同的地方使用, 需要做类型转换时会自动转换, 程序员也可自行转换. Fun 的变量值修改, 只能在单一语句中完成(也叫做命令), Fun 不支持类 C 的 ++/-- 或者表达式中的 = 赋值功能.

函数

Fun 是一种过程化语言, 支持传统的模块化编程. 函数可以定义在任何块结构中, 其作用域与变量作用域完全相同(实际上, 函数名跟变量完全等价, 在函数式编程的介绍里面会看到).

面向对象

Fun 是一种面向对象编程语言, 支持基于类的单继承和多态特性. 支持有限的运算符重载.

函数式编程

Fun 是一门函数式编程语言, 支持 first-class 和 higher-order 函数. Fun 也支持匿名函数, 闭包和 currying.

数据结构

Fun 内置了一个简单的方便的列表, 看起来像是数组, 字典, hash 表等. 类似的名词可以包括: 集合, 列表, 数组, 关联数组, hash, map, 字典等等. 在 Fun 语言里面这些全是同一个东西, 甚至函数, 类, 对象等全是.

正则表达式

Fun 支持 Perl 兼容的正则表达式(PCRE).

代码示例

Hello World

?. 'Hello, Fun!'; ?. 'Hello, world!';

输出自身的代码

var s = `var s = `$s`; ?. s.eval();`; ?. s.eval();

一行 Fun 语言示例

use 'lib-base.fun'; //Python: print('\n'.join([' '.join(["%2s x%2s = %2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)])) forE(9, (i){?.forE(i, (j){?,'%s*%s=%2s'.format(j,i,i*j)})}); //Python: print([x[0] for x in [(a[i][0], a.append([a[i][1], a[i][0]+a[i][1]])) for a in ([[1, 1]], ) for i in range(30)]]) forE(30, (i,s){?.s[0];?.s[1];s[0]+=s[1];s[1]+=s[0]}, [0,1]);

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。