一、练习题1. 定义一个可以获取非递归函数的修饰符、函数名、函数参数和函数体的宏。// 宏包 macro package Study.define // 导包 import std.ast.* public macro GetFunction(input: Tokens) { var data let funcDecl FuncDecl(input) // 获取函数修饰符列表 let funcModifiers funcDecl.modifiers for (funcModifier in funcModifiers) { data 函数修饰符: ${funcModifier.dump()}\n } let funcName funcDecl.identifier data 函数名: ${funcName.value}\n // 获取函数参数列表 let funcParams funcDecl.funcParams for (funcParam in funcParams) { data 参数名: ${funcParam.identifier.value}, 参数类型: ${funcParam.paramType.toTokens()}\n } // 获取函数体 let funcBody funcDecl.block.nodes for (body in funcBody) { data 函数体: ${body.toTokens()}\n } quote($(data)) }package Study // 导包 import Study.define.* import std.ast.* let data GetFunction func jieCheng(num: Int64) { var result 1 for (i in 1..num) { result * i } result } main () { println(data) }2. 定义一个可以获取类中变量构造函数普通函数的宏。// 宏包 macro package Study.define // 导包 import std.ast.* public macro GetClass(input: Tokens) { var data let classDecl ClassDecl(input) for (body in classDecl.body.decls) { if (body is VarDecl) { data 变量: ${body.toTokens()}\n } if (body is PrimaryCtorDecl) { data 主构造函数: ${body.toTokens()}\n } if (body is FuncDecl) { let funcDecl (body as FuncDecl).getOrThrow() if (funcDecl.identifier.value init) { data 普通构造函数: ${body.toTokens()}\n } else { data 普通函数: ${body.toTokens()}\n } } } quote($(data)) }package Study // 导包 import Study.define.* import std.ast.* let data GetClass class User { User(var name: String, var age: Int64){} init(name: String) { this.name name this.age 18 } init(age: Int64) { this.name 钝子生 this.age age } func show() { return 你好 } } main () { println(data) }二、小结本章为大家详细的介绍了仓颉编程语言中宏练习题的内容下一章为大家带来网络通信三剑客的内容。最后创作不易如果大家觉得我的文章对学习仓颉服务端开发有帮助的话就动动小手点个免费的赞吧收到的赞越多我的创作动力也会越大哦谢谢大家