Я думаю о реализации очень маленького свободно типизированного языка в C ++.
Я знаю, что C и C ++ МОГУТ быть использованы для создания новых языков программирования, но я совершенно заблудился в том, как обойти строгое соблюдение типов.
Мне нужно иметь возможность хранить любое значение (я буду поддерживать char, int, double, std :: string)
И тогда сможете найти его.
Я знаю, что вы можете хранить тип в виде строки в структуре с пустым *. Но даже после разыменования значения внутри трудно найти способ их последовательного хранения.
Я знаю, что вы можете использовать шаблонный класс, но я думаю, что это делает его таким, что члены этого класса могут быть только указанным шаблоном и даже тогда не могут изменять тип.
Я делаю вариант Lisp, поэтому мне нужен класс Cell, который имеет внутреннее значение, которое может быть любым из перечисленных выше типов. (Пожалуйста, посмотрите ячейку Lisp «cons», чтобы понять, почему мне нужен член данных, который можно переназначить)
РЕДАКТИРОВАТЬ:
Позвольте мне добавить, что это будет интерпретируемый язык, и его не нужно будет компилировать в сырой C ++.
Я предлагаю что-то вроде
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;
};
Конечно, это не будет работать так, как написано, потому что вы не можете иметь тип с конструктором (строкой) в объединении.
Но C ++ 11 ослабил это ограничение.
Когда вы создаете язык программирования, ключевым шагом является анализ кода и перевод его во что-то другое. Я верю, что вы застряли в своих мыслях. Вы представляете себе, как все настраивается в c / c ++, чтобы вы использовали фактические классы, которые вы создали, в виде «свободно типизированных» типов. Вместо этого ваш процесс будет больше похож на это:
Окончательное преобразование может изменить их код в нечто совершенно другое. Здесь вы можете определить все правила, которые делают ваш язык «свободно набранным».
Поскольку вы создаете свободно типизированную систему поверх строго типизированной системы, вам придется определить всю логику для всех возможных случаев, которые вас интересуют.
Достаточно сказать, что это не задача для сердца. Вот список инструментов, которые вам понадобятся для выполнения задачи (или, по крайней мере, инструменты, которые я бы использовал):
Удачи.
Я знаю, что вы можете хранить тип в виде строки в структуре с пустым *. Но даже после разыменования значения внутри трудно найти способ их последовательного хранения.
Что вы имеете в виду, говоря «сохранить их всех» последовательно? Они будут последовательно лежат в месте, указанном указателем. Указатель будет последовательно имеют одинаковый размер, независимо от того, что он будет на самом деле хранить. И вы сможете последовательно знать тип значения с string
описывая это. Вы даже можете использовать один char
хранить информацию о типе (так как вам нужно только 4 значения).
Если вы хотите сделать variable
класс, это, вероятно, единственное, что вы можете сделать — сохранить указатель а также Информация о типе, на который он указывает.