当前位置: 首页 > news >正文

跟我一起学“仓颉”编程语言-宏练习题

一、练习题

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) }

二、小结

本章为大家详细的介绍了仓颉编程语言中宏练习题的内容,下一章,为大家带来网络通信三剑客的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉服务端开发有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

http://www.rkmt.cn/news/1484144.html

相关文章:

  • UniApp小说阅读小程序源码:含云数据库、章节管理与多端适配
  • CESM2安装避坑指南:从‘fatal: unable to access’到成功创建Case,我解决了哪些网络与配置问题?
  • 用C# Winform手搓一个ModbusRTU调试助手(附完整源码)
  • Webpack Bundle Size Analyzer:终极Webpack打包大小分析工具完全指南
  • 从I2C到I3C:一根中断线(INT)的消失,如何改变了物联网传感器的设计哲学?
  • 快速上手Jinan_AICC/flaubert_base_cased:3分钟完成法语文本特征提取
  • 别再乱升级了!Jupyter Notebook里遇到IProgress报错,试试这个环境隔离的解法
  • 告别双边滤波的卡顿:用OpenCV的guidedFilter函数5分钟搞定图像去噪与边缘保持
  • Kali Linux下用Docker一键部署ARL灯塔:新手避坑与快速启动指南
  • Synapse ML:统一调度多框架的AI工程中枢
  • 完整指南:在PyTorch中部署Swinv2-base-patch4-window12-192-22k模型的最佳实践
  • 别再被MicroLIB坑了!手把手教你为N32G45X串口打印配置标准C库printf
  • Mermaid Live Editor深度实战:5步掌握高效图表可视化工具
  • OptiScaler终极指南:让任何显卡都能享受DLSS级画质提升的免费神器
  • Python中文词云开发全流程:从清洗分词到业务加权可视化
  • 跟我一起学“仓颉”编程语言-网络编程练习题
  • Polygon Shredder技术解析:Three.js实现GPU粒子模拟的10个核心技巧
  • SAP MM配置避坑指南:手把手教你设置BP与供应商编码自动同步(含Same Number选项详解)
  • Webpack Bundle Size Analyzer核心原理:深入解析依赖树分析算法
  • 基于深度学习的 YOLOv11 目标检测与轴承缺陷质量控制轴承缺陷识别 (轴承数据集+模型+界面))
  • 洛雪音乐音源:一站式免费音乐聚合终极方案
  • 2026年别墅朗盛门窗靠谱吗 - 品牌宣传支持者
  • 保姆级教程:在Windows上用ESP-IDF 4.3给ESP32开发板烧录第一个闪灯程序
  • 当你的模型‘偏科’时怎么办?深入解读多分类任务中的Precision与Recall权衡
  • AI2.0 【Embedding】嵌入模型 20260608
  • 5分钟快速上手:免费在线图表编辑器的终极完整指南
  • 多维聚合中的数据操纵:超越GROUP BY的结构重塑技术
  • 基于CNN和小波变换的图像去噪算法研究
  • OpenCV 2.4.13 全组件源码包:含文档、示例、跨平台CMake构建配置
  • Godot-FirstPersonStarter核心组件解析:MovementController工作原理深度剖析