Lua ↔ JavaScript
Send JavaScript data to Lua, call a host function from Lua and get its results back in JavaScript.Envoyez des données JavaScript à Lua, appelez une fonction hôte depuis Lua et récupérez ses résultats en JavaScript.
The four examples run real PyroeisVm calls. Edit the data or the exchange(data) function, then watch each crossing in the log. The Lua code runs in a worker with an execution budget.Les quatre exemples exécutent les appels réels de PyroeisVm. Modifiez les données ou la fonction exchange(data), puis observez chaque passage dans le journal. Le code Lua tourne dans un worker avec un budget d’exécution.
Exchanges both waysLes échanges dans les deux sens
Enter the JavaScript object data as JSON.Saisissez les données de l’objet JavaScript au format JSON.
Objects and arrays become Lua tables; array indices start at 1 in Lua.Objets et tableaux deviennent des tables Lua ; les indices d’un tableau commencent à 1 dans Lua.
exchange(data) receives the converted data and may call host.scale(value, factor).reçoit les données converties et peut appeler host.scale(value, factor).
Loading the example…Chargement de l’exemple…
JavaScript object after the Lua callObjet JavaScript après l’appel Lua
Lua → JavaScript: the values receivedLua → JavaScript : les valeurs reçues
callMulti returns a list of all Lua returns. Tables become JavaScript data; a Lua function becomes a LuaRef reference the host can call back. The Map, BigInt or LuaRef mentions in results describe the types actually received; they are not fields added to your Lua tables.callMulti renvoie une liste de tous les retours Lua. Les tables sont converties en données JavaScript ; une fonction Lua devient une référence LuaRef que l’hôte peut rappeler. Les mentions Map, BigInt ou LuaRef dans les résultats décrivent les types réellement reçus ; ce ne sont pas des champs ajoutés à vos tables Lua.
See the host JavaScript codeVoir le code JavaScript de l’hôte
Excerpt of the calls used by the demo. The worker adds logging, reference validation and release.Extrait des appels utilisés par la démo. Le worker ajoute le journal, la validation des références et leur libération.
Log of crossings between both languagesJournal des passages entre les deux langages
Understand the exchange contract and the choice against fengari-interopComprendre le contrat d’échange et le choix face à fengari-interop. JavaScript data stays a copy when passed as a Lua table. Callbacks are explicit host operations; Lua budgets do not preempt arbitrary JavaScript.. Les données JavaScript restent des copies lors du passage en table Lua. Les callbacks sont des opérations hôtes explicites ; les budgets Lua ne préemptent pas du JavaScript arbitraire.
Lua paused during a user choiceLua en pause pendant un choix utilisateur
The script asks JavaScript for a choice, suspends, then resumes with your answer.Le script demande un choix à JavaScript, se suspend, puis reprend avec votre réponse.
host.choose returns a Yield. JavaScript receives the question, shows a dialogue and waits. Once you choose, coroutine.resume(choice) makes your answer the result of Lua’s host.choose call. Variables and position in the script are kept.renvoie un Yield. JavaScript reçoit la question, affiche un dialogue et attend. Une fois le choix effectué, coroutine.resume(choice) fait de votre réponse le résultat de l’appel Lua à host.choose. Les variables et la position dans le script sont conservées.
The script is waiting to be started.Le script attend d’être lancé.
The answers back in LuaLes réponses revenues dans Lua
Messages from the Lua scriptMessages du script Lua
Suspensions and resumptionsSuspensions et reprises
The mechanism on the JavaScript sideLe mécanisme côté JavaScript
vm.defineFunction('host.choose', (question, choices) =>
new Yield([{ kind: 'choice', question, choices }])
);
const co = vm.coroutineFromSource(luaSource);
let step = co.resume();
while (!step.done) {
// This Promise belongs to the JavaScript host.
// Lua is suspended while waiting for the user.
const selected = await showChoiceDialog(step.values[0]);
step = co.resume(selected);
}
console.log(step.values); // the final returns of the scriptvm.defineFunction('host.choose', (question, choices) =>
new Yield([{ kind: 'choice', question, choices }])
);
const co = vm.coroutineFromSource(luaSource);
let step = co.resume();
while (!step.done) {
// La Promise appartient à l’hôte JavaScript.
// Lua est suspendu pendant l’attente de l’utilisateur.
const selected = await showChoiceDialog(step.values[0]);
step = co.resume(selected);
}
console.log(step.values); // les retours finaux du scriptOn this page, the coroutine lives in a worker and the dialogue in the page. Messages carry the request then the answer between the two. Worker code · Dialogue code.Dans cette page, la coroutine vit dans un worker et le dialogue dans la page. Les messages transportent la demande puis la réponse entre les deux. Code du worker · Code du dialogue.
Human waiting consumes no Lua execution budget. Each resume gets the VM’s configured budget; the outer 2-second watchdog only covers active execution. Cancelling the dialogue, pressing Escape or clicking Stop ends this example. A Promise returned by a JavaScript callback is not automatically awaited by Lua: suspension and resumption are explicit.L’attente humaine ne consomme aucun budget d’exécution Lua. Chaque resume reçoit le budget configuré sur la VM ; le watchdog extérieur de 2 secondes ne couvre que l’exécution active. Annuler le dialogue, appuyer sur Échap ou cliquer sur Arrêter termine cet exemple. Une Promise renvoyée par un callback JavaScript n’est pas attendue automatiquement par Lua : la suspension et la reprise sont explicites.
Translate Lua source to JavaScriptTraduire du Lua en JavaScript
Paste Lua, get readable JavaScript you can keep. Translation runs in your browser; nothing is uploaded.Collez du Lua, obtenez un JavaScript lisible à conserver. La traduction s’exécute dans votre navigateur ; rien n’est envoyé.
This is the offline translator behind lua2js and PyroeisVm.toJs() from Pyroeis. It prints idiomatic JavaScript from the Lua source and marks with TODO(lua2js) whatever it cannot translate faithfully. The benchmark below runs the same function as Lua in Pyroeis’s interpreter and as the translated JavaScript. See also the Pyroeis vs JavaScript benchmark.Voici le traducteur hors-ligne derrière lua2js et PyroeisVm.toJs() de Pyroeis. Il produit un JavaScript idiomatique à partir du source Lua et marque avec TODO(lua2js) ce qu’il ne peut pas traduire fidèlement. Le benchmark ci-dessous exécute la même fonction en Lua dans l’interpréteur Pyroeis et en JavaScript traduit. Voir aussi le benchmark Pyroeis face à JavaScript.
Lua
JavaScript
BenchmarkBenchmark
Calls entry(n) in Lua (Pyroeis interpreter, vm.call) and in the translated JavaScript. For a built-in example, the original hand-written JavaScript is timed too. Results must match.Appelle entry(n) en Lua (interpréteur Pyroeis, vm.call) et en JavaScript traduit. Pour un exemple intégré, le JavaScript original écrit à la main est aussi chronométré. Les résultats doivent concorder.
| VersionVersion | Time per callTemps par appel | vs interpreted Luaface à Lua interprété | Time, log scaleTemps, échelle log | ResultRésultat |
|---|
What to knowÀ savoir
Arrays are shifted to 0-based, nil is undefined, if x becomes truthy(x) because Lua treats 0 and "" as true, and multiple returns become arrays. Literal Lua patterns become RegExp calls; metatables, coroutines, patterns using %b or %f, general goto and 64-bit bitwise operators are not translated. The benchmark executes the translated code in this page, so only run Lua you wrote or trust.Les tableaux passent en base 0, nil devient undefined, if x devient truthy(x) car Lua considère 0 et "" comme vrais, et les retours multiples deviennent des tableaux. Les motifs Lua littéraux deviennent des appels RegExp ; métatables, coroutines, motifs utilisant %b ou %f, goto général et opérateurs bit à bit 64 bits ne sont pas traduits. Le benchmark exécute le code traduit dans cette page : n’y lancez que du Lua écrit par vous ou de confiance.