CodeGeneration[Java] - Maple コードの Java コードへの変換
使い方
Java(x, cgopts)
パラメータ
x - 数式、リスト、配列、rtable、手続き、またはモジュール
cgopts - (オプション) 1つまたはそれ以上の CodeGeneration オプション
|
説明
|
|
•
|
Java 関数は、Maple のコードを Java コードに変換します。パラメータ x が代数式の場合、その数式に1つの変数を割り当てる形で1つのJava の命令文が生成されます。パラメータ x がリスト、rtable または Maple の配列の場合、それら要素をJava 配列に割り当てる形で、Java の命令文の列が作成されます。rtable または Maple の配列では、初期化された要素だけが変換されます。
|
•
|
パラメータ x が nm=expr の形のリスト(ここで nm は名前、exp は代数式を表す)である場合、x は割り当てられた命令文の列を意味するものとして解釈されます。この場合、等価な意味を持つ Java の割り当て命令文の列が生成されます。
|
•
|
パラメータ x が Maple の手続きである場合、必要な入力文と共に、手続きと等価な関数を含む Java のクラスが1つ生成されます。
|
•
|
パラメータ x がモジュールの場合、ある一つのJava クラスが生成されます。 詳細は、JavaDetails に記述されています。
|
|
|
例
|
|
|
単純な数式を変換し、目的のコード内の名前``w'' に割り当てます。
|
>
|
Java(x+y*z-2*x*z, resultname="w");
|
w = x + y * z - 2 * x * z;
| |
|
リストを変換し、目的のコード内にある名前``w'' の配列に割り当てます。
|
>
|
Java([[x, 2*y], [5, z]], resultname="w");
|
w[0][0] = x;
w[0][1] = 2 * y;
w[1][0] = 5;
w[1][1] = z;
| |
|
計算の列を変換します。入力をまず最初に最適化します。
|
>
|
cs := [s=1.0+x, t=ln(s)*exp(-x), r=exp(-x)+x*t]:
Java(cs, optimize);
|
s = 0.10e1 + x;
t1 = Math.log(s);
t2 = Math.exp(-x);
t = t1 * t2;
r = t2 + x * t;
| |
|
x が浮動小数点数、y が整数であることを宣言します。結果は文字列内に返されます。
|
>
|
s := Java(x+y+1, declare=[x::float, y::integer], output=string);
|
| (2.1) |
|
Maple の手続きを変換します。型宣言されていない変数全てが、整数型であると仮定します。
|
>
|
f := proc(x, y, z) return x*y-y*z+x*z; end proc:
Java(f, defaulttype=integer);
|
class CodeGenerationClass {
public static int f (int x, int y, int z)
{
return(x * y - y * z + x * z);
}
}
| |
|
間接的な戻り値を含む手続きを変換します。戻り値を保持するための新しい変数が作成されます。
|
>
|
f := proc(n)
local x, i;
x := 0.0;
for i to n do
x := x + i;
end do;
end proc:
Java(f);
|
class CodeGenerationClass {
public static double f (int n)
{
double x;
int i;
double cgret;
x = 0.0e0;
for (i = 1; i <= n; i++)
{
x = x + (double) i;
cgret = x;
}
return(cgret);
}
}
| |
|
配列をパラメータとして受け入れている手続きを変換します。Java の配列がインデックス 0 から始まるように、添え字の番号は付け直されます。
|
>
|
f := proc(x::Array(numeric, 5..7))
return x[5]+x[6]+x[7];
end proc:
Java(f);
|
class CodeGenerationClass {
public static double f (double[] x)
{
return(x[0] + x[1] + x[2]);
}
}
| |
モジュールを変換します。
>
|
m := module() export p; local q;
p := proc(x,y) if y>0 then trunc(x); else ceil(x); end if; end proc:
q := proc(x) sin(x)^2; end proc:
end module:
Java(m, resultname=t0);
|
import java.lang.Math;
class m {
public static int p (double x, int y)
{
if (0 < y)
return((int)(x));
else
return((int)Math.ceil(x));
}
private static double q (double x)
{
return(Math.pow(Math.sin(x), 0.2e1));
}
}
| |
>
|
Java(2*cosh(x)-7*tanh(x));
|
cg1 = 0.2e1 * (Math.exp(x) + Math.exp(-1.0 * x))/2.0 - 0.7e1 * (Math.exp(2.0 * x) - 1.0)/(Math.exp(2.0 * x) + 1.0);
| |
|
戻り値を持たない、printf 文を含んだ手続きを変換します。
|
>
|
f := proc(a::integer, p::integer)
printf("The integer remainder of %d divided by %d is: %d\n", a, p, irem(a, p));
end proc:
Java(f);
|
class CodeGenerationClass {
public static void f (int a, int p)
{
System.out.println("The integer remainder of " + a + " divided by " + p + " is: " + a % p);
}
}
| |
|
|