Автор Тема: Вопрос по биндингу ? Или что тут еще требуется?  (Прочитано 110182 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #60 : Октябрь 24, 2013, 03:51:24 pm »
Быстрый вопрос - какие возможности вывода есть в Снегопате? То есть console.log() есть ? alert() есть? Что-то другое?

Я попробую написать короткий тест окружения (на js) как только будет информация о том как это дело выводить :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #61 : Октябрь 24, 2013, 04:02:32 pm »
Так. Выяснил, что в качестве параметра функции вместо this в качестве глобального контекста надо использовать SelfScript.self ? Где мне в компиляторе чего поменять, а то боюсь долго искать буду?

Искать "this" в файле module.js - это оно. Поменяй его на "SelfScript.self".

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #62 : Октябрь 24, 2013, 04:07:58 pm »
Так. Выяснил, что в качестве параметра функции вместо this в качестве глобального контекста надо использовать SelfScript.self ? Где мне в компиляторе чего поменять, а то боюсь долго искать буду?

Вообще "классика" получения глобального объекта в жабаскрипте выглядит вот так:
var global = (function(){return this;})();

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #63 : Октябрь 24, 2013, 04:13:30 pm »
Но так как подобный "конструкт" больше похож на херню, чем на что-то осмысленное...
Ну это же справедливо и для js'а, как языка, вообще :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #64 : Октябрь 25, 2013, 12:30:16 am »
Быстрый вопрос - какие возможности вывода есть в Снегопате? То есть console.log() есть ? alert() есть? Что-то другое?

Я попробую написать короткий тест окружения (на js) как только будет информация о том как это дело выводить :-)
Message (сообщение в текстовое окно)

MessageBox = alert

Кажется и alert тоже работает

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #65 : Октябрь 25, 2013, 12:42:06 am »
Быстрый вопрос - какие возможности вывода есть в Снегопате? То есть console.log() есть ? alert() есть? Что-то другое?

Я попробую написать короткий тест окружения (на js) как только будет информация о том как это дело выводить :-)
Message (сообщение в текстовое окно)

MessageBox = alert

Кажется и alert тоже работает
Хотя думаю уже не актуально, тест писать, если только еще для каких целей понадобится.
SelfScript.Self успешно заменяет this

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #66 : Октябрь 25, 2013, 09:08:45 am »
Что значит ошибка:
cannot export anonymous RECORD field: 'Name'

в коде

        File* = POINTER TO RECORD
Name*, BaseName*: ARRAY 256 OF CHAR;
FullName*, Path*: ARRAY 1024 OF CHAR;
Extension*: ARRAY 10 OF CHAR;
Exist*, IsDirectory*, IsFile*: PROCEDURE
END;


adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #67 : Октябрь 25, 2013, 09:10:53 am »
И там же вопрос. Если поля IsFile должно булево возвращать, то оформление правильно сделано, или надо как то обозначить возвращение значения? Такой же вопрос, для случая, когда надо передать параметры, они в полях должны быть обозначены?

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #68 : Октябрь 25, 2013, 09:47:10 am »
И там же вопрос. Если поля IsFile должно булево возвращать, то оформление правильно сделано, или надо как то обозначить возвращение значения? Такой же вопрос, для случая, когда надо передать параметры, они в полях должны быть обозначены?

Здесь у Вас все три процедуры не принимают параметров и не возвращают результат:

Exist*, IsDirectory*, IsFile*: PROCEDURE

Лучше делать так, наверное:
TYPE
  BoolProc* = PROCEDURE () : BOOLEAN;

  FileName* = ARRAY  256 OF CHAR;
  FilePath* = ARRAY 1024 OF CHAR;
 
  FilePtr*  = POINTER TO File;
  File* =
    RECORD
      Name*     : FileName;
      BaseName* : FileName;
      FullName* : FilePath;
      Path*     : FilePath;
      Extension*: ARRAY 10 OF CHAR;

      Exist*       : BoolProc;
      IsDirectory* : BoolProc;
      IsFile*      : BoolProc
    END;
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #69 : Октябрь 25, 2013, 10:09:08 am »
Спасибо, так вроде как компилируется.

Правда не понимаю, почему, ведь Extension осталось типа ARRAY

С процедурами понятно, а вот с полями не очень.

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #70 : Октябрь 25, 2013, 10:11:24 am »
А, увидел главное отличие, поля сделаны для рекорда, а не для указателя, еще раз спасибо, попробую свой код переделать

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #71 : Октябрь 26, 2013, 06:30:43 am »
Что-то не нашел, а в формальных параметрах процедуры можно указать значения по умолчанию? Или как это сделать? И как передавать пустой параметр при вызове, просто не указывать его?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #72 : Октябрь 26, 2013, 08:58:51 am »
Что-то не нашел, а в формальных параметрах процедуры можно указать значения по умолчанию? Или как это сделать? И как передавать пустой параметр при вызове, просто не указывать его?
Нельзя.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #73 : Октябрь 26, 2013, 10:30:32 am »
Что-то не нашел, а в формальных параметрах процедуры можно указать значения по умолчанию? Или как это сделать? И как передавать пустой параметр при вызове, просто не указывать его?

Прочитайте наконец легендарные "16 страниц" -- вопросов станет заметно меньше, и работа пойдёт куда быстрее )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Вопрос по биндингу ? Или что тут еще требуется?
« Ответ #74 : Октябрь 28, 2013, 10:59:45 pm »
Не знаю, важно ли, но нижеследующий код неверно идентифицирует ошибку (или мне так кажется, что неверно). Вместо того, чтобы указать, что незакрыта скобка, указывается, что другой тип ожидается.

(*!BEGINCOMMONMODULEOBERON7*)
(* Модуль для работы с кодом Javascript *)
MODULE Js;

    IMPORT JS;

    TYPE
       String* = POINTER TO RECORD END;
   
    PROCEDURE StringFromArrayChar*(arr : ARRAY OF CHAR) : String;
    VAR
       s : String;
       i : INTEGER;
    BEGIN
       JS.do("s = ''");
       JS.do("for(mi=0; i<arr.length; i++) {s = s + JS.String.fromCharCode(arr[i])}");
       RETURN s
    END StringFromArrayChar;

PROCEDURE ArrayFromString*(s : String; VAR res: ARRAY OF CHAR);
VAR i: INTEGER;
    BEGIN
JS.do("res = RTL$.strToArray(s)");
    END ArrayFromString;

    PROCEDURE CharCodeAt(s : String; n : INTEGER) : INTEGER;
    VAR
       res : INTEGER;
    BEGIN
       JS.do("res = s.charCodeAt(n)");
       RETURN res
    END CharCodeAt;

(*  *)
PROCEDURE Replace*(s, pattern, what: String): String;
VAR
res: String;
BEGIN
JS.do("res = s.replace(pattern, what)");
RETURN res
END Replace;

(*  *)
PROCEDURE Search*(s, what: String): INTEGER;
VAR
res: INTEGER;
BEGIN
JS.do("res = s.search(what)");
RETURN res
END Search;

(*  *)
PROCEDURE Concat*(s1, s2: String): String;
VAR
res: String;
BEGIN
JS.do("res = s1 + s2");
RETURN res
END Concat;

BEGIN
 
END Js.

(* Модуль для работы с API снегопата *)
MODULE Snegopat;
   
    IMPORT Js, JS;
   
    TYPE

(* Выделение редактора текста *)
Selection* = POINTER TO SelectionRec;

SelectionRec* = RECORD
beginRow, beginCol, endRow, endCol: INTEGER
END;

(* окно редактора текста *)
TextWindow* = POINTER TO TextWindowRec;

TextWindowRec* = RECORD
text*, selectedText*: Js.String;
hwnd*: INTEGER;
multyEdit*: BOOLEAN;
linesCount*: INTEGER
END;
       
(*  *)
PROCEDURE ScriptFullPath*(): Js.String; (*{*)
VAR
res: Js.String;

BEGIN
JS.do("res = JS.SelfScript.fullPath");
RETURN res
END ScriptFullPath; (*}*)
   
    (*  *)
    PROCEDURE activeTextWindow*(): TextWindow; (*{*)
        VAR wnd: TextWindow;
       
    BEGIN
        JS.do("wnd = JS.snegopat.activeTextWindow()");
        RETURN wnd
    END activeTextWindow; (*}*)

(*  *)
PROCEDURE GetSelection*(TextWnd: TextWindow): Selection; (*{*)
VAR
res: Selection;
BEGIN
JS.do("res = TextWnd.getSelection()");
  RETURN res
END GetSelection; (*}*)

(*  *)
PROCEDURE GetCaretPos*(TextWnd: TextWindow): Selection; (*{*)
VAR
res: Selection;
BEGIN
JS.do("res = TextWnd.getCaretPos()");
  RETURN res
END GetCaretPos; (*}*)

(*  *)
PROCEDURE SetSelection*(TextWnd: TextWindow; StartLine, StartCol, EndLine, EndCol: INTEGER); (*{*)

BEGIN
JS.do("TextWnd.setSelection(StartLine, StartCol, EndLine, EndCol)")
END SetSelection; (*}*)

(*  *)
PROCEDURE SetCaretPos*(TextWnd: TextWindow; Line, Col: INTEGER); (*{*)

BEGIN
JS.do("TextWnd.setCaretPos(Line, Col)")
END SetCaretPos; (*}*)

(*  *)
PROCEDURE Line*(TextWnd: TextWindow; ind: INTEGER): Js.String; (*{*)
VAR
res: Js.String;
BEGIN
JS.do("res = TextWnd.line(ind)");
  RETURN res
END Line; (*}*)

BEGIN

END Snegopat.

(* Модуль для работы с глобальным контектом конфигуратора 1С *)
MODULE GlobalDesigner;
    IMPORT Js, JS;
 
    TYPE

(* Файл *)
File* = POINTER TO FileRec;

FileRec* = RECORD
Name*, BaseName*: ARRAY 256 OF CHAR;
FullName*, Path*: ARRAY 1024 OF CHAR;
Extension*: ARRAY 10 OF CHAR;
Exist*, IsDirectory*, IsFile*: PROCEDURE(): BOOLEAN
END;

(* Текстовый документ *)
TextDocument* = POINTER TO TextDocumentRec;

TextDocumentRec* = RECORD
InsertLine*, ReplaceLine*: PROCEDURE (i: INTEGER; s: Js.String);
Put*: PROCEDURE (textdoc: TextDocument);
AddLine*, SetText*, SetFileType*: PROCEDURE (s: Js.String);
Write*, Read*: PROCEDURE (FileName, FileType, LineSeparator: Js.String);
LineCount*: PROCEDURE(): INTEGER;
Clear*: PROCEDURE;
Show*: PROCEDURE(Title, FileName: Js.String);
GetLine*: PROCEDURE (i: INTEGER): Js.String;
GetText*: PROCEDURE (): Js.String;
DeleteLine*: PROCEDURE (i: INTEGER)
END;

    (* Предупреждение *)
    PROCEDURE MessageBox*(str: ARRAY OF CHAR); (*{*)
       
    BEGIN
        JS.do("JS.Designer.MessageBox(Js.StringFromArrayChar(str))")
    END MessageBox; (*}*)

    (* Сообщить *)
    PROCEDURE Message*(str: ARRAY OF CHAR); (*{*)
       
    BEGIN
        JS.do("JS.Designer.Message(Js.StringFromArrayChar(str))")
    END Message; (*}*)

(* КОНСТРУКТОРЫ ОБЪЕКТОВ *)

(* Файл *)
PROCEDURE  NewFile*(Name: Js.String): File; (*{*)
VAR
obj: File;

BEGIN

JS.do("obj = JS.Designer.v8New('File', Name)");
RETURN obj
END  NewFile; (*}*)

(* ТекстовыйДокумент *)
PROCEDURE NewTextDocument(): TextDocument; (*{*)
VAR
obj: TextDocument;

BEGIN
JS.do("obj = JS.Designer.v8New('TextDocument')")
RETURN obj
END NewTextDocument; (*}*)

(*  *)
PROCEDURE Find*(Str, SubStr: Js.String): INTEGER; (*{*)
VAR
res: INTEGER;
BEGIN
JS.do("res = JS.Designer.Find(Str, SubStr)");
         RETURN res
END Find; (*}*)

BEGIN

END GlobalDesigner.
(*!ENDCOMMONMODULEOBERON7*)

(* Модуль для работы с кодом *)
MODULE Tools;
    IMPORT Js, JS, gl:=GlobalDesigner, sn:= Snegopat;

CONST
BEGINMODULEOBERON7 = "BEGINMODULEOBERON7";
ENDMODULEOBERON7 = "ENDMODULEOBERON7";
BEGINCOMMONMODULEOBERON7 = "BEGINCOMMONMODULEOBERON7";
ENDCOMMONMODULEOBERON7 = "ENDCOMMONMODULEOBERON7)";

   
    (* Процедура компилирует текст активного тектового окна *)
    PROCEDURE CompileActiveTextWindow*(); (*{*)
        VAR
       
    BEGIN
        gl.MessageBox("тодо Пока не реализовано");
    END CompileActiveTextWindow; (*}*)

(* *)
PROCEDURE ExistCodeOberon(TextWnd: sn.TextWindow; VAR beginRow, endRow: INTEGER; CommModule: BOOLEAN): BOOLEAN; (*{*)
VAR
res: BOOLEAN;
ind, countRow, pos: INTEGER;
str: Js.String;
           arr: ARRAY 1024 OF CHAR;

BEGIN

beginRow := 0;
endRow := 0;
countRow := TextWnd.linesCount;
ind := 0;

WHILE ind < countRow DO
INC(ind);
str := sn.Line(TextWnd, ind);

IF CommModule THEN

IF Js.Search(str, Js.StringFromArrayChar(BEGINCOMMONMODULEOBERON7)) # -1 THEN
beginRow := ind + 1;

ELSIF Js.Search(str, Js.StringFromArrayChar(ENDCOMMONMODULEOBERON7)) # -1 THEN
endRow := ind + 1;

END;

ELSE

(*IF Js.Search(str, Js.Concat(Js.StringFromArrayChar("!"),Js.StringFromArrayChar(BEGINMODULEOBERON7)) # -1 THEN*)
IF Js.Search(str, Js.Concat(Js.StringFromArrayChar("!"),Js.StringFromArrayChar(BEGINMODULEOBERON7)) # -1 THEN
beginRow := ind + 1;

ELSIF Js.Search(str, Js.Concat(Js.StringFromArrayChar("!"),Js.StringFromArrayChar(ENDMODULEOBERON7)) # -1 THEN
endRow := ind + 1;

END;

END;
END;
IF beginRow > 0 THEN
            res := TRUE
        ELSE
            res := FALSE
        END;
        RETURN res
END ExistCodeOberon; (*}*)

(*  *)
PROCEDURE AddCodeOberon(TextWnd: sn.TextWindow; beginRow, endRow: INTEGER; CommModule: BOOLEAN); (*{*)
VAR
res: BOOLEAN;
BEGIN
(* тодо *)
END AddCodeOberon; (*}*)

    (*  *)
    PROCEDURE EditActiveTextWindow*(); (*{*)
        VAR
ActiveTextWnd: sn.TextWindow;
        FileCommonModuleO7: gl.File;
name: Js.String;
beginRow, endRow: INTEGER;

    BEGIN

ActiveTextWnd := sn.activeTextWindow();

IF ActiveTextWnd = NIL THEN

gl.MessageBox("Не выбрано окно модуля")

ELSE

IF ~ExistCodeOberon(ActiveTextWnd, beginRow, endRow, FALSE) THEN

(* добавить код оберона в конец *)
AddCodeOberon(ActiveTextWnd, beginRow, endRow, FALSE);

ELSE

(* отменить комментирование кода оберона, удалить яваскрипт после оберона *)

END;

name := Js.Replace(sn.ScriptFullPath(), Js.StringFromArrayChar("OberonTools.js"), Js.StringFromArrayChar("CommonModules.ob7"));
FileCommonModuleO7:= gl.NewFile(name);
IF FileCommonModuleO7.Exist() THEN
IF ~ExistCodeOberon(ActiveTextWnd, beginRow, endRow, TRUE) THEN
(* тодо добавить код общих модулей *)
END;
END

END;

    END EditActiveTextWindow; (*}*)

BEGIN

END Tools.