仓颉开发之——宏(18)
一 概述
- 宏的简介
- Tokens+quote
- 语法节点
- 宏实现
- 内置编译标记
二 宏的简介
2.1 概念
- 宏是一种特殊的函数
- 宏的输入和输出都是程序本身
- 在调用宏时使用 @ 加上宏的名称
2.2 示例
1-定义
1 | macro package define |
2-使用
1 | import define.* |
三 Tokens+quote
3.1 Token
1 | let tk1 = Token(TokenKind.ADD) // '+'运算符 |
说明:
- Token为用户可操作的词法单元
- Token 可能是标识符、字面量、关键字或运算符
3.2 Tokens
1 | Tokens() // 构造空列表 |
说明:
- 一个 Tokens 由多个 Token 组成的序列
- 宏操作的基本类型是 Tokens,代表一个程序片段
3.3 quote
1 | let tks = Tokens(Array<Token>([ |
说明:
- 直接构造和拼接 Tokens 会比较繁琐
- quote 表达式来从代码模版来构造 Tokens
- 插入的表达式 $(...)的类型需要支持被转换为 Tokens
四 语法节点
4.1 语法树
- 代码(词法分析)=>Tokens,Tokens(语法解析)=>语法树
- 语法树的节点可能是一个表达式、声明、类型、模式等
4.2 节点解析
- 使用解析表达式和声明的函数
- 使用构造函数进行解析
4.3 quote 插值语法节点
1 | var binExpr1 = BinaryExpr(quote(x + y)) |
五 宏实现
5.1 非属性宏
1 | @MacroName func name() {} // Before a FuncDecl |
5.2 属性宏
1 | // Macro definition with attribute |
六 内置编译标记
1 | func test1() { |
说明:
- @sourcePackage() 展开后是一个 String 类型的字面量,内容为当前宏所在的源码的包名
- @sourceFile() 展开后是一个 String 类型的字面量,内容为当前宏所在的源码的文件名
- @sourceLine() 展开后是一个 Int64 类型的字面量,内容为当前宏所在的源码的代码行
七 思维导图
五 参考
- 仓颉官方文档—宏
- 仓颉编程语言入门教程