我正在考虑在C ++中实现一个非常小的松散类型的语言。
我知道C和C ++可用于制作新的编程语言,但我完全迷失了如何绕过严格的类型执行。
我需要能够存储任何值(char,int,double,std :: string是我支持的) 然后能够检索它。
我知道您可以将类型作为字符串存储在具有void *的结构中。但是即使在你取消内部价值之后,很难找到一种方法来存储它们。
我知道你可以使用模板化的类,但我认为它使得该类的成员只能是指定的模板,即使这样也不能改变类型。
我正在制作一个Lisp变体,所以我需要一个具有内部值的Cell类,该内部值可以是上面列出的任何类型。 (请查阅Lisp“cons”单元格,了解为什么我需要一个可以重新分配的数据成员)
编辑: 让我补充一点,这将是一种解释型语言,不需要编译成原始C ++。
答案 0 :(得分:2)
我建议像
struct Value {
enum Tag { Char, Int, Double, String } m_Tag;
union {
char m_char;
int m_int;
double m_double;
std::string m_string;
} u;
};
当然这不会像写的那样工作,因为你不能在一个union中有一个带有构造函数(string)的类型。 但是C ++ 11放宽了这个限制。
答案 1 :(得分:1)
创建编程语言时,关键步骤是解析代码并将其转换为其他代码。在我认为你陷入困境的地方就是你的想法。你正在设想用c / c ++进行设置,这样你就可以使用你以“松散类型”的方式创建的实际类。相反,您的流程将更像这样:
最终转换可能会将代码更改为看起来完全不同的内容。您可以在此处定义使您的语言“松散输入”的所有规则。
由于您在严格类型的系统之上创建了一个松散类型的系统,因此您必须为您感兴趣的所有可能情况定义所有逻辑。
我只想说这不是佯攻的任务。以下是完成任务所需的工具列表(或至少我将使用的工具):
祝你好运。
答案 2 :(得分:0)
我知道您可以将类型作为字符串存储在具有void *的结构中。但是即使在你取消内部价值之后,很难找到一种方法来存储它们。
你说“将所有始终存储是什么意思?他们始终位于指针指向的位置。指针将始终如一< / strong>具有相同的大小,无论它实际存储的是什么。并且您将能够始终知道string
描述值的类型。您甚至可以使用单个char
来存储类型信息(因为您只需要4个值)。
如果你想创建一个variable
类,这可能是你唯一可以做的事情 - 存储一个指针和信息关于它所指向的类型