C# 学习DLR(如何在其上实现语言)

C# 学习DLR(如何在其上实现语言),c#,dynamic-language-runtime,dynamic-languages,C#,Dynamic Language Runtime,Dynamic Languages,我正在尝试学习如何在DLR之上编写一种简单的脚本语言,方法是使用一个非常古老的DLR示例ToyScript。但是,ToyScript似乎不支持以下脚本结构,我希望在实现中使用这些结构: print b() def b() { return 1 } 它引发了一个异常,与大多数静态编译语言完全一样 如果脚本遵循“静态语言范例”: ToyScript工作正常 我的问题是:在DLR中如何实现前者 [显然,我在寻找解决方案的描述,而不是解决方案本身:)有一些可能的实现。第一个是需要执行来创建函数

我正在尝试学习如何在DLR之上编写一种简单的脚本语言,方法是使用一个非常古老的DLR示例ToyScript。但是,ToyScript似乎不支持以下脚本结构,我希望在实现中使用这些结构:

print b()
def b() { 
  return 1 
}
它引发了一个异常,与大多数静态编译语言完全一样

如果脚本遵循“静态语言范例”:

ToyScript工作正常

我的问题是:在DLR中如何实现前者


[显然,我在寻找解决方案的描述,而不是解决方案本身:)

有一些可能的实现。第一个是需要执行来创建函数。通过这种方式,您不能在通过执行创建函数之前调用函数。第二种方法是在解析代码和执行全局脚本时创建所有函数。通过这种方式,函数声明可以出现在代码中的任何地方,因为函数在任何执行之前都已创建。退一步说,无论是否调用函数,都需要创建所有函数。然后中间有一条路;第一次解析代码时,将函数的抽象语法树(AST)存储在函数表中。然后,当您想要调用函数时,在函数表中查找函数声明,然后从AST编译或解释。比较以下两个JavaScript代码片段,您会有一个好主意

console.log(b());
function b() {
    return 1;
}


关于“在大多数静态编译语言中”:我不知道这一点,但我知道在许多动态语言(JavaScript、Python和Ruby,仅举几个例子)中执行第一个块时也会出现错误。我只是看了一下,但实现它似乎需要做很多工作。你可能想看看他们是怎么做的,然后进行试错。你必须做一个更聪明的翻译。它需要两次通过该代码。第一个过程必须添加定义,第二个过程执行代码。静态编译器的工作方式:)脚本通常是自上而下解释的。因此,对b的调用不能在声明之前进行。非常感谢您的建议,但我觉得必须有一个更简单的解决方案:)。考虑C中的“动态”关键字。您可以调用对象上的未知成员,并在运行时完成适当的绑定。虽然我根本不是一个编译器专家,但我想逻辑上类似的东西可以用来实现我的目标:)。
console.log(b());
function b() {
    return 1;
}
console.log(b());
var b = function() {
    return 1;
}