LISPで中置記法 — #:g1

Posted 2012-03-21 00:27:00 GMT

LISPで中置記法云々の話は良く話題になりますが、1960年代に存在したLISP 2が、中置で書いたものをS式に変換するというものだったようなので、かなり昔からあるようです。
ソースコードを変換する以外にもLOOPのようにDSL的に実現してみたりもありますが、CADRを始めとするMIT Lispマシンでは、リーダーマクロで中置を混在させることができたようで、マニュアルにも載っています。(24. Expression Input and Output)
導入されたのは、1983年の9月のSystem 97からのようで、LMIや、Symbolicsはこれらの成果を取り込んでいるので、MIT系のLispマシンは標準で中置記法もサポートしていたということになります。 (ちなみにSystem 97のリリースのアナウンスはRMS担当)
CADRや、LMI Lamabdaのソースを眺めるとinfix.lispがありますが、面白そうなのでCLで動くようにしてみました。

使い方としては、#◊から◊までを中置記法で書きます。
(defun fib (n &optional (a1 1) (a2 0))
  #◊
  if n = 1 then
    a1
  else if zerop(n) then
         a2
       else
         fib(n - 1, a1 + a2, a1)
  ◊)

(fib 10) ;=> 55

という感じ。(詳しくは、README参照)
シンボルのプロパティリストを大活用しているので、thenや、elseを始めとして、|,|諸々も、定義されたシンボルでないと上手く動かないというのがちょっと面倒です。
TAOでも、中置記法で書けたりしますが、Lispマシンでは、中置記法をサポートするというのは結構普通のことだったのかもしれません。■

comments powered by Disqus