AScript之eval函数详解

AScript是一个开源的C#动态脚本解析执行库,内置的eval函数可动态执行字符串脚本,在python脚本中对应的是exec函数。

一、示例

复制代码
1 Console.WriteLine(new Script().Eval("int n=10;eval(\"n+20\")")); // 30
2 Console.WriteLine(new Script().Eval("int n=10;eval(\"n+20\")", ECompileMode.All)); // 30
3 Console.WriteLine(new Script().Eval("int n=10;var s=\"n+20\";eval(s)")); // 30
4 Console.WriteLine(new Script().Eval("int n=10;var s=\"n+20\";eval(s)", ECompileMode.All)); // 20
5 Console.WriteLine(new Script().Eval("int n=10;eval(\"n+=20\");n")); // 30
6 Console.WriteLine(new Script().Eval("int n=10;eval(\"n+=20\");n", ECompileMode.All)); // 30
7 Console.WriteLine(new Script().Eval("int n=10;var s=\"n+=20\";eval(s);n")); // 30
8 Console.WriteLine(new Script().Eval("int n=10;var s=\"n+=20\";eval(s);n", ECompileMode.All)); // 10

为什么第4行输出结果是20,第8行输出结果是10呢?我们来看一下eval函数的运行机制。

二、运行机制

eval函数实际是调用Script中的Eval 方法,使用脚本中的当前编译上下文BuildContext 、数据上下文ScriptContext 和编译选项BuildOptions;

我们把当前脚本当作主干A,把eval中的脚本当作分支A1,分支A1是共享主干A中的上下文和编译选项;

1、在解析执行模式下,可以使用和修改主干A中的变量,分支A1中自定义的变量也可以传递到主干A中。

2、在编译执行模式下又有所不同,分2种场景:

1)参数为字符串常量,此时会将字符串的解析结果合并到主干A中进行编译和执行,不会产生分支A1。

2)参数为变量,由于编译期间无法确定变量的值,无法合并到主干A中进行编译,此时会产生分支A1进行单独编译执行,分支A1只能共享主干A的变量定义,无法共享赋值语句,所以分支A1中的变量n为0,且修改变量值也无法同步到主干中。

eval函数详细实现请参考源码中的AScript.Functions.EvalFunction。

三、总结

如果eval中要使用主干中的变量值,请使用解析执行模式或者参数为字符串常量。


AScript开源地址:https://gitee.com/rockey627/AScript

相关推荐
用户3721574261359 小时前
C# 实现 Excel 单元格保护:锁定公式并允许编辑指定区域
c#·ai编程·编程语言
IT规划师11 小时前
NET10 高并发架构契约与落地实现
架构·.net
公子小六14 小时前
基于.NET的Windows窗体编程之WinForms数据持久化(1)
windows·microsoft·c#·.net·winforms
三雷科技15 小时前
第6章第4节:自定义分词器
开发语言·c#
Jeff-Tsai16 小时前
Day 16:JSON-RPC 2.0:协议选型与请求管道
.net·架构设计·erp·definition-driven
zhanghaha131416 小时前
C# 系列教程_12 字符串 string 保姆级系统教程(面向新手,大量示例 + 原理讲解)
开发语言·数据库·c#
IT规划师17 小时前
Redis 数据类型全解 - Stream 深度:Pending 回收、重试死信与消息队列选型(十一)
redis·.net
Coder_Shenshen1 天前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
学以智用1 天前
ASP.NET MVC5(.NET Framework)底层完整运行逻辑
.net
寂寞的船2 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene