# aFunlang 编程语言 ## aFun简介 aFun是一款通用的动态解释型编程语言,具有函数式编程范式和面向对象编程范式。它可以与C语言联动,可以调用C的高效率函数,同时不失编程的抽象性。 ### aFun的设计哲学 * 保持简单 * 和谐统一更优雅 * 关注做什么而不是怎么做 * 状态可在运行时被修改 * 灵活性与安全可以并存 * 注释和提示信息很重要 * 计算机的时间比人的时间廉价 **保持简单,可以使用更简洁的语法就不使用复杂的方法。** 1. 在编写aFun代码时,可以使用字面量解决的问题就不要使用函数回调; 2. 尽量为函数添加默认参数,简化函数调用时的参数负担; 3. 不是编写一个为用户完成所有决定的程序,相反程序应该有更多的参数供用户定制,但是需要一个合适的默认参数。 4. 扁平胜于嵌套,但若嵌套更能表现意思则应使用嵌套而非扁平。 5. 变量名应体现具体意思,可以利用符号。如`int->str`比`int_to_str`更优雅。 **和谐统一更优雅,在aFun中追求和谐与统一。正是因为这种和谐、统一,令aFun有更少的公理,使得aFun更容易被理解与上手。** 1. 内置对象和非内置对象的地位是相同的,底层实现也是相似的、统一的。 2. if分支、for分支底层都是通过函数实现的,甚至可以添加任意新分支或去除任意分支。 3. 无论是用户拓展的字面量还是基础的字面量(如`int`),都是通过`.afg`文件中正则表达式实现匹配的。 4. 和谐与统一不应仅仅在表面上体现为统一,这往往会造成漏洞。 5. 和谐统一的界面、接口比混乱不堪明显更加优雅。 **关注做什么而不是怎么做,合理的模块化代码,通过OOP将代码分类。同时,使用类库而不是自己造轮子。** 1. 例如,使用`map`函数用于遍历列表,而不是手写一个`for`循环遍历列表。 2. 例如,计算图形面积时,应该为不同图形封装一个类,而不是把所有图形面积计算的代码放在一个函数中。 3. 代码应该抽象,而不总是关注底层。 **状态可在运行时被修改,代码的语义、对象的标识等都可在运行时被修改。** 1. 代码可以生成代码、分析代码、修改代码。 2. 前缀的语义可以在运行时被改变。 3. 对象的类型(如,是否可被继承、是否内联函数)可在运行时被修改。 4. 运行时状态修改有时候会带来灾难,但是一定程度上提高了灵活性。`afc`提供了大量的API供这种运行时状态修改。 **灵活性与安全性并存,灵活性与安全性之间可以有所取舍和偏袒。** 1. 合约、权限限定等都是可选的。 2. 语言的动态性,运行时状态修改为aFun提供了很大的灵活性。 3. `afc`提供的API时aFun灵活性的有力支持。 4. 对象为`afc`提供的API是`afc`运行的有力支持。 5. 一次性任务的代码以及激进的大型项目代码应追求灵活性,而稳定的大型项目的代码应追求安全性。 **注释和提示信息很重要,aFun会保存注释信息,而不仅仅是无视他。** 1. 使用函数前,查阅函数的注释信息。 2. 使用变量、函数前,查阅其合约信息以及权限信息。 3. aFun会将注释信息、合约信息、权限信息处理为一个文本,记录下来。 **计算机的时间比人的时间廉价,编码时应思考问题的解决方案,而不是思考二进制代码。** 1. 为了提供逻辑与思维的便利,可以适度割让一定的效率。 2. 现在对硬件的浪费,在未来或许只是一种寻常事。 3. 与关注做什么而不是怎么做类似,怎么做是计算机的事情,aFun通常提供了高效的实现函数。 ## 项目依赖 ### PCRE2 项目依赖于`PCRE2`库,因此需要提前安装该库,并且在配置`CMAKE`时指定一下参数: ```text PCRE2_ROOT:PATH=<安装目录> # 不指定则按默认路径寻找 PCRE2_USE_STATIC_LIBS:BOOL=<是否为静态库> # 不指定则默认为动态库 ``` ### FFlags 项目依赖于`FFlags`库,因此需要提前安装该库,并且在配置`CMAKE`时指定一下参数: ```text FFlags_ROOT:PATH=<安装目录> # 必须指定 ``` ### dlfcn-win32 在`windows`平台编译时依赖于`dlfcn-win32`库,因此需要提前安装该库,并且在配置`CMAKE`时指定一下参数: ```text dlfcn-win32_ROOT:PATH=<安装目录> # 不指定则按默认路径寻找 ```