我正在爲我創建的靜態類型語言編寫解釋器。解釋器是用C語言編寫的。爲了簡單起見,我只列出兩種基本數據類型,int和float。用於存儲變量,函數,數組和類型的數據結構
我需要某種類型的結構,其可以存儲:
- 一個基本數據類型
- 函數返回一個類型
- 一個某種類型的數組
- 類型定義
類型可以簡單地作爲基本數據類型或數組或函數之一。因此,有一個函數返回返回一個返回int的函數的函數是有效的。
我知道我可以使用聯合存儲基本數據類型,但是如何存儲函數,數組和類型聲明我不知道。
我正在爲我創建的靜態類型語言編寫解釋器。解釋器是用C語言編寫的。爲了簡單起見,我只列出兩種基本數據類型,int和float。用於存儲變量,函數,數組和類型的數據結構
我需要某種類型的結構,其可以存儲:
類型可以簡單地作爲基本數據類型或數組或函數之一。因此,有一個函數返回返回一個返回int的函數的函數是有效的。
我知道我可以使用聯合存儲基本數據類型,但是如何存儲函數,數組和類型聲明我不知道。
閱讀SICP然後Lisp In Small Pieces。他們很好地涵蓋了你的問題。
您可能還需要閱讀Programming Language Pragmatics和Dragon Book
的一個基本概念是,closure。你需要有他們(如果你想要一流的功能價值和更高層次的功能)。
請注意,類型聲明主要是源代碼的東西。你想要abstract syntax trees(AST),或許就像s-expressions一樣簡單。你可以有symbol table,或者可以有一流的symbols(從interned strings開始)。
你不希望普通的union
-s像C,但是tagged unions或者求和類型。你當然想要一個garbage collector。您可以使用Boehm's GC。
尋找簡單的Scheme類似的解釋器,例如, here。研究SIOD。研究現有的free software口譯員的源代碼,例如, Lua,Guile,等等...
在目標c所有對象(未如int原語)基本上是一個結構,其中所述第一對象是一個指針,指向被稱爲ISA元對象所以像(這是在沒有元簡化對象只是一個類型指標int):
typedef struct{
int isa;
int intVal;
float floatVal;
} ObjectType;
#define INT_TYPE 1
#define FLOAT_TYPE 2
ObjectType * newObject(int type, int intVal, float floatVal)
{
ObjectType * r = calloc(sizeof(ObjectType *),1);
r->isa=type;
if (type == INT_TYPE)
{
r->intVal=intVal;
}else if (type == FLOAT_TYPE)
{
r->floatVal=floatVal
}else{
free(r);
return NULL;
}
return r;
}
然後爲float和int創建一個getter ...這將是一個非常簡單的開始。
這是如何回答這個問題的? –
@BasileStarynkevitch是一個可以容納int或浮點數的對象類型 –
這隻能存放int和float,而不是數組,函數等 –
有關於此主題的整本書。我可能會通過查看其他解釋語言的源代碼來獲得一些想法,例如Python, – OldProgrammer
您能解釋一下「靜態類型」對您意味着什麼嗎?你有[type inference](https://en.wikipedia.org/wiki/Type_inference)嗎?怎麼樣? (這應該進入你的問題)。多解釋一下你的編程語言是什麼樣的。 –