2

我试图更好地理解语言“动态”的真正含义。我对Lingo有相当多的经验,它是 Adob​​e(以前的 Macromedia)Director 产品线的脚本语言,我只是想知道它是否会被视为“动态语言”。

处理变量和列表的方式对我来说似乎非常“动态语言”。

使用变量,您只需编写foo = 3or bar = "Hello World"。您没有将变量声明为 anintstring--it 按原样计算。

使用列表,您可以编写类似miscCollection = [3, "Hello World", #helloWorld, ["Embedded List", "Goes Here", 3], [#phrase: "Property List goes here", #value: 3]]. 这不类似于 atuple吗?

这些功能是否足以符合“动态语言”状态?

有趣的是,我使用 C# 的次数更多,而使用 Director/Lingo 的次数更少,但是这些天对动态语言的兴奋之情,我想知道我是否真的违背了规律。

编辑

关于 Mark Rushakoff 的回答,下面是使用此Wikipedia 文章分析 Lingo 是否符合“动态”条件的尝试:

  1. Eval- 行话有dovalue关键字。do将执行整个命令,例如,do "foo = 23"do "foo = sum(20, 3)"value尝试将字符串转换为数字,但它不仅仅是一个解析运算符——它实际上可以将一个变量的字符串表示形式转换为它的数字,例如,假设foo = 23,该语句value("foo")将计算为 23。

  2. 高阶函数——如果我理解正确的话,这基本上就是我在 C# 中被称为“代表”的东西。据我所知,Lingo 不直接支持这一点,尽管您可以创建一个具有函数的类型(称为“父脚本”)并传递该类型的实例。

  3. 闭包 - 据我所知,不支持这个。

  4. 继续——据我所知,不支持这个。

  5. 反思——至少在某种意义上,是的。您实际上是使用字符串创建类型的新实例,例如fooInstance = script("Foo").new(bar). 也可以将类型的实例转换为包含类型名称的字符串(这样您就可以模仿 c# 的GetType()功能)。您还可以在不知道属性名称的情况下查询类型的属性(例如,通过索引查找属性)并通过索引找出属性的名称。

  6. 宏 - 维基百科文章描述的方式,我不这么认为。但是,可以在运行时编辑脚本,所以这可能很重要。

所以,看起来 Lingo 在动态特性上得分 2 到 3(满分 6 分),但我对闭包和延续还不够清楚,无法确定 Lingo 不支持它们。我想我不确定要得出什么结论。欢迎评论。

4

4 回答 4

5

类型推断(例如您的foo = 3and示例bar = "Hello World")并不意味着动态语言。C# 中的var关键字在编译时推断变量类型,Haskell 也可以对所有变量使用隐式类型,即使在编译程序中也是如此。

“动态编程语言”是一个定义非常松散的术语,但我认为如果您必须将其限制为一个限定符,那将是运行时反射。如果您可以进行反射,您可能可以执行 Wikipedia 文章中列出的其他限定符(评估、对象运行时更改、闭包、宏......)。

我对 Lingo 语言一无所知,但我想说的是,取消一种语言作为动态语言的资格通常比确定一种语言更容易。Lingo 可以做维基百科文章中的任何/所有限定词吗?如果不是,那么它可能只是不是动态的。如果它可以做任何事情,那么它可能至少是“足够动态的”。

于 2009-11-02T02:07:05.977 回答
2

“动态”是那些很时髦的词之一,但实际上仅意味着“所做的很酷”……它没有精确的定义。

话虽如此,我可以回答您关于类型的问题,或者至少尝试更好地解释类型化和非类型化(有些人称之为动态或动态类型)语言之间的区别。

类型化语言检查您永远不会尝试使用在运行程序之前无法执行的变量执行某些操作。无类型语言不做这个检查——它只是希望最好的,如果它有一个不适合它需要的值,就会给出一个错误。

这是两个极端。就像生活中的一切一样,在实践中,语言介于两个理论极端之间。所以有时很难说一种语言是有类型的还是无类型的——通常你只能说“语言 X 在编译时比语言 Y 有更好的类型检查,因为这些错误在 X 中被捕获,但在 Y 中没有:...... 。”

鉴于该定义,您可能会担心(1)类型化语言在程序中需要更多文本(因为您需要说明每个值是什么类型)和(2)类型化语言可能会限制您可以不必要地执行的操作(因为类型系统不够聪明,无法让你可以看到的东西起作用)。

这两个都可能是问题。但是随着类型语言变得更好,这两个问题都变得不那么重要了。例如,为什么有这样的代码:

String s = "hello"

当它很明显时

s = "hello"

那“s”必须是一个字符串?像这样“聪明”的语言,你不需要说出所有类型是什么,但它们仍然被检查,通常被称为“Hindley Milner”,因为这些人首先弄清楚了如何做到这一点详细地。

因此,当您查看为具有 Hindley Milner 类型系统的语言编写的程序时,它可能看起来好像没有类型。但这是一个错误。在程序运行之前,它仍然会计算出所有变量的所有类型必须是什么,并检查你是否不会因为尝试使用错误的类型做某事而出现任何错误(我认为这太棒了——它接近于一种人工智能……)

这意味着有时知道一种语言是否被输入的唯一方法就是知道它是如何实现的。仅从源头上看可能并不明显。

编辑:我刚刚重新阅读了上面的内容,我本来可以更清楚一点。我试图做出的区分是具有类型系统的语言和没有类型系统的语言。类型系统包括两件事:类型本身和检查类型是否正确的逻辑。

我称之为“无类型”(或动态类型)的语言确实有类型。例如,在 Python(这是一种无类型的动态语言)中,字符串和整数之间仍然存在差异。但是他们没有在程序运行之前检查程序的额外逻辑。所以说他们有类型,但没有类型系统会更准确。

相反,正如我所说,“类型化”语言会在程序运行之前进行检查,因此不仅必须有类型,还必须有额外的逻辑来完成这项工作。

于 2009-11-10T12:54:51.233 回答
1

当人们谈论编程语言是“动态的”时,他们通常指的是动态类型系统。我读过的关于动态类型系统是什么(以及它不是什么)的最佳定义是 Chris Smith 的优秀文章What to Know Before Debating Type Systems

一旦您阅读了那篇文章,我认为您应该对任何给定的语言是否符合静态或动态类型有您的答案。

于 2009-11-02T22:51:10.953 回答
0

我想证明 Lingo 是一种动态语言。

我为 Lingo 做了一个函数式编程框架LingoF 。这个框架完全是用 Lingo 编写的,没有 xtra,没有使用低级组件,所以如果语言不是动态的,就不可能开发这样的框架。

考虑到该框架,这是我对 Lingo 作为动态语言的评估:

1 - Eval - Lingo 有dovalue关键字。另外,您可以在执行时编译脚本。请参阅 LingoF 的功能“Lingo Expressions”。

2 - 高阶函数 - LingoF 展示了如何在 Lingo 中广泛使用高阶函数。

3 - 闭包 - LingoF 再次展示了如何在 Lingo 中使用闭包。

4 - 延续 - LingoF 语法助手使用延续技术定义。可以用延续传递风格编写函数。检查这个(取自 LingoF 模块):

on public_factorialCPS_2
on fac me, n,k
  x = LingoF().var()
  if ( n = 0 ) then return k [1] 
  else return me.factorialCPS[$(#-,n,1) ] [ LingoF().fun(x) [ k [ $(#*,n,x) ]  ] ]
end

5 - 反思 - 已经回答是,我同意。例如 LingoF 模块管理器是使用 DanM 提到的 Lingo 的反射特性实现的。

6 - 宏 - 我将不得不在这个领域做更多的研究。由于 Director 支持链接脚本(存储在外部文本文件中的脚本),因此可以实现某种宏。也许宏管理器可以拦截一些事件,例如startMovie(扩展它们)和stopMovie(再次压缩它们)。另一种可能性是将字段用作脚本并在脚本成员中扩展它们,我相信它会正常工作。

所以我在动态特征上的得分是 5 到 6 分(满分 6 分)。

于 2010-01-18T05:02:53.270 回答