数式処理ソフト Magma 入門


最近 Magma という数式処理ソフト(シェアウェア)を使ってプログラムを書く機会があったので、Magma言語についてまとめます。大体C言語に似ていますが、代入・比較演算子やforループの使い方が異なっています。また、スクリプト言語同様、変数宣言は不要で、変数に型はありません。

公式サイト

http://magma.maths.usyd.edu.au/magma/
Magma言語に関する詳しい情報は上記サイトの DocumentationHandbook から入手できます。

Hello world!

> print "Hello world!";

print以外のMagma組込関数の名前は先頭が大文字で始まる CamelCase になっています。

変数

変数名には[a-zA-Z0-9_]が使え(先頭は数字以外)、大文字小文字は区別されます。変数宣言は不要で、型はありません。代入には = ではなく := を使います。

> x := 12345;

詳細はこちら

リテラル(型)

文字列:
配列:


範囲:
Boolean:
"string"
[1, 2, 3, 4, 5] ( ← 同じ型の値しか入れられない)
[* 1, 2, 3, "various" *] ( ← いろいろな型の値を入れられる)
その他
[1..5]
true, false

などなど

コメント

C言語と同じです。

> // ここはコメント
> /*
> ここもコメント
> */

基本的な演算子

算術演算子

> 3 + 2;    // 5
> 3 - 2;    // 1
> 3 * 2;    // 6
> 3 / 2;    // 3/2 (有理数)
> 3 ^ 2;    // 9
> 3 div 2;  // 1 (C言語の 3 / 2)
> 3 mod 2;  // 1 (C言語の 3 % 2)

比較演算子

> 3 eq 2;   // → false (C言語の 3 == 2)
> 3 ne 2;   // → true  (C言語の 3 != 2)
> 3 lt 2;   // → false (C言語の 3 < 2)
> 3 le 2;   // → false (C言語の 3 <= 2
> 3 gt 2;   // → true  (C言語の 3 > 2)
> 3 ge 2;   // → true  (C言語の 3 >= 2)

論理演算子

> true and false;   // → false
> true or false;    // → true
> true xor false;   // → true
> not true          // → false

ビット演算

> ShiftLeft(3, 2);      // → 12 (C言語の 3 << 2)
> ShiftRight(7, 1);     // → 3 (C言語の 7 >> 1)
> ModByPowerOf2(26, 4); // → 10 (26の下位4ビット)

その他

> 3 in [1..5];                          // → true
> 3 notin [1..5];                       // → false
> "value: " cat IntegerToString(123);   // → "value: 123" (文字列連結)

制御文

分岐

> if boolexpr then
>   statements1
> elif boolxpr2 then
>   statements2
> else
>   statments3
> end if;

ループ

> // 範囲
> for i in [1..3] do
>   statments
>   // break;
>   // continue;
> end for;
>
> // 配列
> for i in ["a", "b", "c"] do
>   statments
> end for;
>
> // 真偽
> while 0 le x do
>   statments
> end while;

C言語と同様に、breakやcontinueが使えます。

関数

> function example_func(a, b)
>   return a + b;
> end function;
>
> example_func(2, 3);
5

これで足し算をする example_func が定義されます。C言語の関数ポインタを代入している感じです。関数を別の関数に引数として渡すこともできます。

戻り値を返さない処理の場合には procedure を使います。

> procedure print_sum(nums)
>   total := nums[1];
>   for i := 2 to #nums do
>       total +:= nums[i];
>   end for;
>   
>   print total;
> end procedure;
>
> print_sum([1, 2, 3, 4, 5]);
15

関数のプロトタイプ宣言

C言語と同様に関数のプロトタイプ宣言が必要です。以下の様に宣言します。

> forward func1;
> forward func2;

外部ファイルの読み込み

以下の様にします。C言語の include "file_name"; と似ています。

> load "file_name";

配列とリストと連想配列

配列やリストに関する詳細はこちら

以下の様に連想配列を定義できます。

> assoc := AssociativeArray();
> assoc["name1"] := obj1;
> assoc["name2"] := obj2;

※インデックスと値には文字列以外も指定できますが、一つの連想配列のインデックスと値はそれぞれ同じ型でなければいけません。

連想配列に関する詳細はこちら

例外処理

例外を発生させるには以下の様にします。

> error EXPRESSION, ..., EXPRESSION;

または

> error if boolexpr, EXPRESSION, ..., EXPRESSION;

また、構造化例外処理が可能です。

> try
>   error Error("sample error"); // 引数には任意の型を指定可能
> catch e
>   print e;
> end try;

例外処理に関する詳細はこちら

処理時間の測定

MAGMA の Cputime 関数を使うと処理時間を測定できます。

サンプルコード

c := Cputime();
some_calc();    // 時間を測りたい処理
c := Cputime(c);
print c, "seconds by MAGMA.";
exit;

また、exit で MAGMA を終了すると、開始からの処理時間が表示されます。

$ magma
> exit;
Total time: 0.559 seconds, Total memory usage: 7.56MB

Alarm 関数を使うと、処理が一定時間を超えた場合に強制的に中断させることができます。

Alarm(60);  // 以降の処理で60秒経過すると MAGMA プロセスに SIGALRM が送られ、処理が中断される
some_calc();
…

よく使う関数

Ilog2(n) Ilog(b, n) Quotrem(m, n)

その他

組み合わせ(Combination)

[amazon]4822283151[/amazon]

カテゴリー: 記事 タグ: , , , パーマリンク

コメントを残す