Будет ли мой DSL для Lua работать ...?(это кажется слишком простым, чтобы быть правдой) - PullRequest
5 голосов
/ 17 марта 2012

Я действительно люблю 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

С моим DSLLua:

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'г ... мысли?

Ответы [ 3 ]

5 голосов
/ 17 марта 2012

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

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

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

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

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

Оба подходаесть свои плюсы и минусы.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
3 голосов
/ 07 апреля 2013

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
3 голосов
/ 17 марта 2012

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

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

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

...