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(); 

是有效的。

相關問題