Skip to content

aFun-org/aFunlang

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

aFunlang 编程语言

aFun简介

aFun是一款通用的动态解释型编程语言,具有函数式编程范式和面向对象编程范式。它可以与C语言联动,可以调用C的高效率函数,同时不失编程的抽象性。

aFun的设计哲学

  • 保持简单
  • 和谐统一更优雅
  • 关注做什么而不是怎么做
  • 状态可在运行时被修改
  • 灵活性与安全可以并存
  • 注释和提示信息很重要
  • 计算机的时间比人的时间廉价

保持简单,可以使用更简洁的语法就不使用复杂的方法。

  1. 在编写aFun代码时,可以使用字面量解决的问题就不要使用函数回调;
  2. 尽量为函数添加默认参数,简化函数调用时的参数负担;
  3. 不是编写一个为用户完成所有决定的程序,相反程序应该有更多的参数供用户定制,但是需要一个合适的默认参数。
  4. 扁平胜于嵌套,但若嵌套更能表现意思则应使用嵌套而非扁平。
  5. 变量名应体现具体意思,可以利用符号。如int->strint_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时指定一下参数:

PCRE2_ROOT:PATH=<安装目录>  # 不指定则按默认路径寻找
PCRE2_USE_STATIC_LIBS:BOOL=<是否为静态库>  # 不指定则默认为动态库

FFlags

项目依赖于FFlags库,因此需要提前安装该库,并且在配置CMAKE时指定一下参数:

FFlags_ROOT:PATH=<安装目录>  # 必须指定

dlfcn-win32

windows平台编译时依赖于dlfcn-win32库,因此需要提前安装该库,并且在配置CMAKE时指定一下参数:

dlfcn-win32_ROOT:PATH=<安装目录>  # 不指定则按默认路径寻找