// 2010.12.06 # Doj
// Упрощения работы с определяющими словами.

// эквиваленты к value, constant и variable, которые берут имя не из входного
// потока, а из строки со стека
: valued ( is-) created , does> @ ;
: constanted ( is-) valued ;
: variabled ( s-) created 0 , ;

: bvalued ( B: xs-) created b>w , does> b@ ;
: bconstanted ( B: xs-) bvalued ;
: bvariabled ( B: s-) variabled ;

: bvalue    ( B: x "name"-) source-next-name bvalued ;
: bconstant ( B: x "name"-) source-next-name bconstanted ;
: bvariable ( B: x "name"-) source-next-name bvariabled ;

// Создание перечислимых типов
// Пример:
//     5 enum STUDENT
//     STUDENT IVANOV // создаёт константу 5 с названием IVANOV
//     STUDENT SIDOROV // создаёт константу 6 с названием SIDOROV
//     STUDENT BELOSHAPKIN // создаёт константу 7 с названием BELOSHAPKIN
//     STUDENT PETROV // создаёт константу 8 с названием PETROV
: enum ( i "name"-) create , does> ( "name"-) dup @ constant 1+! ;

// Примитивный механизм для создания структур
// Пример
//      0
//              t_int -- x
//              t_int -- y
//              t_int -- z
//      struct vec3i
// Созданы новые слова:
//      vec3i ( -i) кладёт на стек размер структуры
//      x ( p-p) по адресу структуры вычисляет адрес поля x в ней
//      y ( p-p) то же для y
//      z ( p-p) то же для z
// 
// Пример использования:
//      vec3i malloc value a // выделяем память под структуры, запоминаем указатели
//      vec3i malloc value b
//      3 a x !   4 a y !   5 a z ! // наполняем структуры значениями
//      7 b x !   8 b y !   9 b z !
//      a x @   b x @   +   a x ! // покоординатно складываем
//      a y @   b y @   +   a y !
//      a z @   b z @   +   a z !
//      a x @ .   a y @ .   a z @ . // печатаем результат сложения на экран 
//  
// Структуры можно наследовать, для этого вместо нуля в самом начале нужно
// подставить имя структуры, от которой наследуем
// Пример
//      0
//              t_int -- x
//              t_int -- y
//      struct vec2i
// 
//      vec2i
//              t_int -- z
//      struct vec3i
: -- ( t "name"-) create type-size swap dup , + does> ( p-p) @ + ;
: struct ( "name"-) constant ;

// Таблица решений (в разработке)
: :solve ( i-i) 1+ :noname swap ;
: ;solve ['] ; execute swap 1+ ; immediate
: solve-table ( x1..xn n "xxx"--) create dup 1- , begin ?dup while swap , 1- repeat
  does> ( i-) dup @ lrot - swap cells + @ execute ;
