我正在为我创建的静态类型语言编写解释器。解释器是用C语言编写的。为简单起见,我将仅列出两种基本数据类型:int和float。
我需要一种可存储的结构:
类型可以只是基本数据类型之一,也可以是数组或函数。因此,有一个函数返回一个函数返回一个返回int的函数是有效的。
我知道我可以使用union存储基本数据类型,但是如何存储我不知道的函数,数组和类型声明。
答案 0 :(得分:1)
阅读SICP然后Lisp In Small Pieces。他们非常清楚你的问题。
您可能还想阅读Programming Language Pragmatics和Dragon Book
基本概念是closure的概念。你需要拥有它们(如果你想要一流的函数值和更高级的函数)。
请注意,类型声明主要是源代码。你想要abstract syntax trees(AST),也许就像s-expressions一样简单。您可以拥有symbol table,也可以拥有一流的symbols(以interned strings开头)。
你不希望普通union
- 像C一样,但是tagged unions或和类型。你当然想要一个garbage collector。您可以使用Boehm's GC。
寻找简单的Scheme - 就像翻译一样,例如here。研究SIOD。
研究现有free software解释器的源代码,例如: Lua,Guile等等......
答案 1 :(得分:0)
在objective-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 ......这将是一个非常简单的开始。