Операторы Desugar Lua - PullRequest
       17

Операторы Desugar Lua

3 голосов
/ 16 января 2012

Поскольку Lua поддерживает первоклассные функции, я хотел бы знать, можете ли вы использовать десагарные операторы, как во многих функциональных языках.Например, в OCaml вы можете сделать:

let x = (+) 3 5

Приведенный выше код вставляет переменную x со значением 3 + 5.Запись (+) эквивалентна наличию локальной функции, которая принимает два параметра и возвращает их сумму.(+) 3 5 вызывает эту функцию с двумя аргументами 3 и 5.Мотивация заключается в том, что вы можете передать оператор непосредственно в функцию без необходимости заключать его в функцию перед:

local t = {"ab", "d", "c" }
local function op_greaterthan (a,b) return a>b end
table.sort (t, op_greaterthan) --would like to write: table.sort (t, (>)) 

Спасибо!

Ответы [ 2 ]

4 голосов
/ 16 января 2012

Вы не можете.

Интерпретатор Lua очень маленький, и он "делает ярлыки" при работе с операторами;для синтаксического анализатора они просто не являются «функциями».

Если вы попытаетесь использовать оператор без его параметров, например:

f(+)

Тогда интерпретатор выдаст синтаксическую ошибку.

Из-за этой реализации вы ограничены уже обсуждавшимися опциями: либо вы используете функцию-обертку (например, add), либо передаете строку и так далее, что-то вроде eval, как вРешение jpjacobs.

4 голосов
/ 16 января 2012

Да, вы можете (я не вижу в этом смысла, и это будет медленнее, но это возможно):

do
    local mem={}
    function unsugar(op,a,b)

        if mem[op] then
            print('Fetched operation from memory')
            return mem[op](a,b)
        else
            local f=loadstring('local a,b=...; return a '..op..' b')
            mem[op]=f
            return f(a,b)
        end
    end
end
print(unsugar('+',1,2)) -- = 3
print(unsugar('%',5,3)) -- = 2
print(unsugar('%',5,3)) -- = Fetched operation from memory \n 2

Редактировать : устранены шальные глобалы aи b, и запоминать для улучшения производительности, компилируя каждую операцию только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...