2

私はこの問題を抱えています。私はインタプリタを書いてから、FortranをJavascriptに変換するTranspilerを書いた。しかし、たびに、私は変数の参照渡しの問題に立ち往生した。FortranをJavascriptに変換する

Fortranで知っているように、参照渡しと値渡しの構文は異なりますが、すべて同じように見えます。しかし、Javascriptでの参照渡しは、変数が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)を実行するライブラリがあれば、私は不思議に思っていました。私は今まで、誰もこの問題を以前に失うことを試みたことは想像できません。

怠惰なハックを体系的にJSオブジェクトに関数に渡された変数を埋め込むことであろう
+0

あり、現代のFortranに値渡しですが、それはここでは重要ではありません。変数をリストに渡すことはできませんか? Emscriptenを見たことがありますか?ここでは図書館のことを話題にしています。 –

+0

もちろんFortranには値渡しがあります。この例ではPYTHAGORAS(B、H、E)_ // BとHの呼び出しは値渡しですが、Eは参照渡しです。 Emscriptenは知っていますが、まだ試していません。 FortranをC++に変換してからJavascriptに変換する方がより複雑になると思います。 – Kamal

+2

いいえ、そうではありません。すべて参照渡しです。値渡しするには、Fortran 2003で導入された 'VALUE'キーワードを使用する必要があります。 –

答えて

3

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のidee素晴らしい!私はあなたの解決策を試してみるつもりです。 – Kamal

関連する問題