2015-12-19 6 views
6

Attualmente sto codificando per un plug-in Lightroom. Lightroom non utilizza la versione 5.2. Ho la seguente funzione, che funziona bene al momento, ma sono preoccupato che se Lightroom esegue l'aggiornamento a una versione più recente, questo codice si interromperà. Avete suggerimenti su come fornire la gestione dei vararg in questo caso in modo indipendente dalla versione di lua?Utilizzo di vararg nella versione precedente di Lua, ma voglio compatibilità con 5.2+

Il seguente codice controlla per vedere se la funzione F viene utilizzata come chiave nella tabella needsModule. In tal caso, compone una funzione che include una chiamata per modificare i moduli al valore indicato dal tasto F seguito da una chiamata alla funzione F e dai relativi argomenti.

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

Avvia il corpo della funzione con 'local arg = arg o {...}'. Maggiori informazioni [qui] (http://www.luafaq.org/#T1.23) –

+1

@EgorSkriptunoff: Potresti postarla come risposta? – ruakh

+0

@ruakh - Sfortunatamente, la mia soluzione non è corretta per le funzioni di vararg nidificate in Lua 5.2+ (l''arg' della funzione interna sarà ereditato dalla funzione esterna invece di creare una nuova matrice di parametri). Non vedo una soluzione bella e semplice. Esempio di soluzione non piacevole: 'arg locale = table.pack e {...} o arg' –

risposta

3

Lua 5.1 e il supporto al nuovo stile di gestione vararg:

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

o se si vuole veramente i varargs in una tabella appena allocato ogni chiamata di funzione (attenzione nil argomenti):

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

Se è necessario anche supportare Lua 5.0, si è fuori di sorte, perché ... al di fuori di un elenco di parametri è un errore di sintassi. Avresti ricorrere alla generazione di codice condizionale per aggirare che:

-- 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 

usare in questo modo:

-- 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") 

L'interfaccia della funzione vararg sopra potrebbe funzionare per le versioni ancora precedenti di Lua, ma probabilmente hai bisogno di un'implementazione separata in un file separato, perché le lingue sono troppo diverse.

3

Secondo il Lightroom SDK 4 Programmers Guide (PDF):

Lightroom 4 utilizza la versione 5.1.4 del linguaggio Lua.

Dal momento che Lua 5.1 supporta sia il vecchio stile che il nuovo stile di vararg, penso che si possa semplicemente usare il nuovo stile e non preoccuparsi della compatibilità diretta.

+0

(Le mie scuse a chiunque si imbattesse in questa domanda il cui caso d'uso richiede davvero il supporto precedente versioni di Lua. Immagino che non troverai questa risposta molto soddisfacente ...) – ruakh

Problemi correlati