元的概念
在文档的开篇我们介绍过,青语言的核心参考了Lisp语言,这是一门古老而又优雅的语言。
接下来我们要学习的内容涉及到的是Lisp中核心的特性——同像性和元编程
前面的文档中介绍了,青语言中提供了6种基本的数据类型。事实上,这6种这是在程序运行期使用到的数据类型。
在运行期之前,解释器还需要做的一件事就是把代码文本转换为解释器可以识别的语法元素,这个过程我们称为解析期。解析期同样会产生数据元素,那么这些数据元素就不仅限于上面提到的6种基本的数据类型了。
于是我们有了 同像性 的概念,也就是代码本身就作为数据进行存储,本质上和我们代码中使用的数据没有什么区别。
如果我们在运行期像操作数据一样,操作代码本身,那么我们就能够实现高度动态的程序逻辑,我们称其为——元编程。
元编程十分优雅且灵活,但对于大部分开发者来说,这样的特性难以掌握且容易造成一些意外的情况,所以当前主流的编程语言大多没有使用这样的特性。
由于参考了Lisp的语言核心,青语言可以完全实现元编程,但出于简化语法的考虑,我们在大部分情况下,屏蔽了这样的操作。但还是在一些情况下会使用到同像性的特性。
这里我们来了解2种青语言解析期和运行期存在对应关系的数据类型:
1、代码中的【】在解析期会转换为方块类型,在运行期会对其求值,那么就会得到数组类型
2、代码中的{}在解析期会转换为大括号类型,在运行期会对其求值,那么就会得到对象类型
我们知道,在很多语句中,我们会使用{}作为代码块,但它只会作为语句的一部分,我们没有办法单独操作它。而如果{}独立存在,又会被转换为对象。
这样,正常情况下,我们没有办法在运行期获取到大括号类型的数据,但有时我们需要获取它作为一个代码块,这个时候我们就需要使用到一个关键字——元
在编写代码时,可以在任意表达式前加上关键字元,那么在解析期会对后面的这个表达式进行一层封装,再在运行期将其还原回来。于是,我们可以通过下面的方式在运行期获取代码块:
#变量 = 元 { …… }
这样我们就可以通过变量持有这个代码块了。
通常我们在定时任务和多任务中通过这种方式来传递代码块,我们在之后的文档中学习它的使用方法。