AScript中一个很有意思的语法
我们来看一个示例1 var s 2 static int n 10; // 直接执行不参与编译 3 static x n * 2; // 直接执行不参与编译 4 int y static n * 2; // 编译结果y 20 5 /* 6 int m20; 7 int a static m * 2; // 报错variable m is not exists 8 */ 9 int z n * 2; // 编译结果z n * 2 10 xyz; 11 ; 12 var script new Script(); 13 // 编译 14 var func script.Compileint(s); 15 Assert.AreEqual(10, script.Context.EvalVar(n)); 16 Assert.AreEqual(20, script.Context.EvalVar(x)); 17 Assert.IsNull(script.Context.EvalVar(y)); 18 Assert.IsNull(script.Context.EvalVar(z)); 19 // 执行 20 Assert.AreEqual(60, func());static语句中的变量必须是在static语句中定义的由于变量n、x是在static语句中定义的脚本执行前就已经计算出结果了上面示例编译结果为1 int y 20; 2 int z n * 2; 3 xyz;那么基于static语法的特性我们可以在哪些场景中使用呢场景一eval函数在之前一篇文章《AScript之eval函数详解》中介绍过eval函数的功能和运行机制。1 int n10; 2 var sn20; 3 eval(s); // 结果为20如上示例在编译执行模式下计算结果并不是我们预期的30我们使用static语法试试1 int n10; 2 static var sn20; 3 eval(static s); // 结果为30结果是预期的30了我们可以在static语句中对字符串进行拼接处理然后给到eval来执行。场景二编译委托1 string s 2 static { 3 min10; 4 max5; 5 } 6 n min n max 7 ; 8 var script new Script(); 9 script.Context.SetVar(min, 20); 10 script.Context.SetVar(max, 50); 11 var func script.Compileint, bool(s, n); 12 int total 0; 13 for (int i 0; i 10000; i) 14 { 15 if (func(i)) total; 16 } 17 Assert.AreEqual(26, total);我们可以利用static语法的特性在脚本中做一些初始化逻辑比如从数据库中获取配置等。实现原理最后我们来看看static语法是如何实现的吧1 public class StaticTokenHandler : ITokenHandler 2 { 3 public static readonly StaticTokenHandler Instance new StaticTokenHandler(); 4 5 public void Build(DefaultSyntaxAnalyzer analyzer, TokenAnalyzingArgs e) 6 { 7 e.IsHandled true; 8 if (e.TreeBuilder.IsFullStatement()) 9 { 10 e.End true; 11 e.TokenReader.Push(e.CurrentToken); 12 return; 13 } 14 var options e.Options; 15 // 如果当前为编译模式则改为使用执行模式 16 if ((options.CompileMode?? ECompileMode.None) ECompileMode.All) 17 { 18 options new BuildOptions(e.Options) { CompileMode ECompileMode.None }; 19 } 20 var node analyzer.BuildOneStatement2(e.BuildContext, e.ScriptContext, options, e.TokenReader, e.Control, e.Ignore, noblock: true); 21 if (node ! null !e.Ignore) 22 { 23 // 执行并返回结果 24 var v node.Eval(e.ScriptContext, options, e.Control, out var type); 25 e.TreeBuilder.AddData(e.BuildContext, e.ScriptContext, e.Options, e.Control, PoolManage.CreateObjectNode(v, type)); 26 } 27 } 28 }然后在CSharpLang中注册 AddTokenHandler(static, StaticTokenHandler.Instance); 几行代码就实现了一个有意思语法。说点什么

相关新闻

为什么 Linux 要用“挂载”?而不是直接显示 C 盘、D 盘?

为什么 Linux 要用“挂载”?而不是直接显示 C 盘、D 盘?

一、引言为什么 Linux 要用挂载?而不是像 Windows 一样直接显示 C 盘、D 盘?刚开始学 Linux 的时候,很多人都会遇到一个很奇怪的问题:我插了一个 U 盘,为什么系统里不会像 Windows 一样直接多出来一个 E 盘、F 盘&…

2026/6/26 6:12:49阅读更多 →
2026鞋服行业洗牌加速:3个信号决定企业生死 | 服装ERP选型指南

2026鞋服行业洗牌加速:3个信号决定企业生死 | 服装ERP选型指南

导语: 2026年,中国鞋服行业正经历一场结构性重组。市场从增量扩张全面转入存量竞争,"淘汰赛"与"培育期"并存。多位行业专家指出,60%-70%的纺织服装企业面临营收与利润双双下滑,而头部品牌却在逆势…

2026/6/26 6:12:49阅读更多 →
抖音带货痛点与AI解决方案

抖音带货痛点与AI解决方案

抖音带货的全链路痛点,做过的都有共鸣:人工调研慢、数据不准,跨部门协作衔接不畅;选品缺乏依据,库存易积压或短缺,供应商风险难预判;内容产出低效,公域投放 ROI 不佳,私域…

2026/6/26 6:12:49阅读更多 →
15款降AIGC平台实测:千笔AI稳坐首选宝座

15款降AIGC平台实测:千笔AI稳坐首选宝座

如今 AI 写作工具普及,知网、Turnitin 等平台的 AI 检测规则持续收紧,论文 AI 率超标已经成为学生、科研工作者投稿、答辩前的头号障碍。市面上的降 AI 率工具质量参差不齐,降重效果、平台适配性、内容安全性差距极大。我们对 15 款主流中英文…

2026/6/26 12:44:53阅读更多 →
3步解决网易云音乐插件管理难题:BetterNCM Installer终极指南

3步解决网易云音乐插件管理难题:BetterNCM Installer终极指南

3步解决网易云音乐插件管理难题:BetterNCM Installer终极指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否厌倦了手动下载、安装和更新网易云音乐插件&#xff1f…

2026/6/26 12:44:53阅读更多 →
Ghidra逆向工程工具:Linux系统终极安装与配置指南

Ghidra逆向工程工具:Linux系统终极安装与配置指南

Ghidra逆向工程工具:Linux系统终极安装与配置指南 【免费下载链接】ghidra_installer Helper scripts to set up OpenJDK 11 and scale Ghidra for 4K on Ubuntu 18.04 / 18.10 项目地址: https://gitcode.com/gh_mirrors/gh/ghidra_installer 想要探索逆向工…

2026/6/26 12:44:52阅读更多 →
AI伦理使用指南:守住事实、价值与语境三大判断权

AI伦理使用指南:守住事实、价值与语境三大判断权

1. 项目概述:这不是一个工具教程,而是一份“人机协作伦理操作手册”“The Ethical ChatGPT User”——这个标题乍看像一本轻量级指南,但在我过去三年深度参与AI产品设计、教育场景落地和企业内容合规审核的实践中,它实际指向一个被…

2026/6/26 12:44:52阅读更多 →
2026更新版!AI论文写作工具深度测评与推荐

2026更新版!AI论文写作工具深度测评与推荐

2026年真正好用的AI论文写作工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …

2026/6/26 12:44:52阅读更多 →
claude code vue skills技能编写 linux版

claude code vue skills技能编写 linux版

全局通用技能目录&#xff08;所有项目可用&#xff09;# 创建全局技能根目录 mkdir -p ~/.claude/skills # 新建第一个示例技能&#xff1a;代码解释 mkdir -p ~/.claude/skills/explain-code # 写入标准 SKILL.md 模板 cat > ~/.claude/skills/explain-code/SKILL.md <…

2026/6/26 12:39:49阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM&#xff0c;WorkFlow&#xff0c;Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1&#xff09;LLM2&#xff09;Prompt3&#xff09;Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件&#xff1a;从原理到实战的深度解析在嵌入式系统开发中&#xff0c;图形用户界面&#xff08;GUI&#xff09;的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台&#xff0c;嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/26 4:15:25阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”&#xff0c;而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时&#xff0c;第一反应可能是&#xff1a;又一个免费额度&#xff1f;领完就完事&#xff1f;我亲手试过——这300美金根本不是红包&#xff0c;而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

一、前言&#xff1a;企业运维痛点与资源价值自博通收购 VMware 之后&#xff0c;原 VMware 公开免费下载渠道全面关闭&#xff0c;企业运维人员想要获取适配 HPE 慧与服务器的 ESXi 9 原厂镜像&#xff0c;必须注册博通账号、绑定有效授权才能下载&#xff0c;无授权账号无法获…

2026/6/26 0:02:15阅读更多 →
Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin作为一门现代编程语言&#xff0c;与Java的互操作性一直是其核心优势之一。为了让Kotlin代码能够无缝对接Java&#xff0c;Kotlin提供了多种注解来优化互操作体验&#xff0c;其中JvmStatic和JvmField是两个关键注解。它们分别用于解决静态成员和字段在Java中的访问问题&…

2026/6/26 0:02:15阅读更多 →
深入解析musl libc中的mmap实现源码

深入解析musl libc中的mmap实现源码

最近在阅读musl libc源码时&#xff0c;发现其mmap的实现非常精妙&#xff0c;特分享给大家。 一、代码整体结构 这段代码实现了__mmap函数&#xff0c;并通过weak_alias导出为mmap。这是典型的musl libc风格——提供弱符号以便用户可以重写。 weak_alias(__mmap, mmap); 二…

2026/6/26 0:02:15阅读更多 →