当前位置: 首页 > 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.jsqmd.com/news/972411/

相关文章:

  • EMO-Ai-7b-Q8_0-GGUF性能优化:10个技巧提升AI推理速度
  • 用C# Winform手搓一个ModbusRTU调试助手(附完整源码)
  • OpenFPGA编译踩坑全记录:从GTK3到TBB,手把手解决CMake那些报错
  • 从I2C到I3C:一根中断线(INT)的消失,如何改变了物联网传感器的设计哲学?
  • Webpack Bundle Size Analyzer:终极Webpack打包大小分析工具完全指南
  • 从配置到代码:hf_mirrors/wuhaicc/openai_gpt参数调优与高级功能详解
  • 快速上手Jinan_AICC/flaubert_base_cased:3分钟完成法语文本特征提取
  • 传统工科生的数据科学突围:工程问题驱动式学习法
  • SQL Server视图用错反成坑?聊聊通过视图插入、更新数据那些容易翻车的细节
  • 跟我一起学“仓颉”编程语言-网络通信三剑客
  • 如何快速上手免费离线OCR工具:Umi-OCR完整使用指南
  • 别再乱升级了!Jupyter Notebook里遇到IProgress报错,试试这个环境隔离的解法
  • 告别双边滤波的卡顿:用OpenCV的guidedFilter函数5分钟搞定图像去噪与边缘保持
  • CacheP2P社区贡献指南:如何参与开源项目并改进P2P缓存技术
  • 完整指南:在PyTorch中部署Swinv2-base-patch4-window12-192-22k模型的最佳实践
  • Kali Linux下用Docker一键部署ARL灯塔:新手避坑与快速启动指南
  • 跟我一起学“仓颉”编程语言-UDP协议网络编程
  • Synapse ML:统一调度多框架的AI工程中枢
  • 3种方法使用nli-distilroberta-base-v2:sentence-transformers vs HuggingFace vs OpenMind
  • 从协议到代码:用Python/CANoe模拟ISO15031 OBD $02服务,自动解析车辆冻结帧数据
  • 手把手教你逆向分析数美滑动验证码:从JS断点到参数全解析(附避坑指南)
  • 亿级流量系统高可用架构设计实践
  • 别再被MicroLIB坑了!手把手教你为N32G45X串口打印配置标准C库printf
  • Python通达信数据解析三步法:从本地文件到实时行情的无缝衔接
  • Mermaid Live Editor深度实战:5步掌握高效图表可视化工具
  • 跟我一起学“仓颉”编程语言-TCP协议网络编程
  • 终极指南:从Nano Colors快速迁移到Picocolors的5个简单步骤
  • 如何用abcjs在5分钟内将文本乐谱变成专业五线谱
  • OptiScaler终极指南:让任何显卡都能享受DLSS级画质提升的免费神器
  • 终极指南:如何一键重置Cursor试用限制,告别“试用账户过多“错误