我想使用C#来构建自定义脚本语言。它将具有简单的语句,实际上是带有以下参数的方法调用:
Set("C1", 63);
Wait(1.5);
Incr("C1", 1);
现在,我想提供一个循环,并且索引器的常用C#语法对于这么简单的事情来说太复杂了。例如,我要循环20次:
for (20)
{
Wait(1.5);
Incr("C1", 1);
}
有没有办法实现这样一个简单的循环?(例如for语句中的包装方法调用等)
谢谢,Marcel
答案 0 :(得分:7)
您可以使用delegates和lambda表达式来完成。
For(20, () =>
{
Wait(1.5);
Incr("C1", 1);
} );
private void For (int count, Action action)
{
while (count-- > 0)
action();
}
答案 1 :(得分:3)
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); });
}
}
答案 2 :(得分:2)
创建一个扩展整数的函数:
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);
});
答案 3 :(得分:0)
让我们理解一下这样的脚本代码:
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就是这个问题的一个很好的例子。开始,就像您的脚本一样,用于快速小应用程序。最后,添加了函数和命名空间。
祝你的项目好运。