Макросы на MoonScript

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Макросы на MoonScript

Post by John Doe »

Начиная с билда 3878 Far 3 поддерживает в макросах MoonScript — язык программирования, транслируемый в Lua.
Это позволяет писать более компактный и хорошо читаемый код (то же самое для JavaScript делает CoffeeScript).

Документация по языку: Плагин LuaMacro автоматически загружает как *.lua, так и *.moon файлы.
Поддерживается также выполнение moon-скриптов из командной строки, см. документацию.

В дистрибутиве на официальном сайте дополнительно присутствуют утилиты moon.exe и moonc.exe (пример использования см. тут)

Онлайн-компилятор тут: http://moonscript.org/compiler/
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Макросы на MoonScript

Post by zg »

Latest post of the previous page:

John Doe wrote:Вероятно следует в случае moon вообще не надо пытаться устанавливать позицию.
почему? оригинальную строку получить вообще элементарно:
  1. local line_tables=require("moonscript.line_tables")
  2.  
  3. local errors=require("moonscript.errors")
  4.  
  5. local cache={}
  6.  
  7. local fname=[[C:\Program Files\far\Profile\Macros\scripts\test.moon]]
  8.  
  9. local tbl=line_tables[fname]
  10.  
  11. if tbl then
  12.  
  13.   far.Show(errors.reverse_line_number(fname,tbl,113,cache))
  14.  
  15. end
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Макросы на MoonScript

Post by John Doe »

Спасибо. Значит несложно будет доработать и mbrowser.lua

P.S.
Попробовал переводить , строка получается с точностью +/- 1
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Макросы на MoonScript

Post by zg »

макробровсер — поправил.
John Doe wrote:Попробовал переводить, строка получается с точностью +/- 1
нормально, я думаю.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Макросы на MoonScript

Post by John Doe »

Функции LuaMacro служащие для вывода ошибок тоже бы доработать.

Например пытаюсь загрузить макрофайл с ошибкой, получаю сообщение:

Code: Select all

[string "C:\APPs\Far3\Profile\Macros\scripts\Macro\Mac..."]:13: attempt to call global 'as' (a nil value)
Во-первых имя файла не видно. Во-вторых строку надо скорректировать.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Макросы на MoonScript

Post by zg »

moon\all.lua, который в moonscript.lua включён, хочет moon.lua, который туда не включён. надо либо moon\all.lua убрать, либо moon.lua добавить.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Макросы на MoonScript

Post by Shmuel »

Добавил.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Макросы на MoonScript

Post by Shmuel »

zg wrote:там минорные несовместимости, monnscript с 0.12 работает.
Оказывается, не так уж и работает (с LPeg 0.10.2 этой ошибки нет):

lua: local to_lua=require("moonscript.base").to_lua for k=1,250 do to_lua"5" end

User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Макросы на MoonScript

Post by zg »

Shmuel wrote:Оказывается, не так уж и работает (с LPeg 0.10.2 этой ошибки нет):
  1. typedef struct TTree {
  2.  
  3.   …
  4.  
  5.   unsigned short key;  /* key in ktable for Lua data (0 if no key) */
  6.  
  7.   …
вот это переполняется. если убрать short — всё работает.
судя по всему вот это:
* Changes from version 0.11 to 0.12
---------------------------------
+ no "unsigned short" limit for pattern sizes
не попало реально в исходники, потому что как в 0.11, так и в 0.12 это единственное место, где есть unsigned short.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Макросы на MoonScript

Post by Shmuel »

zg wrote:если убрать short — всё работает.
судя по всему вот это:
* Changes from version 0.11 to 0.12
---------------------------------
+ no "unsigned short" limit for pattern sizes
не попало реально в исходники, потому что как в 0.11, так и в 0.12 это единственное место, где есть unsigned short.
Спросил на Lua-форуме, посмотрим, что ответят.

И независимо от того, что ответят, странно выглядят измеренные времена 5-ти последовательных исполнений данного скрипта (в миллисекундах):
1. С LPeg 0.10.2: 527, 518, 518, 517, 524.
2. С LPeg 0.12, собранной с предложенным изменением: 3011, 6835, 10717, 16582, 23092.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Макросы на MoonScript

Post by zg »

Shmuel wrote:И независимо от того, что ответят, странно выглядят измеренные времена 5-ти последовательных исполнений данного скрипта (в миллисекундах):
1. С LPeg 0.10.2: 527, 518, 518, 517, 524.
2. С LPeg 0.12, собранной с предложенным изменением: 3011, 6835, 10717, 16582, 23092.
из того, что я успел понять в 0.12, там создаётся «глобальная» луатаблица ktable с индексами правил в деревьях. за один раз выполнения скрипта в неё пихается ~85000 элементов. после — не удаляется. возможно проблемы где-то здесь.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Макросы на MoonScript

Post by Shmuel »

zg wrote:из того, что я успел понять в 0.12, там создаётся «глобальная» луатаблица ktable с индексами правил в деревьях. за один раз выполнения скрипта в неё пихается ~85000 элементов. после — не удаляется. возможно проблемы где-то здесь.
Если честно, меня внутренности LPeg мало интересуют. Есть автор, пусть разбирается (если действительно проблема в LPeg, а не в MoonScript).
Багрепорт в трекер MoonScript также поместил.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Макросы на MoonScript

Post by Shmuel »

Произвёл подобные тесты с плагином Macro2Lua Converter. Результаты похожие - стабильные времена с LPeg 0.10.2, растущие - с LPeg 0.12.

LPeg 0.10.2: 2578 2578 2594 2578 2578
LPeg 0.12: 5016 5500 5953 6469 6906

Откатил в Фаре обратно на LPeg 0.10.2, до лучших времён.

Да, и не надо думать, что данные тесты искусственные, а в "реальной жизни" LPeg 0.12 вполне годится. Я вышел на эту неисправность вполне реально: на седьмом-восьмом запуске luamacro\macrotest.lua вылезает ошибка, после чего уже ни тест, ни MoonScript не работают.

Ещё один реальный пример из той же оперы: если в Macros\scripts более 100 файлов *.moon (в каждом хотя бы 1 макрос), получим ошибку при загрузке и опять-таки MoonScript дальше работать не будет.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Макросы на MoonScript

Post by zg »

не грузятся мун-модули в utf8 с бомом.
например test.moon:

Code: Select all

0
и в комстроке moon:far.Show require"test"

так вот лечится:
  1. Index: plugins/luamacro/moonscript.lua
  2.  
  3. ===================================================================
  4.  
  5. --- plugins/luamacro/moonscript.lua (revision 12711)
  6.  
  7. +++ plugins/luamacro/moonscript.lua (working copy)
  8.  
  9. @@ -5583,6 +5583,7 @@
  10.  
  11.  end
  12.  
  13.  loadstring = function(...)
  14.  
  15.    local options, str, chunk_name, mode, env = get_options(...)
  16.  
  17. +  if "string" == type(str) and string.sub(str,1,3)=="\2398791" then str=string.sub(str,4) end
  18.  
  19.    chunk_name = chunk_name or "=(moonscript.loadstring)"
  20.  
  21.    local code, ltable_or_err = to_lua(str, options)
  22.  
  23.    if not (code) then
  24.  
  25. @@ -5602,7 +5603,6 @@
  26.  
  27.      return nil, err
  28.  
  29.    end
  30.  
  31.    local text = assert(file:read("*a"))
  32.  
  33. -  if string.sub(text,1,3)=="\2398791" then text=string.sub(text,4) end
  34.  
  35.    file:close()
  36.  
  37.    return loadstring(text, "@" .. tostring(fname), ...)
  38.  
  39.  end
хотя возможно обрезать нужно вообще в to_lua. или наоборот не трогать loadfile и добавить обрезание в moon_loader.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Макросы на MoonScript

Post by Shmuel »

zg wrote:хотя возможно обрезать нужно вообще в to_lua. или наоборот не трогать loadfile и добавить обрезание в moon_loader.
Если бы автор MoonScript реагировал, то правильнее всего было бы открыть новый issue в проекте.
Делай на своё усмотрение.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Макросы на MoonScript

Post by Shmuel »

В связи с обнаруженным, на мой взгляд, критичным, багом в MoonScript 0.3.0, представляется логичным вернуться к 0.2.6 до тех пор, пока баг не починят.
User avatar
cmd.exe
Posts: 378
Joined: Fri 16 Apr, 2010 18:26
Location: Нижний Новгород
Has thanked: 181 times
Been thanked: 10 times
Contact:

Макросы на MoonScript

Post by cmd.exe »

В дальнейшем в данной теме будет документация на использование Moon Script в far manager? В Энциклопедия фара очень скудное упоминание про Moon Script.
Macroapi_manual только упоминание о том что функция может использоваться и Moon Script то-же.
I've been using Vim for about 2 years now, mostly because I can't figure out how to exit it. (c) I Am Devloper
I know nothing except the fact of my ignorance. (с) Socrates
Post Reply

Return to “Обсуждение макросов”