2018-04-26-01-guile 拡張が動き始めた - project-enigma

2018-04-26-01-guile 拡張が動き始めた

>> Site top >> weblog >> 月別アーカイブ >> 2018年04月のlog >> 2018-04-26-01-guile 拡張が動き始めた

最終更新日付:2018/04/26 20:18:48


guile 拡張が動き始めた

2018 年 04 月 26 日

今月の始めに少し書いたけれど、その後専念したおかげで steam に guile 拡張を導入することに成功した。twitter ではちょいちょいと書いてはいたが、実際にはそれほど難しいことはなく、既存の steam コマンドへのブリッジとなる関数を定義して環境を初期化してやったくらいだ。

 

一番難儀したのは、scheme の REPL の提供だ。元々 libguile には scm_shell 関数というのがあって、それを呼ぶと guile を普通に起動した場合と同じ REPL が利用できる。しかし、その REPL で quit するとアプリケーションごと終了してしまうという片道切符仕様。これを回避する方法を探したが見つからず、C++ で scheme の REPL を自作するか、REPL の提供は諦めて guile -s のイメージでスクリプト実行だけと割り切るか、の選択で悩んでいた。そのどちらでもない解決方法に思い至ったのは、掛値なしになんの前触れもなく、突然だったように思う。今から考えれば別に凄いアイデアでも何でもないのだけれど、「REPL自体を scheme で書けるじゃないか」というものだった。要するに、Lisp の書籍を読んでいれば何度も目にする、(loop (print (eval (read)))) というやつだ(これは scheme ではないけど)。もちろん、プロンプトを出したりその他の雑事をこなす必要があるからここまで単純にはならないけれど、C/C++ で書くことを考えれば比較にならないほどシンプルな話になる。そうやって作った REPL を、文字列にして scm_c_eval_string 関数に渡してやれば良い。それだけで、自分のアプリケーションから guile の REPL を起動し、終了したらまたはアプリケーションを再開できる。実際には quit 関数の内容をすりかえたりとかも必要だが、それも前述の『雑事』のうちだ。

これで、複雑なスクリプトを作りたければ scheme が使えることになる。もう bash を模倣した自作スクリプティングの中途半端さに苦しむこともない‥‥‥とはいえ、今後は不慣れな scheme に苦しむことになるのだろうけれど(でもそれは scheme が悪いワケじゃない)。

とはいえ、guile 拡張対応が完全に終わったわけじゃない。タイトルだって「完成した」じゃなくて「動き始めた」だからな。エラー発生時の例外処理がまだ不完全だし、Linux 環境でのテストも終わって(というか始まっても)いない。でもひとまず動くようになったのだから、とりあえず使い始めることができる。今日はいい日だ。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : 開発

Page tag : steam

 

 


Copyright(C) 2005-2018 project-enigma.
Generated by CL-PREFAB.