Lispで中置記法
EusLispのmathtran.lにも中置記法をlispで書くためのコードがあると聞きました。
しかし、こちらは私のものと違い、配列なども扱えるそうです。
という訳で、対抗してみました。
色々拡張できるように書いたので、マクロの定義は一切変えずに済みました。
(def-op-parser test-parser (input stack acc) () (((#\+ 2 :left) (let ((x (pop acc)) (y (pop acc))) (push `(+ ,y ,x) acc))) ((#\- 2 :left) (let ((x (pop acc)) (y (pop acc))) (push `(- ,y ,x) acc))) ((#\= 1 :right) (let ((x (pop acc)) (y (pop acc))) (push `(setf ,y ,x) acc))) ((#\* 3 :left) (let ((x (pop acc)) (y (pop acc))) (push `(* ,y ,x) acc)))) ((( #\( #\) ) ) (( #\[ #\] ) (let ((x (pop acc)) (y (pop acc))) (push `(aref ,y ,x) acc)))) #\}) (set-dispatch-macro-character #\# #\{ #'test-parser)
で、このように準備しておけば上手くいきます。
#{a[2*3] = 5-4} --> (SETF (AREF A (* 2 3)) (- 5 4))
やったね。