Prolog 写経記 その 75 escape/1, escape/2, escape/3
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
escape/1
,escape/2
,escape/3
を写経します.順番では
charset/1
なのですが,その中で escape/1
を使っているのでこちらを先に.解説
端末に制御シーケンスを送るのに使われる述語.
ふむ.
モード
escape(+) escape(+, +) escape(+, +, +)
ふむ.
定義
では,こいつの定義を写経しませう.
escape(Code) :- put(27), write(Code). escape(Code1, Code2) :- put(27), write('['), write(Code1), write(Code2). escape(Code1, Code2, Code3) :- put(27), write('['), write(Code1), write(';'), write(Code2), write(Code3).
おぉ,これは UNIX なんかのターミナルでよく使うやつですね.
色付けたりリバースにしたりとか.
でもまぁ,述語としてはどうとうこともなく.
注記
逝去シーケンスを出す述語は,画面管理の述語のほとんど全てに利用されている.別な方法で制御シーケンスを端末に送ることもできる.たとえば,必要な全てのコードを並べたリストを作り,ついで次の述語で出力するとよい.
write_code([]) :- !. write_code([C | Rest]) :- write(C), write_code(Rest).
ふむ.
例
では使用例を写経しませう.
...
と思ったのだけれど,使用例がない...
まぁ,他の述語で使ってるっていうんだからよしとしよう.
Prolog 写経記 その 76 charset/1
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
charset/1
を写経します.あまりにつまらないのが並んでいるのでさっさとやっちゃいましょう.
解説
charset(Chars)
は画面の文字セットを選択する.Chars
はあらかじめ定義された United Kingdom,US ASCII,グラフィック,代用文字,あるいは大用具ラミックセットを示す,uk
,ascii
,graph
,altch
あるいはaltgr
のいずれかである.
ふーん.
おらいが使っているのは Windows 版の SWI-Prolog なんですが...
ちゃんと役に立つのでしょうか?
かなり微妙...
モード
charset(+)
ふむ.
定義
では,こいつの定義を写経しませう.
charset(Chars) :- charset_code(Chars, Code), escape(Code). charset_code(uk, '(A') :- !. charset_code(ascii, '(B') :- !. charset_code(graph, '(0') :- !. charset_code(altch, '(1') :- !. charset_code(altgr, '(2') :- !.
つまんね.
注記
文字セットの選択は,端末に送られる文字コードの解釈に必要である.通常テキスト用の文字セット (
uk
あるいはascii
) は,線や方形を描くのに適したグラフィック文字セット (graph
) と交換される.
文字セットが選択できる能力は,使用しているハードウェアに大きく依存している.端末の特性についてはマニュアルを見ること.
らじゃあ.
っていうか,マニュアル? SWI-Prolog のマニュアルを見ればいいのか?
あんまり見る気がしないなぁ...
例
では使用例を写経しませう.
...
と思ったのだけれど,使用例がない...
とりあえず試してみますか.
22 ?- charset(ascii). B Yes 23 ?- charset(uk). A Yes
US ASCII と UK で何が変わるのか知らないのですが,A
とか B
とか出力されているところから考えると,効いてなさそう.
とりあえず,\
は \
のままだなぁ.って,これはフォントによるのか.
まぁ,どうでもいいや.
Prolog 写経記 その 77 cursor/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
cursor/2
を写経します.解説
cursor(Y, X)
は,Y
とX
をそれぞれ行と列を表す整数としてカーソルの是立ち位置を与える.
cursor(Direction, Amount)
はカーソルを相対位置に移動させる.Direction
はleft
,right
,up
あるいはdown
のいずれか 1 つであり,Amount
は整数である.
ふーん.
おらいが使っているのは Windows 版の SWI-Prolog なんですが...
ちゃんと役に立つのでしょうか?
かなり微妙...
(こぴぺ)
モード
cursor(+, +)
ふむ.
定義
では,こいつの定義を写経しませう.
cursor(Y, X) :- integer(Y), !, escape(Y, X, 'f'). cursor(Direction, Amount) :- cursor_code(Direction, Code), escape(Amount, Code). cursor_code(left, 'D') :- !. cursor_code(right, 'C') :- !. cursor_code(up, 'A') :- !. cursor_code(down, 'B').
つまんね.
注記
cursor/2
はカーソルの位置を決める 2 通りの方法を提供している.どちらの方法を使うかは最初の引数のタイプによっている.整数の場合は絶対位置を与える述語,left
,right
,up
,down
の場合は相対位置を与える述語となる.画面の左上隅は座標(1, 1)
で,右下隅は(24, 80)
になっている.
あぁ,80×25 な端末ってありましたね.メインフレーム時代にはお世話になりっぱなしでしたよ.
でもでも,もう時代が違いますよ?
例
では使用例を写経しませう.
cursor_home :- cursor(1, 1).
cursor/2
を使った述語の定義のみ.
試しに使ってみますか.
4 ?- cursor_home. 1f Yes
予想通り.(^^;
制御コードが文字として表示されて終わりです.だめじゃん...
Prolog 写経記 その 78 erase/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
erase/2
を写経します.解説
erase(Entity, Part)
は画面のある部分を消去する.Entity
はscreen
かline
であり,Part
はカーソルの現在位置に関するfrom
,to
あるいはall
である.
ふーん.
おらいが使っているのは Windows 版の SWI-Prolog なんですが...
ちゃんと役に立つのでしょうか?
かなり微妙...
(こぴぺ)
モード
erase(+, +)
ふむ.
定義
では,こいつの定義を写経しませう.
erase(Entity, Part) :- entity_code(Entity, Char), part_code(Part, Code), escape(Code, Char). entity_code(screen, 'J') :- !. entity_code(line, 'K'). part_code(from, '0') :- !. part_code(to, '1') :- !. part_code(all, '2').
つまんね.
例
では使用例を写経しませう.
cls :- erase(screen, all). delete_line :- erase(line, all).
cursor/2
を使った述語の定義のみ.
試しに使ってみますか.
まずは cls/0
Yes 6 ?-
おぉ!!!!
消えたよ!!
上記は,cls/0
を実行した後です.でもでも,その cls/1
を入力した部分は消えてます.
SWI-Prolog,ちょっとだけ仕事した!!
続けて delete_line/0
6 ?- delete_line. Yes
??
消えたのかどうかが分からない...
ちょっと表示を加えてもう一度.
7 ?- write('Ebi'), delete_line, write('Yuri'). EbiYuri Yes 8 ?-
うーみゅ...
残念ながら行の消去は対応していないようです.
って,全然残念って気がしませんが.どうでっもいぃでっすよ♪