「uLisp公式」ではuLispをビルドするのに使ったArduino IDEのシリアル・モニタを開発環境に使うことを推奨しているみたいです。uLispに欠けている行編集機能を補える上に何となれば処理系の再生成も可能。しかし当方Teraterm Proで作業中。lispのソースを編集、アップロードするのに便利なので。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
uLispに欠けている行編集機能とシリアル・モニタ
uLispのREPLを仮想シリアル端末から操作していて不便に感じるのは、REPLに行編集機能が欠けていることです。「おっと1文字打ち間違えたぜ」と思ってBSキーなどつい触ってしまうと、BSという未知のキャラクタのためにエラーが発生。最初から打ち直しっと。
その点、Arduino IDEのシリアル・モニタは1行ごとに編集してからuLisp側へ送信できるので、そのような不便はありません。ただしシリアル・モニタを介してuLispのソースをアップロードしたり、結果LOGを残したりという場合には「手動」コピペを駆使するしかありませぬ。またシンプルなシリアル・モニタなのでオートパイロット的なことはできないと思います。
Tera Term ProにuLisp用のマクロを一枚かぶせてみた
Lisp素人老人は uLisp の「開発環境」としては伝統のTera Term Proを使わせていただいております。マイコン開発でシリアルターミナルを使う場合よく使われているのではないかと思います。老人も長年お世話になっております。
Tera Term自体は、ネットワーク経由でSSH接続するときのターミナルソフト的な使われ方が現在の主力かとも思いますが、元々はシリアル通信用でなかったかと思います。そのためオートパイロットとかファイルのアップロード、ダウンロード、ログの記録など各種機能が充実してます。
そこでuLisp用にTera Termマクロを一枚「被せて」みましたぞ。まずメニュー用のマクロ(menu.ttl)が以下に。
; menu editor = 'notepad' strdim msg 6 msg[0] = 'Exit Menu' msg[1] = 'REPL(Line Editor)' msg[2] = 'Edit uLisp source' msg[3] = 'Upload uLisp source' msg[4] = 'Creat Log and start' msg[5] = 'Close Log' menu=1 while menu listbox 'Select Command' 'Menu' msg if result = 0 then menu = 0 goto nxt elseif result = 1 then include 'repl_loop.ttl' goto nxt elseif result = 2 then filenamebox 'File to edit' 0 if result<>0 then editorcmd = '' strconcat editorcmd editor strconcat editorcmd ' ' strconcat editorcmd inputstr exec editorcmd 'show' 0 endif goto nxt elseif result = 3 then filenamebox 'File to upload' 0 if result<>0 then sendfile inputstr 0 messagebox inputstr 'Upload' 0 endif goto nxt elseif result = 4 then gettime timestr "%Y%m%d-%H%M%S" sprintf2 logfilename 'LOG_%s.log' timestr messagebox logfilename 'Create LOG file' 0 logopen logfilename 0 0 goto nxt elseif result = 5 then messagebox 'Close LOG file' 0 logclose goto nxt endif :nxt endwhile exit
なお、老人は冒頭のeditor変数のところをこれまた伝統的で30年以上もお世話になりっている秀丸エディタに向けてあるのですが、上記では notepad にしてみましたぜ。
そして上記のメニュー用マクロから呼び出す、REPL用の行編集用マクロ(repl_loop.ttl)が以下に。
; repl loop with line editor repl=1 while repl inputbox 'ZZ for Exit> ' 'Line Editor for uLisp REPL' strcompare inputstr 'ZZ' if result = 0 then repl = 0 else send inputstr endif endwhile exit
マクロの使用
-
- マクロの設置
上記の menu.ttl と repl_loop.ttl の2つを同じフォルダ(読み書きできるフォルダが良いです)においておくと、以降の操作はそのフォルダをカレントにして起こるので便利じゃないかと思います。
-
- MENUマクロの起動
以下のように コントロール >> マクロ からマクロの指定用ウインドウが開くのでそれを使って menu.ttl を起動します。初回は設置したフォルダの在処を認識していないので、多分Tera Termのインストールディレクトリを向いてますが、一度起動すれば覚えるのでお楽。
-
- メニュー画面
上記のようなウインドウが現れるので、該当項目をクリックして青地に変えてから「はい」キーを押すと該当機能が発動します。なお上記のExit Menuで「はい」を押すとメニューを終了し、マクロから抜けます。
-
- 1行編集可能なREPL入力
REPL(Line Editor)を選ぶと、以下のような1行入力用のウインドウが現れ、その入力行の中で uLispへ送信する内容を行編集(BSキーや左右矢印キーなど利用可)できます。OKを押すとuLispへ送信され、結果は通常どおり表示されます。
-
- 外部エディタの起動機能
Edit uLisp sourceを選ぶとファイル選択画面(メニューと同じフォルダがデフォルト)が表示され、選択したファイルを対象に外部エディタを起動できます。老人は秀丸エディタを愛用。こんな感じ。
お好みのエディタを使って uLisp のソースを編集できます。お好み設定でお楽。
-
- uLispソースのアップロード機能
Upload uLisp source を選ぶと以下のようなファイル選択画面が表示され、選択したファイルをuLispにアップロードすることができます。
-
- 実行ログの取得
Create Log and startを選択すると、日時を使ったキメウチのファイル名でLOGが生成されます。
それ以降の通信が全てロクファイルに落ちて記録されるのでお楽。
実際に記録されたログはこんな感じ。
(read-trng) (-1279700978 -1945128058 -855103044 1855706206 251828877 -357254905) 22816> (read-trng) (2119829074 -119850903 460671810 -287110249 -320690878 389110549) 22816>
-
- ログファイルのクローズ
Close Log を選択するとLOGファイルは閉じられます。
マクロで多少はお楽になった?