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

Re: [bep] learning lisp: while



n高橋です。

自作PCの音源を、オンボードチップから Sound Blaster Live! に変えてみま
した。さすがにクオリティが全然違います。

Reiko TAKAHASHI  (高橋玲子)writes:

> } 実用的で
> } はありませんが、X-Weather を「〜でござる」口調に変換するなんてのはどう
> } でしょう。文字列検索と置換の練習になります。

>  これは、メール上で実行すると、X-Weatherを探して置換してくれる関数、と
> いうことですか?

そうです。

> みなさんのメールを、怪しげな少女言葉にしちゃう……なんていうのは難しい
> ですか?

どのくらい凝るかによりますね。以前、標準語を大阪弁に変える osaka.el と
いうプログラムが出回ったことがあります。

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

>  素数というのは、たしか、1とその数でしか割れない数のことでしたよね??

そうです。

> 素数を求める式とかって、数学であったんでしたっけ?

ありません。色々高速化の手法はありますが、可能性のあるすべての数で割っ
てみて割り切れるかどうか調べるというのが基本方針です。

> 扱うのが数だけなので(?)、まず、これからやってみたい……と思います。
> あっ、もしかして、2から順番に割ってみて、答えが整数になったら……とかす
> るのでしょうか(外してそう……)。

惜しい。「答が整数になったら」ではなくて、「割り切れなかったら」ですね。

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

>  ……学生のときよりも今のほうがレパートリーの少ない私としては、これは
> ちょっと……(^^;;;)。でも、万が一将来またお料理に目覚めることもあるかも
> しれないので、やってみたいです。

レパートリーが5以下の場合は、最初から nil ですね。:-)

>  ほかに、私がやってみたいこととしては、
> BEPを起動させたときにお天気を見に行って、その結果によって違ったwavファイ
> ルを鳴らすとか……。
> wavファイルがつまらないと、おもしろくならないとは思うのですが、朝(?)起き
> て、窓も開けずにパソコンに向かってしまうオタクなみなみなさま(失礼!)に
> もお天気がわかるように(^_^)。
> ただ、お天気っていろいろなパターンがあるので難しいですよね。
> たとえば、後ろから見ていって、いちばん最初に出てきた「晴」か「雨」か「曇」
> か「雪」で判断するとかはどうでしょう?
> 「晴後雨」だったら、もう「雨」ということで……。

「なんとか後かんとか」というパターンを調べて、あったらまず「なんとか」
を鳴らし、次に「かんとか」を鳴らすようにすればいいのではないでしょうか。

>  あとは、買ってきた食料品をおおよそのカテゴリーに分けて記録しておくと、
> 賞味期限が来たっぽいときにさわいで教えてくれるとか……(プログラミング的
> には、あまり意味がないでしょうか)。

こういうのって一見便利そうに思えるのですが、実はそんなに実用的じゃあり
ません。最初のうちは面白がって使うのですが、すぐにデータを入力するのが
面倒になっちゃいます。それにいちいちデータを入力すると、その時点で人間
の方が覚えちゃって、計算機の力を借りるまでもなくなっちゃうんですよ。大
量の食料を扱う必要があり、かつ毎日必要なものを仕入れることのできないよ
うに環境、たとえば軍隊の兵糧係なんかなら使い道があるかもしれません。

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

>  「ド・モルガンの公式と二重否定の公式」というのはなんですか?(またすみ
> ません!)

ド・モルガンの公式
(and (not X) (not Y)) = (not (or X Y))
(or (not X) (not Y)) = (not (and X Y))

二重否定の公式
(not (not X)) = X

というやつです。

>  (file-directory-p filename)は、filename がすでに存在するディレクトリだっ
> たら、t になるんですね。

そうです。

> そうすると、もしかして、(file-exist-p)のチェックはいらなくなるのでしょう
> か?

> (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))
> 	    (file-directory-p filename))
>       (setq filename (read-file-name "file not writable. append buffer to: " default-directory)))
>     (append-to-file (point-min) (point-max) filename)))

これでいいようですね。append-to-file ができるのは、そのファイルがディ
レクトリでない普通のファイルで、かつ書き込み可能な場合、すなわち

(and (file-regular-p filename)
     (file-writable-p filename))

while で回るのはこの条件が成立しないときなので、

(not
  (and (file-regular-p filename)
       (file-writable-p filename)))

ここでド・モルガンの公式を使って

(or (not (file-regular-p filename))
    (not (file-writable-p filename)))

さらに not + file-regular-p を file-directory-p で置き換えて

(or (file-directory-p filename)
    (not (file-writable-p filename)))

ですね。この or の内身は副作用がないので、順番は問題になりません。

# 本当は普通のファイルでもディレクトリでもないってものがあるんですが、
# 今は置いておきましょう。

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

>  横幅いっぱいになると、左へ一文字ずつずれるのではなくて、一行分スクロー
> ルしてしまうんですね……?

そうです。ですから急に何も見えなくなっちゃいます。確認するためには
*Message* バッファに移動する必要があります。

> minibufferに表示するメッセージは、できるかぎり短いほうがいい、ということ
> ですよね。

はい、そういうことです。

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