Lisp and Maxima (Maxima 5.46.0 Manual)

Next: Garbage Collection, 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`を使って、 （１つか複数のフォームを含む）Lispの一行を実行できます。例えば、

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

は、Lisp関数`foo`をMaxima変数`x`, `y`を引数としてコールします。 `:lisp`構成子は 対話プロンプトや`batch`や`demo`によって処理されるファイルの中で使えますが、 `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: Garbage Collection, Previous: Program Flow, Up: Program Flow [Contents][Index]