Next: , Previous: Program Flow, Up: Program Flow   [Contents][Index]

37.1 Lisp and Maxima

MaximaはLispで書かれており、 Lisp関数や変数をMaximaからアクセスしたり、その逆が簡単にできます。 LispとMaximaのシンボルは命名の慣例で区別されます。 ドル記号$で始まるLispシンボルは、ドル記号なしのMaximaシンボルに対応します。 クエスチョンマーク?で始まるMaximaシンボルは、クエスチョンマークなしのLispシンボルに対応します。 例えば、MaximaシンボルfooはLispシンボル$FOOに対応し、 Maximaシンボル?fooはLispシンボルFOOに対応します。 ?fooは、?fooの間にスペースを入れずに書くことに注意してください。でないと、それはdescribe ("foo")に間違えられます。

Lispシンボルの中に、ハイフン-やアスタリスク*、他の特殊文字があれば、 Maximaのコードの中では、バックスラッシュ\でエスケープしないといけません。 例えば、Lispの識別子 *foo-bar*は、Maximaでは、?\*foo\-bar\*と書きます。

Maximaセッションの中で、Lispコードを実行できます。 特殊コマンド:lispを使って、 (1つか複数のフォームを含む)Lispの一行を実行できます。例えば、

(%i1) :lisp (foo $x $y)

は、Lisp関数fooをMaxima変数x, yを引数としてコールします。 :lisp構成子は 対話プロンプトやbatchdemoによって処理されるファイルの中で使えますが、 load, batchload, translate_file, compile_fileが 処理するファイルの中では使えません。

関数to_lisp()を実行すると、対話的なLispセッションが始まります。 (to-maxima)を入力すると、Lispセッションを終了してMaximaに戻ります。

Lispの関数や変数を、Maximaで通常の関数名、変数名(特殊な句読点のない名前)に見せるには、 Lispの名前をドル記号$で始めなければなりません。

Maximaでは、識別子の中の大文字、小文字が区別されます。 LispとMaximaの間の名前変換を決めるルールがあります。

  1. 縦棒で囲まれていないLisp識別子は、Maximaの小文字の識別子に対応します。 Lisp識別子が大文字でも小文字でも混ざっていても無視されます。 例えば、Lispの$foo$FOO$Fooはすべて Maximaのfooに対応します。 でも、これはデフォルトで、 Lispリーダが$foo, $FOO, $Fooを Lispシンボル$FOOに変換するからです。
  2. すべて大文字かすべて小文字で、縦棒で囲まれたLisp識別子は、大文字小文字を逆にしたMaximaの識別子に対応します。 例えば、Lispの|$FOO|, |$foo|はそれぞれ、Maximaのfoo, FOOに対応します。
  3. 大文字小文字が混ざっていて、縦棒で囲まれたLisp識別子は、そのままMaximaの識別子に対応します。 例えば、Lispの|$Foo|はMaximaのFooに対応します。

#$Lispマクロを使うと、Maximaの式をLispコードの中で使うことができます。 #$expr$はMaximaの式exprと同値なLispの式に展開されます。

(msetq $foo #$[x, y]$)

これは以下のように入力するのと同じ効果です。

(%i1) foo: [x, y];

Lisp関数displaは、Maximaフォーマットで式を表示します。

(%i1) :lisp #$[x, y, z]$ 
((MLIST SIMP) $X $Y $Z)
(%i1) :lisp (displa '((MLIST SIMP) $X $Y $Z))
[x, y, z]
NIL

Maximaで定義された関数は、通常のLisp関数ではありません。 Lisp関数mfuncallは、Maxima関数をコールします。 例えば:

(%i1) foo(x,y) := x*y$
(%i2) :lisp (mfuncall '$foo 'a 'b)
((MTIMES SIMP) A B)

以下のLisp関数は、Maximaパッケージの中でシャドウされています。

   complement     continue      //
   float          functionp     array
   exp            listen        signum
   atan           asin          acos
   asinh          acosh         atanh
   tanh           cosh          sinh
   tan            break         gcd
Programming ·

Next: , Previous: Program Flow, Up: Program Flow   [Contents][Index]