Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Oberon
Перезагрузить страницу Подсветка синтаксиса в BlackBox собственными руками
Ответ
 
Опции темы Опции просмотра
  (#16 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 24.11.2004, 13:39

На счет мерцания при прокрутке мышиного колеса. Процедура перерисовки такая:
Код:
PROCEDURE (v: View) Restore* (f: Views.Frame; l, t, r, b: INTEGER); 
BEGIN 
  Views.InstallFrame(f, v.inner, 0, 0, 0, TRUE) 
END Restore;
Если написать ее по простому: v.inner.Restore(f, l, t, r, b); то ничего хорошего из этого не выйдет, так как прокрутка пропадет вообще (все время будет показываться только начало документа). Как быть?
Ответить с цитированием
  (#17 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 24.11.2004, 17:56

Поправочка. Забыл про вложенные комментарии: (* 1 (* 2 (* 3 *) 2 *) 1 *). Чтобы распознавать вложенные комментарии надо заменить процедуру PROCEDURE ScanComment (VAR scanner: Scanner); из модуля MasterColorScanner на следующую:
Код:
PROCEDURE ScanComment (VAR sc: Scanner);
VAR level: INTEGER;
BEGIN
  level := 0; sc.Start(); sc.Read();
  IF sc.char = '*' THEN
    REPEAT
      IF (sc.last = '(') & (sc.char = '*') THEN INC(level); sc.Read() END;
      sc.Read();
      IF (sc.last = '*') & (sc.char = ')') THEN DEC(level); sc.Read() END
    UNTIL (level = 0) OR sc.eot;
    sc.EndPrev(sc.syntax.Comment)
  ELSE 
    sc.EndPrev(sc.syntax.Symbol)
  END
END ScanComment;
Ответить с цитированием
  (#18 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 24.11.2004, 17:56

Поправочка. Забыл про вложенные комментарии: (* 1 (* 2 (* 3 *) 2 *) 1 *). Чтобы распознавать вложенные комментарии надо заменить процедуру PROCEDURE ScanComment (VAR scanner: Scanner); из модуля MasterColorScanner на следующую:
Код:
PROCEDURE ScanComment (VAR sc: Scanner);
VAR level: INTEGER;
BEGIN
  level := 0; sc.Start(); sc.Read();
  IF sc.char = '*' THEN
    REPEAT
      IF (sc.last = '(') & (sc.char = '*') THEN INC(level); sc.Read() END;
      sc.Read();
      IF (sc.last = '*') & (sc.char = ')') THEN DEC(level); sc.Read() END
    UNTIL (level = 0) OR sc.eot;
    sc.EndPrev(sc.syntax.Comment)
  ELSE 
    sc.EndPrev(sc.syntax.Symbol)
  END
END ScanComment;
Ответить с цитированием
  (#19 (permalink)) Старый
Fktrc Fktrc вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.10.2004
По умолчанию 25.11.2004, 12:37

Сергей, респект! Значительно удобнее стало смотреть исходники.

Цитата:
Originally posted by S.Yu.Gubanov
[b]
Код:
MENU "Master"
    "Подсветить синтаксис в активном документе"    "^F9"    "MasterColors.Colorize"    "TextCmds.FocusGuard"
    SEPARATOR
    "Новый редактор с автоподсветкой синтаксиса"    ""    "MasterColorViews.NewEditor"    ""
END
Можно изменить меню вот так - а то новый документ появляется нерасцвеченный.
Код:
MENU "Master"
    "Подсветить синтаксис в активном документе"    "^F9"    "MasterColors.Colorize"    "TextCmds.FocusGuard"
    SEPARATOR
    "Новый редактор с автоподсветкой синтаксиса"    ""    "MasterColorViews.NewEditor; MasterColors.Colorize"    ""
END
И вопрос напоследок - как изменить размер шрифта? При расцветке меняется шрифт и размер. В процедуре InitSyntaxAttributes шрифт сменил с Verdana на Courier New, а размер сменить не могу.

Код:
PROCEDURE InitSyntaxAttributes* (VAR a: SyntaxAttributes); 
BEGIN 
   IF a = NIL THEN NEW(a) END; 
   IF a.Def = NIL THEN 
    a.Def := TextModels.NewColor(TextModels.dir.attr, 0); 
    a.Def := TextModels.NewTypeface(a.Def, "Courier New"); (*работает*)
   END;       
   a.Def := TextModels.NewSize (a.Def, 9); (*не работает*)
Как нужно делать?
Ответить с цитированием
  (#20 (permalink)) Старый
Fktrc Fktrc вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.10.2004
По умолчанию 25.11.2004, 12:37

Сергей, респект! Значительно удобнее стало смотреть исходники.

Цитата:
Originally posted by S.Yu.Gubanov
[b]
Код:
MENU "Master"
    "Подсветить синтаксис в активном документе"    "^F9"    "MasterColors.Colorize"    "TextCmds.FocusGuard"
    SEPARATOR
    "Новый редактор с автоподсветкой синтаксиса"    ""    "MasterColorViews.NewEditor"    ""
END
Можно изменить меню вот так - а то новый документ появляется нерасцвеченный.
Код:
MENU "Master"
    "Подсветить синтаксис в активном документе"    "^F9"    "MasterColors.Colorize"    "TextCmds.FocusGuard"
    SEPARATOR
    "Новый редактор с автоподсветкой синтаксиса"    ""    "MasterColorViews.NewEditor; MasterColors.Colorize"    ""
END
И вопрос напоследок - как изменить размер шрифта? При расцветке меняется шрифт и размер. В процедуре InitSyntaxAttributes шрифт сменил с Verdana на Courier New, а размер сменить не могу.

Код:
PROCEDURE InitSyntaxAttributes* (VAR a: SyntaxAttributes); 
BEGIN 
   IF a = NIL THEN NEW(a) END; 
   IF a.Def = NIL THEN 
    a.Def := TextModels.NewColor(TextModels.dir.attr, 0); 
    a.Def := TextModels.NewTypeface(a.Def, "Courier New"); (*работает*)
   END;       
   a.Def := TextModels.NewSize (a.Def, 9); (*не работает*)
Как нужно делать?
Ответить с цитированием
Ads.
  (#21 (permalink)) Старый
Fktrc Fktrc вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.10.2004
По умолчанию 25.11.2004, 14:01

Интересная ситуация. Если документ создан через MasterColorViews.NewEditor, то при попытке компиляции его с помощью
DevCompiler.CompileThis получаем трап.

Пример.
Если текст любого модуля скопировать в документ, полученный через MasterColorViews.NewEditor и сохранить, то вот такая конструкция дает трап
Код:
(!)DevCompiler.CompileThis FktrcTest /|
Создаем стандартный документ, копируем туда тот же текст, сохраняем. Эта же самая конструкция трапа уже не дает, а компилирует модуль нормально.
Ответить с цитированием
  (#22 (permalink)) Старый
Fktrc Fktrc вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.10.2004
По умолчанию 25.11.2004, 14:01

Интересная ситуация. Если документ создан через MasterColorViews.NewEditor, то при попытке компиляции его с помощью
DevCompiler.CompileThis получаем трап.

Пример.
Если текст любого модуля скопировать в документ, полученный через MasterColorViews.NewEditor и сохранить, то вот такая конструкция дает трап
Код:
(!)DevCompiler.CompileThis FktrcTest /|
Создаем стандартный документ, копируем туда тот же текст, сохраняем. Эта же самая конструкция трапа уже не дает, а компилирует модуль нормально.
Ответить с цитированием
  (#23 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 25.11.2004, 16:11

Цитата:
Originally posted by Fktrc
[b]И вопрос напоследок - как изменить размер шрифта?
Код:
  a.Def := TextModels.NewSize (a.Def, 9); (*не работает*)
Как нужно делать?
А, я тоже над этим голову ломал. Потом дошло. Размеры шрифта измеряются в "универсальных единицах". Для того чтобы сделать шрифт размером 9 "точек" нужно написать вот так:
Код:
  a.Def := TextModels.NewSize (a.Def,  9 * Ports.point);
Код:
DEFINITION Ports;
...
 CONST
...
  mm = 36000; point = 12700; inch = 914400;
CONST mm, point, inch
Three important distance measures in universal units.
Ответить с цитированием
  (#24 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 25.11.2004, 16:11

Цитата:
Originally posted by Fktrc
[b]И вопрос напоследок - как изменить размер шрифта?
Код:
  a.Def := TextModels.NewSize (a.Def, 9); (*не работает*)
Как нужно делать?
А, я тоже над этим голову ломал. Потом дошло. Размеры шрифта измеряются в "универсальных единицах". Для того чтобы сделать шрифт размером 9 "точек" нужно написать вот так:
Код:
  a.Def := TextModels.NewSize (a.Def,  9 * Ports.point);
Код:
DEFINITION Ports;
...
 CONST
...
  mm = 36000; point = 12700; inch = 914400;
CONST mm, point, inch
Three important distance measures in universal units.
Ответить с цитированием
Ads
  (#25 (permalink)) Старый
Trurl Trurl вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.08.2004
По умолчанию 25.11.2004, 16:13

Поскольку MasterColorViews все равно меняют форматирование, можно применять их только к текстовым файлам. Создаем конвертор и регистрируем подходящий суффикс, например "mod".
Ответить с цитированием
  (#26 (permalink)) Старый
Trurl Trurl вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.08.2004
По умолчанию 25.11.2004, 16:13

Поскольку MasterColorViews все равно меняют форматирование, можно применять их только к текстовым файлам. Создаем конвертор и регистрируем подходящий суффикс, например "mod".
Ответить с цитированием
  (#27 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 25.11.2004, 16:18

Цитата:
Originally posted by Fktrc
[b]Интересная ситуация. Если документ создан через MasterColorViews.NewEditor, то при попытке компиляции его с помощью
DevCompiler.CompileThis получаем трап.
Да, забавно. Чего-то с wrapped-вьюхой не в проядке.

P. S.
Я ее из стандартного примера взял:
Help --> Examples
Цитата:
Wrapper Views
ObxWrappers docu ObxWrappers sources sample wrapper view
вроде все один к одному, ничего не менял...
Ответить с цитированием
  (#28 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 25.11.2004, 16:18

Цитата:
Originally posted by Fktrc
[b]Интересная ситуация. Если документ создан через MasterColorViews.NewEditor, то при попытке компиляции его с помощью
DevCompiler.CompileThis получаем трап.
Да, забавно. Чего-то с wrapped-вьюхой не в проядке.

P. S.
Я ее из стандартного примера взял:
Help --> Examples
Цитата:
Wrapper Views
ObxWrappers docu ObxWrappers sources sample wrapper view
вроде все один к одному, ничего не менял...
Ответить с цитированием
  (#29 (permalink)) Старый
Trurl Trurl вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.08.2004
По умолчанию 26.11.2004, 11:33

Вот, попробовал.
Код:
MODULE MasterColorViews;
IMPORT  Files, Stores, Models, Views, Controllers, 
    TextViews, TextModels, TextMappers, MasterColors;
TYPE
      View* = POINTER TO LIMITED RECORD (Views.View)
         inner: TextViews.View; 
         colorizing, needRefresh: BOOLEAN;
      END;

PROCEDURE (v: View) Colorize* (), NEW;
   BEGIN
      IF ~v.colorizing THEN
         v.colorizing := TRUE;
         MasterColors.ColorizeText(v.inner.ThisModel()(TextModels.Model));
         v.colorizing := FALSE
      END
   END Colorize;

PROCEDURE (v: View) ThisModel* (): Models.Model;
   BEGIN
      RETURN v.inner.ThisModel()
   END ThisModel;

PROCEDURE (v: View) InitContext* (context: Models.Context);
   BEGIN
      v.InitContext^(context);
      v.inner.InitContext(context)
   END InitContext;

PROCEDURE (v: View) Neutralize*;
   BEGIN
      v.inner.Neutralize
   END Neutralize;

PROCEDURE (v: View) Restore* (f: Views.Frame; l, t, r, b: INTEGER);
   BEGIN
      Views.InstallFrame(f, v.inner, 0, 0, 0, TRUE)
   END Restore;

PROCEDURE (v: View) HandleCtrlMsg* (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View);
   BEGIN
      WITH
      | msg: Controllers.EditMsg DO 
      v.Colorize(); v.needRefresh := TRUE
     | msg: Controllers.TickMsg DO 
      IF v.needRefresh THEN v.needRefresh := FALSE; v.Colorize() END
      ELSE
      END;
      focus := v.inner; 
   END HandleCtrlMsg;

PROCEDURE NewView* (text: TextModels.Model): View;
VAR  v: View;
BEGIN
   ASSERT(text # NIL, 20);
   NEW(v);
   v.colorizing := FALSE;
   v.inner := TextViews.dir.New(text);
   Stores.Join(v, v.inner);
   RETURN v
END NewView;

PROCEDURE NewModule (): TextModels.Model;
VAR text: TextModels.Model; f: TextMappers.Formatter;
BEGIN
   text := TextModels.dir.New();
   f.ConnectTo(text);
   f.WriteString('MODULE;'); f.WriteLn();
   f.WriteString('IMPORT StdLog;'); f.WriteLn();
   f.WriteLn();
   f.WriteLn();
   f.WriteString('BEGIN'); f.WriteLn();
   f.WriteTab(); f.WriteString('(* Initialization *)'); f.WriteLn();
   f.WriteString('CLOSE'); f.WriteLn();   
   f.WriteTab(); f.WriteString('(* Finalization *)'); f.WriteLn();
   f.WriteString('END .'); f.WriteLn();
   f.WriteLn;
   RETURN text;
END NewModule;

PROCEDURE NewEditor* ();
VAR  v: View;
BEGIN
   v := NewView(NewModule());
   Views.OpenView(v); 
END NewEditor;

PROCEDURE ImportText* (f: Files.File; OUT s: Stores.Store);
VAR byte: SHORTCHAR; ch: CHAR; len: INTEGER;
  r: Stores.Reader; t: TextModels.Model; w: TextModels.Writer;
BEGIN
    r.ConnectTo(f); r.SetPos(0);
    len := f.Length();
    t := TextModels.dir.New(); w := t.NewWriter(NIL);
    WHILE len # 0 DO
  r.ReadSChar(byte);
  ch := byte;    
  w.WriteChar(ch); DEC(len)
    END;
    s := NewView(t);
    s(View).Colorize()
END ImportText;

PROCEDURE ExportText* (s: Stores.Store; f: Files.File);
VAR byte: SHORTCHAR; ch: CHAR; len: INTEGER;
   w: Stores.Writer; t: TextModels.Model; r: TextModels.Reader;
BEGIN
    w.ConnectTo(f); w.SetPos(0);
    t := s(View).inner.ThisModel();
    len := t.Length();
    r := t.NewReader(NIL);
    WHILE len # 0 DO
  r.ReadChar(ch);
  byte := SHORT(ch);
  w.WriteSChar(byte);
  DEC(len)
    END
END ExportText;
END MasterColorViews.
В Config.Setup добавляем.
Код:
Converters.Register("MasterColorViews.ImportText", "MasterColorViews.ExportText", "MasterColorViews.View", "mod", {});
Теперь текстовые файлы *.mod будут раскрашиваться и сохраняться как текстовые файлы.
Ответить с цитированием
  (#30 (permalink)) Старый
Trurl Trurl вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.08.2004
По умолчанию 26.11.2004, 11:33

Вот, попробовал.
Код:
MODULE MasterColorViews;
IMPORT  Files, Stores, Models, Views, Controllers, 
    TextViews, TextModels, TextMappers, MasterColors;
TYPE
      View* = POINTER TO LIMITED RECORD (Views.View)
         inner: TextViews.View; 
         colorizing, needRefresh: BOOLEAN;
      END;

PROCEDURE (v: View) Colorize* (), NEW;
   BEGIN
      IF ~v.colorizing THEN
         v.colorizing := TRUE;
         MasterColors.ColorizeText(v.inner.ThisModel()(TextModels.Model));
         v.colorizing := FALSE
      END
   END Colorize;

PROCEDURE (v: View) ThisModel* (): Models.Model;
   BEGIN
      RETURN v.inner.ThisModel()
   END ThisModel;

PROCEDURE (v: View) InitContext* (context: Models.Context);
   BEGIN
      v.InitContext^(context);
      v.inner.InitContext(context)
   END InitContext;

PROCEDURE (v: View) Neutralize*;
   BEGIN
      v.inner.Neutralize
   END Neutralize;

PROCEDURE (v: View) Restore* (f: Views.Frame; l, t, r, b: INTEGER);
   BEGIN
      Views.InstallFrame(f, v.inner, 0, 0, 0, TRUE)
   END Restore;

PROCEDURE (v: View) HandleCtrlMsg* (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View);
   BEGIN
      WITH
      | msg: Controllers.EditMsg DO 
      v.Colorize(); v.needRefresh := TRUE
     | msg: Controllers.TickMsg DO 
      IF v.needRefresh THEN v.needRefresh := FALSE; v.Colorize() END
      ELSE
      END;
      focus := v.inner; 
   END HandleCtrlMsg;

PROCEDURE NewView* (text: TextModels.Model): View;
VAR  v: View;
BEGIN
   ASSERT(text # NIL, 20);
   NEW(v);
   v.colorizing := FALSE;
   v.inner := TextViews.dir.New(text);
   Stores.Join(v, v.inner);
   RETURN v
END NewView;

PROCEDURE NewModule (): TextModels.Model;
VAR text: TextModels.Model; f: TextMappers.Formatter;
BEGIN
   text := TextModels.dir.New();
   f.ConnectTo(text);
   f.WriteString('MODULE;'); f.WriteLn();
   f.WriteString('IMPORT StdLog;'); f.WriteLn();
   f.WriteLn();
   f.WriteLn();
   f.WriteString('BEGIN'); f.WriteLn();
   f.WriteTab(); f.WriteString('(* Initialization *)'); f.WriteLn();
   f.WriteString('CLOSE'); f.WriteLn();   
   f.WriteTab(); f.WriteString('(* Finalization *)'); f.WriteLn();
   f.WriteString('END .'); f.WriteLn();
   f.WriteLn;
   RETURN text;
END NewModule;

PROCEDURE NewEditor* ();
VAR  v: View;
BEGIN
   v := NewView(NewModule());
   Views.OpenView(v); 
END NewEditor;

PROCEDURE ImportText* (f: Files.File; OUT s: Stores.Store);
VAR byte: SHORTCHAR; ch: CHAR; len: INTEGER;
  r: Stores.Reader; t: TextModels.Model; w: TextModels.Writer;
BEGIN
    r.ConnectTo(f); r.SetPos(0);
    len := f.Length();
    t := TextModels.dir.New(); w := t.NewWriter(NIL);
    WHILE len # 0 DO
  r.ReadSChar(byte);
  ch := byte;    
  w.WriteChar(ch); DEC(len)
    END;
    s := NewView(t);
    s(View).Colorize()
END ImportText;

PROCEDURE ExportText* (s: Stores.Store; f: Files.File);
VAR byte: SHORTCHAR; ch: CHAR; len: INTEGER;
   w: Stores.Writer; t: TextModels.Model; r: TextModels.Reader;
BEGIN
    w.ConnectTo(f); w.SetPos(0);
    t := s(View).inner.ThisModel();
    len := t.Length();
    r := t.NewReader(NIL);
    WHILE len # 0 DO
  r.ReadChar(ch);
  byte := SHORT(ch);
  w.WriteSChar(byte);
  DEC(len)
    END
END ExportText;
END MasterColorViews.
В Config.Setup добавляем.
Код:
Converters.Register("MasterColorViews.ImportText", "MasterColorViews.ExportText", "MasterColorViews.View", "mod", {});
Теперь текстовые файлы *.mod будут раскрашиваться и сохраняться как текстовые файлы.
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсветка синтаксиса как реализовать Exmap .NET 3 04.10.2008 20:50
NVIDIA и ATi должны обладать собственными фабриками для войны с Intel ORTODOX О производителях 0 25.04.2008 13:51
Подсветка синтаксиса на форуме Mnior Prolog 12 06.11.2006 18:31
Меню BlackBox как в нем исправить ошибки delpher Oberon 12 25.02.2006 12:43
Подсветка синтаксиса wils0n Eclipse 2 16.12.2005 18:36
Минимальная программа на BlackBox sacred1972 Oberon 1 17.11.2005 13:58
Как создать EXE файл в BlackBox ais Oberon 8 01.08.2005 05:48
Проблемы с DirectInput + VS 6.0 и собственными модулями(ООП) Мелкий Программирование графики 1 22.07.2005 12:22
подсветка Smarty-синтаксиса kost PHP 2 12.06.2005 13:12
Как получить BlackBox PROnya Oberon 12 22.02.2005 07:21
Подсветка синтаксиса в слитном тексте Начинающий Visual C++ 0 30.04.2004 22:58
BlackBox под Linux где найти в интернете Anonymous Oberon 3 13.04.2003 04:46



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов