Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > скриптовый язык. спиок переменных


Автор: ZC1989 12.12.2012, 08:02
Всем Доброго времени суток)

пытаюсь написать примитивный скриптовый язык. начал из далека, и первым решил сделать стек где будут храниться переменные используемые в скрипте. По сути стек у меня это связанный список. вот так выглядит сам элемент переменной
Код

enum _type {int_,bool_,other_,};

class DS_VAR {
private:
public:

    DS_VAR *_next; // 
    char *name;
    BYTE *b;
    
    _type type_;

    //
    DS_VAR ( char *name_ );

    //
    ~DS_VAR ();

    template <class typedata>
    void set ( typedata _var ) {

        if( typeid(typedata) == typeid(int) ) type_ = int_;
        else if( typeid(typedata) == typeid(bool) ) type_ = bool_;
        else type_ = other_;

        b = new BYTE[sizeof(_var)];
        memset( &b, 0, sizeof(b) );
        memcpy( &b, &_var, sizeof(b) );
    }

    void _view () {

        switch( type_ ) {
            case int_: printf( "INT: %d", (int)b ); break;
            case bool_: printf( "BOOL: %d", (int)b ); break;
            case other_: printf( "OTHER: %s", (char*)b ); break;
        }
        printf( "\n" );
    }

};


в общем ничего такого уж сложного нету, и это работает, но мне очень не нравится как получилось сделать хранение оригинального типа данных.

массив для хранения значения битовый и что бы засунуть числовое значение а потом его получить, хочется то же сделать шаблонную функцию, которая будет в зависимости от типа хранимой переменной возвращать разные типы а не просто массив бит...

делать весь класс шаблоном как то не хочется, потому что тогда получается что весь список будет принадлежать какому то конкретному классу.

есть мысли как это можно немного переиграть?

Автор: GremlinProg 12.12.2012, 08:09

M
GremlinProg
Тема перемещена из раздела C/C++: Системное программирование и WinAPI

Автор: borisbn 12.12.2012, 09:23
Цитата(ZC1989 @  12.12.2012,  08:02 Найти цитируемый пост)
 memset( &b, 0, sizeof(b) );
        memcpy( &b, &_var, sizeof(b) );

sizefo( b ) равен размеру указателя, а не выделенной памяти

Автор: ZC1989 12.12.2012, 09:33
borisbn, по поводу буфера я не думал пока, как его лучше хранить, это пробный вариант... но и кстати, в случае char и bool он выделяет 1 байт, а когда передаю int - 4... 
суть не в этом, 
можно что нибудь получше придумать с запоминанием типа переменной?

Добавлено через 12 минут и 52 секунды
у меня была мысль сделать класс шаблоном

но есть касяк:
Код

template <class typedata>
class DS_VAR {
public:
    DS_VAR <ТИП ЭЛЕМЕНТА ЕЩЕ НЕ ИЗВЕСТЕН>*_next;


точно такое же возникает при объявлении ссылки на первый элемент, которая при отсутствии элементов просто нулевая... 
а получается что нужно заранее указать ее тип

Автор: xvr 12.12.2012, 13:30
Язык С++ - это язык со статической типизацией (даже с учетом шаблонов - они раскрываются в статические типы compile-time). Вы же пытаетесь сделать интерпретатор с run-time динамической типизацией (насколько я понял). Т.е. никакие конструкции С++ вам в этом не помогут  smile Так что делайте класс для хранения динамически типизированного значения, и уже их собирайте в стеки (или во что вам будет угодно  smile )

Автор: ZC1989 12.12.2012, 13:55
xvr, ну это слишком гибко, круто конечно, но я даже не думал делать так. мысль то была что в скриптовом языке будут указываться типы переменных, но сам так называемый "стек" хотел сделать более гибким. 

можно было бы сделать шаблонный класс, но тогда пришлось бы для каждого типа данных делать свой список. а я как раз хотел что бы этого делать не приходилось... и список был общий.... даже, бонально, на поиске имени переменной было бы проще. нежели перебирать несколько списков. 

хотя, с другой стороны ты навел на мысль сделать сложнее) но проще использовать)

погуглю, попробую, отпишусь)

Автор: borisbn 12.12.2012, 14:05
ZC1989, посмотри http://www.boost.org/doc/libs/1_52_0/doc/html/any.html

Автор: ZC1989 12.12.2012, 14:24
borisbn, давно еще читал про эту библиотеку, но совершенно забыл!
уже читаю) спасибо)

Автор: xvr 12.12.2012, 16:31
Цитата(ZC1989 @  12.12.2012,  13:55 Найти цитируемый пост)
можно было бы сделать шаблонный класс,

Вот этого как раз делать не надо. Одна и та же переменная в динамическом скриптовом языке может в разное время хранить данные разных типов. Никакой шаблон этого делать не умеет. Нужен всего один С++ тип для любого значения (и не только для переменных) - динамически типизированное значение.

Например -
Код

var a=123;
...
a="String";
Какого типа должна быть 'a' ?

Автор: artsb 12.12.2012, 21:41
ZC1989, если вы знакомы с C++Builder или Delphi, то можете покопаться в классе TVariant. Вроде бы, это как раз то, про что говорит 
xvr.

Автор: ZC1989 13.12.2012, 00:18
artsb, с++ булдер и делфи не особо знаю, так, абстрактно... поэтому их тонкостей я не знаю... в основном пользуюсь Си наследованными языками...

Автор: xvr 13.12.2012, 11:49
Цитата(ZC1989 @  13.12.2012,  00:18 Найти цитируемый пост)
поэтому их тонкостей я не знаю...

Ну вообще то TVariant это не 'их тонкости'. Это всего лишь обвертка над VARIANT, который в свою очередь пришел из мира ActiveX, а он [ActiveX] и был придуман для поддержки реализации скриптовых языков. Почитайте в MSDN (хотя в вашем случае это наверное будет чересчур)

Автор: Result 13.12.2012, 23:29
Еще можно посмотреть как в Пайтоне представлены переменные И объекты, и возможно позаимствовать подход в своих наработках.

Автор: borisbn 14.12.2012, 15:38
Цитата(Result @  13.12.2012,  23:29 Найти цитируемый пост)
Еще можно посмотреть как в Пайтоне представлены переменные И объекты, и возможно позаимствовать подход в своих наработках.

Хммм... интересно...
Не подскажете, где именно посмотреть ? 

Автор: volatile 14.12.2012, 17:44
Цитата(borisbn @  14.12.2012,  15:38 Найти цитируемый пост)
 где именно посмотреть ?  

borisbn, исходники доступны с http://www.python.org/

Автор: Result 15.12.2012, 12:28
Цитата(borisbn @ 14.12.2012,  15:38)
Цитата(Result @  13.12.2012,  23:29 Найти цитируемый пост)
Еще можно посмотреть как в Пайтоне представлены переменные И объекты, и возможно позаимствовать подход в своих наработках.

Хммм... интересно...
Не подскажете, где именно посмотреть ?

У Марка Лутца, в 4-ом издании, хорошее описание с картинками, с особыми объяснениями для Сишников.

Автор: fish9370 16.12.2012, 18:26
а чем твой скриптовый язык будет лучше (оличаться) от других, perl, php, lua и подобных?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)