Osamu NAKAMURA
naka****@hasak*****
2004年 9月 1日 (水) 21:32:45 JST
中村@質問者です。 shiro さん、cut-sea さん、コメントありがとうございました。 (食事に行っている間に3本もいただいていて驚きました。^^) At Wed, 01 Sep 2004 00:10:24 -1000 (HST), Shiro Kawai wrote: > > (ついでに、make-directory* 等のアスタリスクはどういう > > 関数の名前につけてあるものですか?) > > '*' は let* からの連想で、動作が再帰的にネストするような > イメージがある場合に私は使います。これも参考にどうぞ↓ なるほど。 let* の binding を再帰的とは認識できてなかったのですが、 スコープが多重になっていく、ということですね。 make-directory* は、途中の sub directory も作りながら 掘って行ってくれるところが、同じイメージと。 > http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a!%a4%c8%3f あ、失礼しました。ここ、以前一度見てたのに、抜けてました。m_o_m > > 2.そもそも、mode としてどういう数値を与えたらいいのか > > 理解できてません。(情けなし) > > shell の環境設定で umask コマンドに与える数値とは > > 別物ですよね? (16877 で、rdxr_xr_x になりました。) > > ”POSIXスタイルのパーミッションビットマスク”という > > ものを与えるのでしょうか? > > はい。これはunixシステムプログラミングのドキュメントを > 見てもらうしかないのですが、 stat(2), chmod(2), open(2) > のmanpageで必要十分な情報が得られると思います。基本的にmodeに > 渡す数値はそのままmkdir(2)に渡るので、システムのmkdir(2)の動作 > そのものです。 そのはずだと思って見たんですけれども、、、、 と、ここで、cut-sea さんのメールを眺めて、 umask / mode って、8進数だったんだぁ! ということに気付きました。^^;;;;; 3 bit づつで表現するんだからそりゃそうだろう、と言われると 返す言葉がありません。 なんで、16877 で、rdxr_xr_x になるんだ、と悩んでおりました。 gosh> (format #t "~a" (slot-ref (sys-stat "scm") 'mode)) 16877#<undef> gosh> (format #t "~o" (slot-ref (sys-stat "scm") 'mode)) 40755#<undef> gosh> (format #t "~o" (slot-ref (sys-stat "scm") 'perm)) 755#<undef> 失礼致しました。 > > 3.umask を scope 毎に簡単に切替えられると嬉しいかも、 > > と思っています。 > > > > gosh の環境内に gosh が参照する umask を収めた変数 > > があるとしたら、それを local に変更するとその scope でだけ > > local な umask が適用される、という使い方はできないでしょうか? > > umaskはGaucheの機能ではなく、OSが提供する機能で、 > プロセスが持つ状態です。 はい、gosh がスクリプトを実行している際、そのプロセスの 状態として umask があるというのは一応理解していて、 その umask に対応する変数を gosh が持っていて、 ファイル生成の際には、その変数を参照して生成するファイルの mode を設定するという動作だったりしたなら、local に その変数を変更することで、作成ファイルの mode を 手軽に一時変更できるかな、と虫のいいことを思ってました。 > 従って、複数のスレッドが走っている場合に: > > > (define-syntax let-umask > > (syntax-rules () > > ((_ (umask) proc1 ...) > > (let ((oldumask (sys-umask umask))) > > proc1 > > ... > > (sys-umask oldumask))) > > )) > > このようなマクロでumaskを変えた場合、そのumaskの変更は > proc1... だけでなく、同時に走っているスレッド全てに > 予測不可能な影響を与えてしまいます。 スレッドのことまでは考えてませんでしたが、継続手続を 持ってこの中にはいって、途中で継続手続を呼び出した場合等、 状態が戻らないのでよろしくない、と後で思ったりしてました。 スレッドのことは(も)よく知らないのですけれど、各スレッドの umask の状態は、共通なのでしょうか。スレッドによって、umask を 変えたいということもありそうな気がしますけれども。 shell script だと、child process での umask 変更は 親には影響しないようですが、thread はまた状況が異なる? umask 022 touch aaa (umask 222 ; touch bbb) touch ccc ~$ ls -la aaa bbb ccc -rw-r--r-- 1 naka users 0 Sep 1 21:19 aaa -r--r--r-- 1 naka users 0 Sep 1 21:19 bbb -rw-r--r-- 1 naka users 0 Sep 1 21:19 ccc (うーん、Gauche と直接関係ない、基礎知識の欠如の露出ですね。 このへんは、また別途勉強します。) > なお、このように「あるコードの『実行期間中』はある状態になる」 > というのは動的スコープといいます。Schemeではletなんとかは > 静的スコープに使い、動的スコープを作るものはwithなんとか、 > とすることが多いようです。エラーや継続によるフローの変更も > 考慮に入れると、with-umaskはこんな感じになるでしょうか。 ありがとうございます。 dynamic-wind というのをまだ使ったことがないので、これから よく読ませてもらいます。 > でも、実用性重視がGaucheの方針なので、まっとうなwith-umask > があった方がよいという要望があれば標準ライブラリにバンドル > するかもしれません。カレントディレクトリを一時的に変える > with-cwdみたいのは欲しいと思ったこともありますし。 with-cwd も欲しいですー directory tree の複製をファイルは symbolic link する安直ツールを 作ったんですが、sub directory の中のファイルを symlink するたびに directory に出入りしていて、これなら sh script で sub shell を 使って書く方が安直かも(いや、基本的な作りが悪いんですけど)などと、 思ったりしてました。 > > ついでのついでなんですが、gosh のインタープリタで、行編集 > > や履歴を使うようにはできないでしょうか。 > > 通常は、emacs の shell mode で使ってますが、ふと、そこにある > > terminal で立ち上げてしまって、悔しい思いをすることが時々。。 > > 一応、goshはスクリプト実行に必要無いものは極力内部には抱えない、 > という方針です。インタラクティブな実行時だけライブラリを読めば行編集が > 使える、というふうに作れれば、つけるかもしれません。 libreadline かなにかと link するように、configure 時に指定 すると行編集が可能になる、とかなってればいいんでしょうかねぇ。 (って、なにも知らずに言ってます。無視してください。) cut-sea さんのかかれてた readline の拡張ライブラリで gosh インタプリタ に行編集機能を追加できるんでしたっけ。以前、ちょっとだけ試して なんだかよく分からず、諦めてました。また、見てみます。 ありがとうございました。 --