简化的“;对于循环“;c#中的语法
本文关键字:语法 循环 于循环 | 更新日期: 2023-09-27 17:58:42
我想使用C#来构建一种定制的脚本语言。它将有一些简单的语句,这些语句实际上是带有以下参数的方法调用:
Set("C1", 63);
Wait(1.5);
Incr("C1", 1);
现在,我还想提供一个循环,而索引器的常见C#语法对于这么简单的事情来说太复杂了。例如,我会让这个循环20次:
for (20)
{
Wait(1.5);
Incr("C1", 1);
}
有没有办法实现这样一个简单的循环(例如,在for语句或类似语句中的包装方法调用)
谢谢,Marcel
您可以使用委托和lambda表达式来完成此操作。
For(20, () =>
{
Wait(1.5);
Incr("C1", 1);
} );
private void For (int count, Action action)
{
while (count-- > 0)
action();
}
public static class Loop{
public static void For(int iterations, Action actionDelegate){
for (int i = 1; i <= iterations; i++) actionDelegate();
}
}
示例:
class ForLoopTest
{
static void Main()
{
Loop.For(20, () => { Wait(1.5); Incr("C1",1); });
}
}
创建一个扩展int:的函数
public static class Extensions {
public static void Times(this int n, Action action) {
if (action != null)
for (int i = 0; i < n; ++i)
action();
}
}
称之为:
20.Times(() => {
Wait(1.5);
Incr("C1", 1);
});
让我们理解一下,像这样的脚本代码:
Declare("myVar", "integer");
Set("myVar", "5");
For("myVar"){Say("Hello");}
会被解释成这样:
public class MyScriptInterpreter
{
// ...
protected void forLoop(List<String> Params; List<String> Block)
{
int HowManyTimes = Convert.ToInt16(Params[0]);
for (int k=1; k == HowManyTimes; k++)
{
interpretBlock(Block);
}
}
protected void interpretBlock(List<String> Block)
{
foreach(String eachInstruction in Block)
{
interpret(eachInstruction);
}
}
protected void interpret
(String Instruction, List<String> Params; MyDelegateType MyDelegate)
{
if (Instruction == "declare")
{
this.declare(Params);
}
else if (Instruction == "set")
{
this.set(Params);
}
else if (Instruction == "for")
{
this.forLoop(Params, MyDelegate);
}
}
} // class
所以,for的块变成了一个指令列表,可能是字符串。
无论如何,作为一个额外的答案,我建议在未来考虑将函数(过程、子例程)和名称空间(模块)添加到您的语言中,作为所需的语法。
我知道实施起来有点困难。但是,我看到了很多脚本语言,它们最终被使用,从小代码片段到完整的应用程序,而函数或名称空间的缺乏造成了混乱。
ScriptBegin("FiveTimes");
Declare("myVar", "integer");
Set("myVar", "5");
For("myVar"){Say("Hello");}
ScriptEnd();
PHP就是这个问题的一个很好的例子。与您的脚本一样,已开始用于快速的小型应用程序。最终,添加了函数和命名空间。
祝你的项目好运。