0

例如,这样的事情在阿达(如果它是支持这一点):静态类型语言的类型在运行时决定?

type Type_Name is range bottom .. top; 

其中,“底”和“顶”是变量。

或用C是这样的(如果它是支持此):

struct s { 
    int a; 
    if (z<3) { 
     char b; 
     int c; 
    } else { 
     struct ss { 
      int b; 
      char c; 
     } 
    } 
} v; 

或,如果c是具有在声明的变量标识符后的类型:

var if (z<3) int else char; 

或类似的东西。

这只是出于好奇。我甚至不知道它是否有用,而且我知道它会产生许多问题,例如在使用之前必须检查是否存在类似s.ss.b的问题。噢,也许我应该重申标题中的问题:是否有任何静态类型的语言在运行时决定类型?如果是这样,他们是什么?

顺便说一句,也许这意味着该语言不会被静态类型。但是我的意思是变量的类型必须在使用前陈述的语言(当然不能这样做)。

+0

您的问题体现了矛盾的条款。 “静态”是指类型是在编译时确定的。不是一个真正的问题。 – EJP 2012-07-20 19:17:14

回答

1

在运行时决定类型的静态类型语言中没有什么意义。静态类型的目的是静态检测所有类型的错误,也就是说,在编译时。

如果您要在运行时决定类型,那么您最好放弃“类型”的概念,并使用duck-typing方法,其中重要的是操作是否受支持。

在运行时决定类型的静态类型语言的唯一原因是处理在编译时不可判定的情况。可能有一些这样的语言,但我真的不再关注语言开发场景了,所以我不能告诉你。

+0

我们在设计阶段制作了一种语言,它的类型检查器与解释器融合在一起。它会返回错误消息,就好像类型是静态的,但是在运行时。这使我们能够快速添加新的构造并发展语言。后来我们在语言稳定的时候将两者分开。是一个有趣的体验!不推荐:-) – jurgenv 2013-10-27 11:05:06

+0

@jurgenv这很有趣,谢谢你的分享。 – Marcin 2013-10-27 16:30:35

0

您可以在静态类型语言中模拟动态使用情况。这里当然会有些限制,但你可以做到这一点

一些例子:

在C#下面的代码是一个有效的。

object variant; 

if(a<5) 
    variant = new int(); 
else 
    variant = new double(); 

和在C++

boost::variant< std::vector<int> , std::list<int> > v; 

if (n > 10000) 
    v=std::vector(); 
else 
    v=std::list(); 

是有效的。

相关问题