Будет ли работать мой DSL для Lua? (это кажется слишком простым, чтобы быть правдой)

Мне очень нравится Lua как язык программирования, НО меня невероятно беспокоит необходимость постоянно печатать " local "для всех моих локальных переменных.

Это просто делает мой код более загроможденным.

Поэтому мне интересно, могу ли я создать доменно-ориентированный язык (DSL) поверх Lua, чтобы просто иметь следующее соглашение об именах переменных.

  1. Если имя переменной написано ВСЕМИ ЗАГЛАВНЫМИ БУКВАМИ, то это глобальная переменная.
  2. В противном случае переменная - это local переменная.

Вопрос: сработает ли это - да или нет?

Другими словами:

-- In Lua 5.2
isGlobalinLua  = "is global in default Lua"
GLOBALVAR      = "is global var in default Lua"
local localvar = "is local var in default Lua"

-- In my DSL Lua language
isLocalinDSLLua = "is local in DSL Lua"  -- translates to: local isLocalinDSLLua = ...
GLOBALVAR       = "is global DSL Lua"
localvar        = "is local var in DSL Lua"  -- translates to: local localvar = ...

Итак, теперь следующий код в Lua по умолчанию:

myglobal = 10
local a = 1
if a > 1 then
    local b = 2
    print b
else
    local c = 3
    print c + myglobal
end

С моим DSL Lua:

MYGLOBAL = 10
a = 1
if a > 1 then
    b = 2
    print b
else
    c = 3
    print c + MYGLOBAL
end

ОБНОВЛЕНИЕ:

А как насчет локальных функций?

Как будет работать следующий код?

myfunc = function (...)   -- local myfunc = function (...)

Я не уверен, что хотел бы сделать каждую глобальную функцию заглавными буквами.

Может, я просто игнорирую функции и требую идентификатор "local" ... мысли?


person nickb    schedule 16.03.2012    source источник
comment
Интересный вопрос. +1 Мне интересно узнать, правильно ли это или как правильно это сделать.   -  person John Riselvato    schedule 17.03.2012
comment
Конечно, вы можете это сделать; напишите препроцессор, который читает ваш DSL и выводит исходный код Lua. Это нетривиальная задача, и для меня не очевидно, насколько она стоит того. Лично я не вижу особого смысла в DSL, которые работают на том же уровне абстракции, что и язык реализации; они не экономят время и не предотвращают ошибок. Домен на предметно-ориентированном языке обычно относится к домену конечного пользователя; такой игрок, бухгалтер, бизнесмен и др.   -  person Dour High Arch    schedule 17.03.2012
comment
Что же вышло из этой идеи по прошествии года?   -  person lhf    schedule 07.04.2013
comment
@lhf, это не я создавал, но это вдохновило меня. moonscript.org   -  person nickb    schedule 03.05.2013


Ответы (3)


Moonscript уже имеет все локальные переменные по умолчанию, и вам нужно только использовать ключевое слово export, чтобы объявить глобальные. Это очень хороший язык нового поколения, похожий на coffeescript, и он компилируется в Lua. Я использую его везде, где раньше использовал Lua.

foo = 'bar' -- local
square (x) -> x*x -- local

-- globals
export square
export MY_GLOBAL = 12

export class Foo
    new: (bar) => @bar = bar -- self.bar = bar
    get_bar: => @bar
person Eloff    schedule 06.04.2013
comment
К сожалению, я не фанат кофе-скриптов. Вы знаете, как я могу извлечь ту часть Moonscript, которую я хочу использовать, не используя остальную часть? - person nickb; 28.01.2014

Поскольку желаемое изменение относительно просто, у вас есть два варианта. Вы можете попробовать Metalua:

Metalua - это язык и компилятор, которые обеспечивают ...

  • Полная макросистема, схожая по мощности с тем, что предлагают диалекты Lisp или Template Haskell; управляемые программы можно рассматривать как исходный код, как абстрактные синтаксические деревья или как их произвольное сочетание, в зависимости от того, что лучше подходит для вашей задачи.
  • Динамически расширяемый синтаксический анализатор, который позволяет поддерживать ваши макросы с синтаксисом, который прекрасно сочетается с остальным языком.

Или вы можете использовать фильтры токенов:

Фильтр токенов работает, давая вам возможность проверять и изменять поток токенов, поступающих от лексера, прежде чем они попадут в синтаксический анализатор. Вы можете видеть только токены, и вам разрешено только генерировать токены - вам не разрешено ни видеть текст, поступающий в лексер, ни генерировать текст для входа в лексер.

У обоих подходов есть свои плюсы и минусы. Metalua позволяет вам выполнять высокоуровневые модификации языка в Lua, но требует более крутого обучения. Фильтры токенов позволяют вносить простые изменения в поток токенов, но имеют ограниченные возможности (см. Обсуждение 2005 г.).

Я не уверен, достаточно ли фильтров токенов для вашего случая, потому что вставка local перед каждым идентификатором, начинающимся в нижнем регистре, в назначении будет работать только для простых случаев. А как насчет следующего кода?

a = 1
a = a * a

Вы хотите преобразовать его в один local или хотите два?

local a = 1     vs.    local a = 1
a * a                  local a = a * a  -- valid in Lua, creates a new variable
person Michal Kottman    schedule 16.03.2012

Да, вы можете это сделать, но результат не называется «предметно-ориентированным языком». Это называется «препроцессор».

Меня тоже когда-то сильно беспокоила проблема с Luait, в которой отсутствует выражение switch или case. Я фактически изменил реализацию для поддержки этой функции. Но в конце концов я решил, что мне наплевать на программирование на диалекте, который использовал только я.

Если у вас есть навыки программирования на C, реализация Lua очень чистая, и самый простой способ достичь своей цели, вероятно, - просто изменить реализацию.

person Norman Ramsey    schedule 17.03.2012