LINUX.ORG.RU

История изменений

Исправление MOPKOBKA, (текущая версия) :

ООП не такая уж и сложная идея для реализации, мой любимый пример на FASM:

https://board.flatassembler.net/topic.php?t=9896

...
class TIndex
 field Index  : DWORD = 0 
 ; suppose we have 2 functions to work with Index
 function Inc
 ; just for example - let it be virtual
 virtual_function Dec
endclass
...

А уж на С совсем просто, GObject как доказательство. Генераторы/корутины тоже просто делаются:

#define CO_BEGIN static int state=0; switch(state) { case 0:
#define CO_END }
#define CO_YIELD(x) do { state=__LINE__; return x; case __LINE__:; } while (0)

void parser(int c) {
  CO_BEGIN;
  for (;;) {
    if (c == EOF)
      break;
    
    if (isalpha(c)) {
      do {
        add_to_token(c);
        CO_YIELD();
      } while (isalpha(c));
      got_token(WORD);
    }
    
    add_to_token(c);
    got_token(PUNCT);
    CO_YIELD();
  }
  CO_END;
}
Даже GC легко встраивается, но только консервативный, а вот точный GC уже сложно.

Исходная версия MOPKOBKA, :

ООП не такая уж и сложная идея для реализации, мой любимый пример на FASM:

https://board.flatassembler.net/topic.php?t=9896

...
class TIndex
 field Index  : DWORD = 0 
 ; suppose we have 2 functions to work with Index
 function Inc
 ; just for example - let it be virtual
 virtual_function Dec
endclass
...

А уж на С совсем просто, GObject как доказательство. Генераторы тоже просто делаются:

#define CO_BEGIN static int state=0; switch(state) { case 0:
#define CO_END }
#define CO_YIELD(x) do { state=__LINE__; return x; case __LINE__:; } while (0)

void parser(int c) {
  CO_BEGIN;
  for (;;) {
    if (c == EOF)
      break;
    
    if (isalpha(c)) {
      do {
        add_to_token(c);
        CO_YIELD();
      } while (isalpha(c));
      got_token(WORD);
    }
    
    add_to_token(c);
    got_token(PUNCT);
    CO_YIELD();
  }
  CO_END;
}
Даже GC легко встраивается, но только консервативный, а вот точный GC уже сложно.