【发布时间】:2010-12-12 02:10:36
【问题描述】:
我试图更好地理解语言“动态”的真正含义。我对 Lingo 有相当多的经验,它是 Adobe(以前的 Macromedia)Director 产品线的脚本语言,我只是想知道它是否会被视为“动态语言”。
变量和 列表 的处理方式对我来说似乎非常“动态语言”。
对于变量,您只需编写 foo = 3 或 bar = "Hello World"。您不会将变量声明为 int 或 string——它会按原样计算。
使用列表,您可以只写miscCollection = [3, "Hello World", #helloWorld, ["Embedded List", "Goes Here", 3], [#phrase: "Property List goes here", #value: 3]] 之类的内容。这会不会类似于tuple?
这些功能是否足以符合“动态语言”状态?
有趣的是,我使用 C# 的次数越来越多,而 Director/Lingo 的使用次数越来越少,但是这些天对动态语言的兴奋之情,我想知道我是否真的违背了规律。
编辑
关于 Mark Rushakoff 的回答,下面尝试使用 Wikipedia article 分析 Lingo 是否符合“动态”的条件:
Eval- Lingo 有do和value关键字。do将执行整个命令,例如do "foo = 23"或do "foo = sum(20, 3)"。value试图将字符串转换为数字,但它不仅仅是一个解析运算符——它实际上可以将变量的字符串表示形式转换为其数字,例如,假设foo = 23,语句value("foo")将评估为 23。高阶函数 - 如果我理解正确的话,这基本上就是我在 C# 中所称的“代表”。据我所知,Lingo 不直接支持这一点,尽管您可以创建一个具有函数的类型(称为“父脚本”)并传递该类型的实例。
闭包 - 据我所知不支持。
继续 - 据我所知不支持。
反思 - 至少在某种意义上,是的。您实际上是使用字符串创建类型的新实例,例如
fooInstance = script("Foo").new(bar)。还可以将类型的实例转换为包含类型名称的字符串(这样您就可以模仿 c# 的GetType()功能)。您也可以在不知道属性名称的情况下查询类型的属性(例如,通过索引查找属性)并通过索引找出属性的名称。宏 - 维基百科文章描述宏的方式,我不这么认为。但是,可以在运行时编辑脚本,所以这可能很重要。
因此,Lingo 在动态功能上的得分似乎在 2 到 3 分(满分 6 分),但我对闭包和延续还不够清楚,无法确定 Lingo 不支持它们。我想我不确定要得出什么结论。欢迎评论。
【问题讨论】:
-
您使用的定义似乎很不一致。例如,尚不清楚为什么 lambdas/closures 应该与“动态语言”有任何关系。看起来
eval是唯一有意义的定义。当然,还有“动态类型”,我不确定你的“动态”应该是同一个东西,还是完全不同的概念。 -
@Pavel,感谢您的评论,但这不是我的定义。马克在他的回答中引用了维基百科的文章。如果您查看那篇文章,它会被标记为需要工作的几个警告,因此您可能对定义提出质疑。
-
坦率地说,这个问题与询问“棕色”是什么颜色一样有用。如果没有明确且广泛接受的“动态编程语言”定义,将语言分类为“动态”与否并不能真正告诉您任何事情。
-
@DanM - 鉴于您同意@Pavel 对引用的定义提出质疑是正确的,您可能不应该将其用作您的问题的基础。
-
@Stephen,对我来说,这个问题就像指着一块巧克力棒问,这是棕色的吗?一旦你意识到你熟悉的东西具有属性 x,你就可以识别出其他不那么熟悉的东西,看看它们是否具有属性 x。至于我的编辑,这确实是一种回应比可以合理放入评论中更长的答案的方式,而不是对维基百科文章的认可。
标签: c# dynamic dynamic-languages esoteric-languages lingo