Prolog 写経記 その 92 edit/1
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
まずは
edit/1
を写経します.解説
edit(File)
は特定の Prolog ソースファイルを編集するためにテキストプロセッサを呼び出す.テキストプロセッサの処理が終了した後,ファイルはリコンサルトされる.
ふむ.
今時のマルチタスクというかマルチウィンドウな環境で必要かは疑問ですが...
っていうか,Windoes 上の SWI-Prolog でちゃんと動くのかも疑問ですが...
モード
edit(+)
ふむ.
定義
では,こいつの定義を写経しませう.
edit(File) :- update_filename(File), name(File, Ascii), conc("EDT ", Ascii, CommandL), name(Command, CommandL), unix(system(Command)), reconsult(File), !. update_filename(File) :- retract(editing(_)), !, asserta(editing(File)). update_filename(File) :- asserta(editing(File)).
うーみゅ...
やってることはコマンドライン文字列を組み立てて,組み込み述語を使ってそれを実行してるだけ.
しかし... Windows で動くのか?
注記
edit/1
はオペレーティングシステムとのインタフェースを提供する,多くの Prolog インタープリタで利用できる.上記の定義においてはオペレーティングシステムのコマンドはsystem/1
によって実行されるが,Prolog システムによってはshell/1
となっている.
オペレーティングシステムのコマンドはエディタの呼び出しとファイル名を結合した (1 章conc/3
参照) 文字列 'EDT file_name'
である.EDT のところに通常使用しているテキストプロセッサの名前を代入すればよい.ただし,名前の後にファイル名との区切りとして空白を加えておくこと.
そうですか,その辺を調整すればエディタが動くはずですか...
そんなわけで (どんなわけで?),次のように修正しました.
conc("edlin ", Ascii, CommandL),
例
では使用例を写経しませう.
15 ?- edit('dl.swi'). ERROR: Undefined procedure: reconsult/1
おぉっ!?
コマンドプロンプトが開きましたよ!!
でもでも,エディタを閉じたら上記のエラー.
どうやら,SWI-Prolog には reconsult/1
がないらしい.
っていうか,今時の Prolog にはないらしい.
古い本によると,consult/1
と reconsult/1
の違いは,Prolog データベースにすでに存在する述語について,consult/1
が節を単に追加するのに対して,reconsult/1
は既存の節を削除して新たに追加する,つまり述語単位で上書きをするところが違っていたようです.
しかし,今時の Prolog はファイルが異なると述語単位で置き換えるのが普通っぽい?
SWI-Prolog はそんな感じ.
そんなわけで (どんなわけで?),
consult(File), !.
に変更して実行.
17 ?- edit('dl.swi'). % dl.swi compiled 0.00 sec, 1,724 bytes Yes
\(^o^)/