Non pubblicherò alcun code
ma ciò che non viene eseguito qui in queste risposte è a mettere la rima al motivo. Sto lavorando nell'arena nativa di JS e il problema è sorto nel fatto che alcuni native API calls
devono essere trasformati perché non possiamo scrivere i parametri senza brutti intrighi vergognosi.
Questa è la mia soluzione:
// Functions that return parameter data should be modified to return
// an array whose zeroeth member is the return value, all other values
// are their respective 1-based parameter index.
That doesn't mean define and return every parameter. Only the parameters that recieve output.
La ragione di questo approccio è quindi: Multiple return values
può essere necessario per qualsiasi numero di procedure. Ciò crea una situazione in cui gli oggetti con valori denominati (che alla fine non saranno sincronizzati con il contesto lessicale di tutte le operazioni), costantemente devono essere memorizzati per funzionare in modo appropriato con la/le procedura/e.
Utilizzando il metodo prescritto, basta conoscere what you called
, e where you should be looking
piuttosto che dover sapere cosa si sta cercando.
C'è anche il vantaggio che gli algoritmi "robusti e stupidi" possono essere scritti per avvolgere le chiamate della procedura desiderata per rendere questa operazione "più trasparente".
Sarebbe saggio per usare un object
, function
, o un array
(che sono tutti gli oggetti) come parametro "write-back-output", ma credo che se ogni opera estranea deve essere fatto, si deve essere fatto da chi scrive il toolkit per semplificare le cose o ampliare le funzionalità.
Si tratta di un uno per tutti risposta per ogni sceglievamo, che mantiene APIs
guardando il modo in cui dovrebbe in un primo sguardo, piuttosto che sembra essere e avere ogni rassomiglianza di un intreccio zoppicare-lastricata di spaghetti code arazzo che non riesco a capire se è una definizione o .
Congratulazioni, e buona fortuna.
Sto utilizzando il webkitgtk3 e interfacciato con alcuni proc nativi della libreria C. quindi questo esempio di codice comprovato potrebbe almeno servire allo scopo di illustrazione.
// ssize_t read(int filedes, void *buf, size_t nbyte)
SeedValue libc_native_io_read (SeedContext ctx, SeedObject function, SeedObject this_object, gsize argument_count, const SeedValue arguments[], SeedException *exception) {
// NOTE: caller is completely responsible for buffering!
/* C CODING LOOK AND FEEL */
if (argument_count != 3) {
seed_make_exception (ctx, exception, xXx_native_params_invalid,
"read expects 3 arguments: filedes, buffer, nbyte: see `man 3 read' for details",
argument_count
); return seed_make_undefined (ctx);
}
gint filedes = seed_value_to_int(ctx, arguments[0], exception);
void *buf = seed_value_to_string(ctx, arguments[1], exception);
size_t nbyte = seed_value_to_ulong(ctx, arguments[2], exception);
SeedValue result[3];
result[0] = seed_value_from_long(ctx, read(filedes, buf, nbyte), exception);
result[2] = seed_value_from_binary_string(ctx, buf, nbyte, exception);
g_free(buf);
return seed_make_array(ctx, result, 3, exception);
}
Nick, ho so che è un po 'fa, ma credo di avere finalmente un [risposta] (https://stackoverflow.com/a/48517986/1016343) per voi. Sì, puoi eseguire i parametri in JavaScript. – Matt