2

Я схожу с этой проблемой. Я написал интерпретатора, а затем Transpiler для преобразования Fortran в Javascript. НО каждый раз, когда я застрял с проблемой передачи переменной по ссылке.Преобразование Fortran в Javascript

Как вы знаете, в Fortran нет синтаксиса, отличного от pass by reference или pass by value, все выглядит одинаково. Однако в Javascript pass by reference может работать только, если переменная передана в Object.

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 

Я сделал много исследований, но до сих пор я не нашел каких-либо полезного результата.

Мне было интересно, есть ли там библиотека для выполнения задания (клиентская сторона/NodeJS). Я не могу себе представить, что до сих пор никто не пытался потерять эту проблему раньше.

+0

Там попадающей значением в современном Фортране, но это не важно. Не можете ли вы передать переменную в списке? Вы взглянули на Emscripten? Просить библиотеку вне темы здесь BTW. –

+0

, конечно, в Fortran есть проход по значению, как вы можете видеть в примере, вызов PYTHAGORAS (B, H, E) _ // B и H передается по значению, но E проходит по ссылке. Я знаю Emscripten, но еще не пробовал. Я думаю, будет сложнее преобразовать Fortran в C++, а затем в Javascript. – Kamal

+2

Нет, они не являются, все передаются по ссылке. Чтобы пройти по значению, вы должны использовать ключевое слово «VALUE», введенное в Fortran 2003. –

ответ

3

Ленивый хак будет систематически вставлять переменные, передаваемые функции в объект 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); 

Выход:

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

Это может работать достаточно хорошо в гипотезе автоматизированным перевод исходного списка, а полученный JS-код будет легко сравнить с исходным кодом FORTRAN.

Теперь это будет излишне подробный и перегруженный, в отличие от полного ручного переписывания.

EDIT: альтернативный вариант с действительно разделенными переменными

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

Выход:

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

Идея велика, но все равно не сработает, потому что, как я уже упоминал, E должен пройти по ссылке, и он будет изменен в PYTHAGORAS как K (или obj.K). Поэтому, прежде чем вернуться верно; E должно быть 12, а не 0. – Kamal

+0

Вы правы. См. Альтернативную версию в моем отредактированном ответе. – Arnauld

+0

Спасибо @Arnauld, идеал obj.val это потрясающе! Я попробую ваше Решение. – Kamal

Смежные вопросы