简化的“;对于循环“;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

简化的“;对于循环“;c#中的语法

您可以使用委托和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就是这个问题的一个很好的例子。与您的脚本一样,已开始用于快速的小型应用程序。最终,添加了函数和命名空间。

祝你的项目好运。