2015-12-19 20 views
6

Aktualnie koduję wtyczkę Lightroom. Lightroom nie używa wersji 5.2. Mam następującą funkcję, która obecnie działa dobrze, ale obawiam się, że jeśli program Lightroom zaktualizuje się do nowszej wersji, ten kod zostanie przerwany. Czy masz sugestie dotyczące obsługi varargs w tym przypadku w sposób niezależny od lua?Używanie varargs we wcześniejszej wersji Lua, ale chcę kompatybilności z 5.2+

Poniższe kod sprawdza czy funkcja F służy jako klucz w tabeli needsModule. Jeśli tak, tworzy funkcję obejmującą wywołanie zmiany modułów na wartość wskazywaną przez klucz F, po którym następuje wywołanie funkcji F i jej argumenty.

local function wrapFOM(F,...) 
    local openModule = needsModule[F] 
    if openModule == nil then 
    return function() return F(unpack(arg)) end 
    end 
    return function() 
    if LrApplicationView.getCurrentModuleName() ~= openModule then 
     LrApplicationView.switchToModule(openModule) 
    end 
    return F(unpack(arg)) --proper tail call 
    end 
end 
+5

Ciało funkcji startowej z 'local arg = arg lub {...}'. Więcej informacji [tutaj] (http://www.luafaq.org/#T1.23) –

+1

@EgorSkriptunoff: Czy możesz to opublikować jako odpowiedź? – ruakh

+0

@ruakh - Niestety, moje rozwiązanie jest niepoprawne dla zagnieżdżonych funkcji vararg w Lua 5.2+ (funkcja wewnętrzna 'arg' będzie dziedziczona z funkcji zewnętrznej zamiast tworzenia nowej tablicy parametrów). Nie widzę dobrego i prostego rozwiązania. Przykład niezbyt fajnego rozwiązania: 'local arg = table.pack i {...} lub arg' –

Odpowiedz

3

Lua 5,1 i się wspierać nowy styl postępowania vararg:

function vfunc(...) 
    for i = 1, select('#', ...) 
    print(i, (select(i, ...))) 
    end 
end 

lub jeśli naprawdę chcesz się varargs w nowo przydzielonego tabeli każde wywołanie funkcji (strzeżcie nil argumentów):

function vfunc(...) 
    local args = {...} 
    for i, v in ipairs(args) do 
    print(i, v) 
    end 
end 

Jeśli potrzebujesz także obsługi Lua 5.0, nie masz szczęścia, ponieważ poza listą parametrów jest ... błąd składniowy. Trzeba uciekać się do warunkowego generowania kodu do obejścia, że:

-- newer Lua versions use load instead of loadstring 
local loadstring = loadstring or load 
-- feature test for Lua 5.1+ 
local supports_ellipsis = loadstring("return ...") ~= nil 
local args = supports_ellipsis and "{...}" or "arg" 

function vararg(n, f) 
    local t = {} 
    for i = 1, n do t[ i ] = "_"..i end 
    local params = table.concat(t, ", ", 1, n) 
    local code = [[ 
return function(f) 
    return function(]]..params..[[, ...) 
    return f(]]..params..", "..args..[[) 
    end 
end 
]] 
    return assert(loadstring(code, "=(vararg)"))()(f) 
end 

Używaj go tak:

-- two fixed parameters, third parameter holds vararg list 
local vfunc = vararg(2, function(a, b, arg) 
    print(a, b) 
    for i,v in ipairs(arg) do 
    print("", i, v) 
    end 
end) 

vfunc("a") 
vfunc("a", "b") 
vfunc("a", "b", "c") 
vfunc("a", "b", "c", "d") 

Interfejs funkcji vararg powyżej może pracować nawet wcześniejszych wersjach Lua, ale prawdopodobnie potrzebujesz oddzielnej implementacji w osobnym pliku, ponieważ języki różnią się zbytnio.

3

Według Lightroom SDK 4 Programmers Guide (PDF):

Lightroom 4 używa wersji 5.1.4 języka Lua.

Ponieważ Lua 5.1 obsługuje zarówno stary styl, jak i nowy styl varargs, myślę, że możesz po prostu użyć nowego stylu i nie musisz się martwić o kompatybilność z przodu.

+0

(Przepraszam każdego, kto natknie się na to pytanie, którego przypadek naprawdę wymaga wcześniejszego wsparcia wersje Lua. Chyba nie uznasz tej odpowiedzi za bardzo satysfakcjonującą.) – ruakh

Powiązane problemy