少し前の記事の三体問題の所で、天体や人工天体の軌道計算に数式処理を用いて、その際に係数の計算などに必要なので、無限精度(メモリが追いつくまで)の整数と分数の話題を出しました。
現状ではCommon LISPと呼ばれる計算機言語は、しっかりした処理系ではもれなく任意多倍長の整数と分数が使えるはずです。C/C++あたりでもライブラリはありそうですが、標準化されているかどうかは知りません。
その昔、大学を卒業した私が嬉々として自分のNEC PC-9801 F2を使っていた頃の話。CPUは普通のインテル8086で、浮動小数点加速機構の8087を追加して贅沢な気分になったりしていて。
基本ソフトはマイクロソフトのMS-DOSですから、IBM PC-AT互換機のソフトも少数は翻訳されてPC-9801で動作しました。私のお気に入りはNEC純正のFORTRAN言語(プラス当時のMS-DOSに同梱のアセンブラ(MASM, LINKなど)で現在のC言語の位置づけ)でしたが、人工知能が流行し始めた時代でもあり、この際LISPは何としてでもものにしておきたい、の雰囲気でした。
LISPは処理系を実際に使わないと理解しがたい言語と思います。一つは構文が全く違うからで、たとえばC言語の、
c = a + b;
の代入文はCommon LISPだと、
(setq c (+ a b))
と書きます。慣れると恐ろしいもので、こちらの方が計算機が何をしているかがよく分かったりします。嘘と思う方は、理系の職場にたまにいるLISPER(LISPをこよなく愛する人々)にこの話題を振ると数十分間は(無料で)講釈してくださると思います。
しかし、これはまだましな方で、本編はリスト処理、つまりcar、cdr、cons、eq、ええとあと一つ何だったか、の純LISPの5関数とか、プログラムを組むための特殊形式(special form: 関数の形をしているが関数では無い(関数とは違う「副作用」(主にメモリ操作と入出力)をむしろ期待する)式)のquote、condなどの理解です。setqも普通はスペシャル・フォームだと思います。
で、当時の大型電子計算機の計算機使用料は学生でも有料ですからあまり期待せずに探していたら、muLISP(一部でハワイアンLISPと呼ばれていた)と呼ばれるMD-DOSで動作するLISP処理系が売り出されたので、買ってみました。媒体は初期のは5インチ・フロッピーディスクです。アクセスする際には、かっちゃんこかっちゃんこと、いかにもそれっぽい音を立てます。ちなみに容量は1MB(メガバイト)程度です。
このmuLISPが恐ろしく良く出来たLISP処理系で、今のこの時代でも紹介したくなった訳。基本的にはCommon LISPの構文を使っていますが、当時のことですからLISPは処理系だけLISPの独自文法がある、と言われていた時代ですから、当然、このmuLISPも独自性を誇っていました。
手元にmuLISP-87のマニュアルがあるので見てみたら、いわゆるマクロはありますが、Common LISPでは使える略記構文用の「`」バッククォートとカンマ括弧「,( )」が無いみたいです。PC-9801のキーボードは最後期までバッククォートのキーをかたくなに拒否していたので、素直に打てません。なので、私はちっとも(ASCII/JIS非準拠の)PC-9801を評価しておらず、早く(ASCII/JIS準拠の)DOS/Vが主流になれ、と、このつまらない理由で思っていたものです。
面白いのは、LISPのオブジェクト指向の一つ、フレーバーの構文が一部採用されていたみたいです。さすが、西海岸LISP。ただし、私は使ったことがありません。何もしないのがバニラフレーバーとか、いささか悪趣味な命名だったのを思い出します。今はCLOSと呼ばれる(東海岸)LISPのオブジェクト指向が主流と思います。
ううむ、やぶ蛇というか、いくらでも当時のことを想起しますです。面白い話になると私が思う範囲で続きが書けるようなら続きます。