c# - 学习 DLR(如何在其上实现一种语言)

标签 c# dynamic-language-runtime dynamic-languages

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

print b()
def b() { 
  return 1 
}

它引发异常,与大多数静态编译语言完全一样。'

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

def b() { 
  return 1 
}
print b()

ToyScript 可以正常工作。

我的问题是:前者应该如何在 DLR 中完成?

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

最佳答案

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

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

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

关于c# - 学习 DLR(如何在其上实现一种语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20291613/

相关文章:

c# - MVVM 中的 PasswordBox 绑定(bind)

c# - 执行 Mongo 查询 db.collection.runCommand ("text", {"search":"search text"})

.net - DLR、Boo 和 JVM

c# - 如何在动态对象上动态调用方法?

python - 脚本语言

winapi - 用于开箱即用 GUI 桌面应用程序编程的高级语言

c# - 你怎么知道一种语言是否是 "dynamic language"?

c# - 为什么 AD3AD08 在 .NET Framework 中表示有效日期?

c# - 适用于 Android(又名 Xamarin.Android)的 OxyPlot Mono 错位绘制。 (堆积柱系列)

dynamic - C# 4.0 动态类型的最常见应用