Lispと一緒(41) ラズパイPico2でもuLisp、uLisp to C 変換

Joseph Halfmoon

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 関数が使用可能となります。ロードすべきコンバータ・プログラムの在処は以下に。

uLisp to C converter

なお、解説ページから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版」で実験してみました。コンパイラのバージョンは以下です。gccVersion

変換実験のターゲットは、前々回のコンパイラの回で使わせていただいた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))))

上記を変換したところが以下に。takConverted

なんだかな~、一応Cみたいだけれども、Lispっぽいコードだよね~。

適当に上記のtak関数を呼び出すmain関数を書いてコンパイルしてみると以下のようです。takCompileERROR

そうだよね。うまく通らんわね。

「自主」修正後のソースが以下に。takSample

上記は問題なくコンパイルできました。あたりまえか。実行結果が以下に。takExecuted

まあ、変換後、ひと手間必要と思っていたら間違いない?

Lispと一緒(40) ラズパイPico2でもuLisp、uLispのエディタ へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です