[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] learning lisp: while



Reiko TAKAHASHI  (高橋玲子)writes:

>  とても安易なので、もしできれば……でかまわないのですが、プログラミング
> 初心者が解いたらおもしろそうと思えるような課題があったら教えてください。

すぐに使える実用的なものの方がやり甲斐があって面白いのですが、とっさに
は適当なものを思い付きません。何かやりたいことはありますか?  実用的で
はありませんが、X-Weather を「〜でござる」口調に変換するなんてのはどう
でしょう。文字列検索と置換の練習になります。

教科書的なものならば、

・1000までの素数を全部求める (二重ループの練習)

・自分の料理レパートリーから今夜のメニューをランダムに決める。
  ただし過去五日以内に作ったものは選んでいけない (リストと乱数の練習)

なんていうのが思い浮かびます。

>  例のappend-buffer-to-fileを、whileを使って書き直してみました。なんとな
> く、できたっぽいのですが……どうでしょう?

> ;;; バッファ全体をファイルに追加(shift jis)
> (defun append-buffer-to-file ()
>   (interactive)
>   (let 
>       ((coding-system-for-write 'shift_jis-dos)  
>        (filename (read-file-name "append buffer to: " default-directory)))
>     (while
> 	(or (not (file-writable-p filename))
> 	    (and (not (file-regular-p filename))
> 		 (file-exists-p filename)))       
>       (setq filename (read-file-name "file not writable. append buffer to: " default-directory)))
>     (append-to-file (point-min) (point-max) filename)))

はい、ざっと見たところいいようですね。

> あと、ファイルが書き込めるかのチェックがこれまでとは逆になるので、ほ
> んとうにこれでうまくいくのかどうか、ちょっと心配です。

こういう and と or の混じった複雑な判定条件を逆にするのは間違いやすい
ところです。ド・モルガンの公式と二重否定の公式を使って意味を考えずに
機械的に書き直した方が安全かもしれません。

あと、この場合には not と file-regular-p を組み合わせるよりも、
file-directory-p という関数を使った方が見通しが良くなりそうです。

>  最初、"file not writable."を(message)で書こうとしたのですが、つぎの
> "append buffer to: "に消されてしまうせいか、全然表示されませんでした
> (BEPもしゃべらなかった、(message)だけだとしゃべるのですが)。

はい、御想像どおり後から出力される "append buffer to:" に消されてしまっ
ているのだと思います。何もせずにじっと待つだけの sleep-for という関数
があるので、これを message の後に入れてやると指定した時間だけ表示して
くれるかもしれません。試してませんが。

>  注意表示(?)の書き方は、こんな感じでいいでしょうか?

いいと思います。

> minibufferに書き込めるのは、何文字までですか?

よく知りませんが、何文字でもいいんじゃないでしょうか。Emacs-20 の
minibuffer はピンディスプレイ装置同様高さが一行分しかないので、横幅いっ
ぱいまで使い切るとスクロールして前の行が見えなくなってしまいますが、
Emacs-21 なら自動的に画面上の行数が増加して全体が見えるようになります。
Emacspeak-14 がこれに対応しているといいんですが。

-- 
TAKAHASHI Naoto
ntakahas@...
http://www.m17n.org/ntakahas/