uLisp上の「セルフ」開発ツール、アセンブラ、コンパイラ、そして前回のエディタと経めぐってきましたが、今回は「クロス開発?」向けのコンバータです。uLisp関数をCのソースコード形態に変換してくれるもの。Arduino環境へ輸出すれば「セルフ」にもなり。しかし「コマケーことはいいんだよ」な感じです。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
Automatic uLisp to C converter
コンバータに関する解説ページが以下に。
Automatic uLisp to C converter
過去回のアセンブラ、コンパイラなどと同様に、uLispで書かれたプログラムをロードすることで、以降 uLisp関数を 「Cのソース」に変換する lisp-to-c 関数が使用可能となります。ロードすべきコンバータ・プログラムの在処は以下に。
なお、解説ページから1か所引用させていただくと
leaving just a bit of tidying up to do.
だそうです。コンバート単位は1個のuLisp関数を1個のC関数へです。
ターゲットのCコンパイラは特に指定されていないので「汎用」ではありますが、uLisp自体がArduino IDE環境に依存しているので、Arduinoで使われるdigitalwriteなどの関数はuLispからCへ素直に変換してくるみたい。uLispで書いたプロトタイプをArduino環境のC(CPP)ソースに変換するお手伝い用という感じですかね。
変換実験
今回はことさらに「一枚被ってない素のgcc、Windows上のMSYS2版」で実験してみました。コンパイラのバージョンは以下です。
変換実験のターゲットは、前々回のコンパイラの回で使わせていただいたtak関数(竹内関数のマッカーシー先生改造版?)です。
上記の解説ページをみると「うまく行く例」が挙げられてますが、このtak関数は変換後、素のままではエラーとなります。
まず元のuLispコードが以下に。
(defun tak (x y z) (if (>= y x) z (tak (tak (1- x) y z) (tak (1- y) z x) (tak (1- z) x y))))
なんだかな~、一応Cみたいだけれども、Lispっぽいコードだよね~。
適当に上記のtak関数を呼び出すmain関数を書いてコンパイルしてみると以下のようです。
そうだよね。うまく通らんわね。
上記は問題なくコンパイルできました。あたりまえか。実行結果が以下に。
まあ、変換後、ひと手間必要と思っていたら間違いない?