2

Je perds la tête avec ce problème. J'ai écrit un interprète puis un Transpiler pour convertir Fortran en Javascript. MAIS chaque fois que je suis coincé avec le problème de passer variable par référence.Conversion de Fortran en Javascript

Comme vous le savez dans Fortran, il n'y a pas de syntaxe différente entre passer par référence ou passer par valeur, tous ont la même apparence. Cependant, en Javascript, passer par référence ne peut fonctionner que si la variable est passée dans un objet.

exemple de code Fortran:

REAL FUNCTION PYTHAGORAS (A,B,K) 
REAL A,B,K 
K = 12 // E <=> K in GEOMETRIE() 
PYTHAGORAS = SQRT(A**2+B**2) 
END FUNCTION PYTHAGORAS 

LOGICAL FUNCTION GEOMETRIE (H,B,D) 
REAL H,B,D,E 
B = 12 
H = 7 
// E is pass by reference, it's gonna be changed in PYTHAGORAS() 
D = PYTHAGORAS(B, H, E) 
GEOMETRIE = .TRUE. 
END FUNCTION GEOMETRIE 

je l'ai fait beaucoup de recherches, mais jusqu'à présent, je ne trouve aucun résultat utile.

Je me demandais, s'il y a une bibliothèque là pour faire le travail (côté client/NodeJS). Je ne peux pas imaginer que jusqu'à présent, personne n'a essayé de perdre ce problème avant.

+0

Il y a passe par la valeur en Fortran moderne, mais il est important. Tu ne peux pas passer la variable dans une liste? Avez-vous regardé Emscripten? Demander une bibliothèque est hors-sujet ici BTW. –

+0

bien sûr il y a une valeur de passage dans Fortran, comme vous pouvez le voir dans l'exemple, l'appel de PYTHAGORAS (B, H, E) _ // B et H sont passés par valeur, mais E est passé par référence._ Je connais Emscripten, mais je ne l'ai pas encore essayé. Je pense que ce sera plus compliqué de convertir Fortran en C++ puis en Javascript. – Kamal

+2

Non, ils ne sont pas, tous sont passés par référence. Pour passer en valeur, vous devez utiliser le mot-clé 'VALUE' introduit dans Fortran 2003. –

Répondre

3

Un hack paresseux serait d'intégrer systématiquement ces variables passées aux fonctions dans un objet JS:

function PYTHAGORAS(obj /* A B K */) { 
    obj.K = 12; 
    return Math.sqrt(obj.A * obj.A + obj.B * obj.B); 
} 

function GEOMETRIE(obj /* H B D */) { 
    var E; 
    obj.B = 12; 
    obj.H = 7; 

    obj.D = PYTHAGORAS({A:obj.B, B:obj.H, K:E}); 
    return true; 
} 

var res = {H:0, B:0, D:0}; 

GEOMETRIE(res); 
console.log(res); 

Sortie:

Object { H=7, B=12, D=13.892443989449804 } 

Cela peut fonctionner raisonnablement bien dans l'hypothèse d'un automatique traduction de la liste originale, et le code JS résultant serait facile à comparer avec le code original FORTRAN. Maintenant, il va être inutilement verbeux et surchargé, par opposition à une réécriture manuelle complète.

EDIT: une autre version avec des variables vraiment séparées

function PYTHAGORAS(A, B, K) { 
    K.val = 12; 
    return Math.sqrt(A.val * A.val + B.val * B.val); 
} 

function GEOMETRIE(H, B, D) { 
    var E = {}; 
    B.val = 12; 
    H.val = 7; 

    D.val = PYTHAGORAS(B, H, E); 
    console.log('E = ' + E.val); 
    return true; 
} 

var H = {} 
, B = {} 
, D = {}; 

GEOMETRIE(H, B, D); 
console.log('H = ' + H.val + ', B = ' + B.val + ', D = ' + D.val); 

Sortie:

E = 12 
H = 7, B = 12, D = 13.892443989449804 
+0

l'idee est géniale, mais ça ne marchera toujours pas, parce que comme je l'ai mentionné, E devrait passer par référence et il sera changé dans PYTHAGORAS en K (ou obj.K). Donc avant le retour vrai; E devrait être 12 et non 0. – Kamal

+0

Vous avez raison. S'il vous plaît voir la version alternative dans ma réponse éditée. – Arnauld

+0

Merci @Arnauld, l'idée d'obj.val c'est génial! Je vais essayer votre solution. – Kamal