現在、非常に限定されたオブジェクト指向言語のコンパイラを開発中です。すべての値をオブジェクトとして扱い、それらの値の演算子をメソッドとして実装します。コンパイラは、プログラムをスタックベースの仮想マシンのアセンブラに変換します。プロシージャを使用した短絡評価
コンパイル時に、整数リテラルを特殊な「整数」クラスのオブジェクトに変換します。算術演算子は、そのクラスのメソッドとしてインラインアセンブラを使用して実装されます。したがって、4 + 5
は、基本的には4.add(5)
に等しい。
私が今直面している問題は、ブール値の特殊な場合です。 if
の文がある場合:今、明らかにそれらの整数リテラルも副作用を持つ関数の呼び出しすることができ10.greaterThan(5).or(12.lessThan(10))
:
if(10 > 5 || 12 < 10)
これは、現在に変換されるだろう。これらのバイナリ演算子をメソッド呼び出しとして実装すると、短絡評価が不可能になるため、この場合に問題が発生します。
だから私の質問は以下のとおりです。
どのように他の言語は短絡評価を達成しないが、それでもオブジェクトとしてすべての値を処理しますか?
ウィキペディアによると、 "ALGOL 68は"手続き "を使ってユーザ定義の短絡オペレータ&プロシージャを実現しています。" - これはどのように作動しますか?