[#8168] {literal}#[]= — EGUCHI Osamu <eguchi@...>

えぐち@エスアンドイーです。

16 messages 1999/11/01
[#8172] Re: {literal}#[]= — matz@... (Yukihiro Matsumoto) 1999/11/01

まつもと ゆきひろです

[#8176] Multiple self assignment — Kazuhiro Yoshida <moriq.kazuhiro@...>

もりきゅうです。

35 messages 1999/11/01
[#8178] Re: Multiple self assignment — matz@... (Yukihiro Matsumoto) 1999/11/01

まつもと ゆきひろです

[#8212] Re: Multiple self assignment — Kazuhiro Yoshida <moriq.kazuhiro@...> 1999/11/02

もりきゅうです。

[#8213] Re: Multiple self assignment — matz@... (Yukihiro Matsumoto) 1999/11/03

まつもと ゆきひろです

[#8232] 例外を処理する 2 項演算子 — Kazunori NISHI <kazunori@...> 1999/11/05

西@九大です。

[#8233] Re: 例外を処理する 2 項演算子 — matz@... (Yukihiro Matsumoto) 1999/11/05

まつもと ゆきひろです

[#8236] Re: 例外を処理する 2 項演算子 — Kazuhiro Yoshida <moriq.kazuhiro@...> 1999/11/05

もりきゅうです。

[#8266] Re: 例外を処理する 2 項演算子 — EGUCHI Osamu <eguchi@...> 1999/11/07

えぐち@エスアンドイー です。

[#8269] Re: 例外を処理する 2 項演算子 — gotoken@... (GOTO Kentaro) 1999/11/07

In message "[ruby-dev:8266] Re: 例外を処理する 2 項演算子"

[#8271] Re: 例外を処理する 2 項演算子 — matz@... (Yukihiro Matsumoto) 1999/11/08

まつもと ゆきひろです

[#8274] Re: 例外を処理する 2 項演算子 — keiju@... (石塚圭樹) 1999/11/08

けいじゅ@日本ラショナルソフトウェアです.

[#8204] Re: [ruby-list:18281] Re: アクセス制御について — Shugo Maeda <shugo@...>

前田です。

12 messages 1999/11/02
[#8205] Re: [ruby-list:18281] Re: アクセス制御について — Shin-ichiro Hara <sinara@...> 1999/11/02

原です。

[#8315] Re: [ruby-list:18601] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{} — Kazunori NISHI <kazunori@...>

西@九大です。

37 messages 1999/11/15
[#8316] Re: [ruby-list:18601] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{} — matz@... (Yukihiro Matsumoto) 1999/11/15

まつもと ゆきひろです

[#8369] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{} — Koji Arai <JCA02266@...> 1999/11/18

新井です。

[#8374] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{} — matz@... (Yukihiro Matsumoto) 1999/11/18

まつもと ゆきひろです

[#8384] Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{} — Koji Arai <JCA02266@...> 1999/11/19

新井です。

[#8405] 1.4.3 (Re: Re: [REQ] [].grep(pat){} ==> [].grep(pat).collect{}) — matz@... (Yukihiro Matsumoto) 1999/11/24

[#8319] Re: Exception handling — Jun Adachi <adachi@...>

安達@沖データと申します。

21 messages 1999/11/16
[#8350] Re: Exception handling — Kazunori NISHI <kazunori@...> 1999/11/17

西@九大です。

[#8446] [REQ] {enumerable, integer, range}.rand — Kazunori NISHI <kazunori@...>

西@九大です。

37 messages 1999/11/29
[#8449] Re: [REQ] {enumerable, integer, range}.rand — matz@... (Yukihiro Matsumoto) 1999/11/30

まつもと ゆきひろです

[#8463] Re: [REQ] {enumerable, integer, range}.rand — Kazunori NISHI <kazunori@...> 1999/11/30

西@九大です。

[#8474] Re: [REQ] {enumerable, integer, range}.rand — matz@... (Yukihiro Matsumoto) 1999/12/01

まつもと ゆきひろです

[#8476] Re: [REQ] {enumerable, integer, range}.rand — Kazunori NISHI <kazunori@...> 1999/12/01

西@九大です。

[#8487] Re: [REQ] {enumerable, integer, range}.rand — matz@... (Yukihiro Matsumoto) 1999/12/02

まつもと ゆきひろです

[#8494] Re: [REQ] {enumerable, integer, range}.rand — Kazunori NISHI <kazunori@...> 1999/12/02

西@九大です。

[#8451] new Hash (Re: [ruby-list:19043]) — Wakou Aoyama <wakou@...>

青山です。

18 messages 1999/11/30

[ruby-dev:8338] Re: Exception handling

From: Jun Adachi <adachi@...>
Date: 1999-11-17 06:51:30 UTC
List: ruby-dev #8338
安達@沖データと申します。

> まつもと ゆきひろです

お世話になります。

> In message "[ruby-dev:8319] Re: Exception handling"
>     on 99/11/16, Jun Adachi <adachi@tpegasus.lab.okidata.co.jp> writes:
> 
> |このコードを書きながら、「欲しいなぁー」と思った機能は、次の二つです。
> |
> |(1) ユーザが定義可能なエラーハンドラー辞書と標準クラスからの呼出し。
> |  さらに贅沢を言うと、PostScriptの辞書みたいにスタッカブルになっている
> |  と、以前の状態に簡単に戻れるのでうれしい。
> 
> これはPostScriptを知らないこともあってちょっとイメージが湧き
> ませんでした。

辞書自体はHashと同じです。
辞書スタックも含めてクラスにしてみるとこんな感じでしょうか。

#エラーハンドラ辞書じゃなくて、一般的なものになっています。
#each_keyとか、eachとかハッカーな人に笑われそうですが、こんどはとりあ
#えず動きます :-)
-- dict.rb
#!/usr/local/bin/ruby

class Dictionary
  def initialize
    @stack = []
    @stack.unshift({})
  end

  def dup
    @stack.unshift({})
  end

  def pop
    @stack.shift
  end

  def push(d)
    @stack.unshift(d)
  end

  def define(key, value)
    @stack[0][key] = value
  end

  def lookup(key)
    v = nil
    @stack.each_index { | idx |
      break if ((v = @stack[idx][key]))
    }
    v
  end

  def each_key 
    keys = []
    @stack.each_index { | idx |
      keys = keys + @stack[idx].keys
    }
    keys.uniq!
    keys.each { | key |
      yield key
    }
  end

  def each
    self.each_key { | key |
      yield(key, self.lookup(key))
    }
  end

  alias save dup
  alias restore pop
end

dict = Dictionary.new
dict.define(Errno::ENOENT, "default handler(Errno::ENOENT)")
dict.define(Errno::EINVAL, "default handler(Errno::EINVAL)")

print "initial entries\n"
dict.each { | key, val |
  print "#{key} = #{val}\n"
}

dict.save
dict.define(Errno::ENOENT, "new handler(Errno::ENOENT)")
print "modified entries\n"
dict.each { | key, val |
  print "#{key} = #{val}\n"
}

dict.restore
print "resumed entries\n"
dict.each { | key, val |
  print "#{key} = #{val}\n"
}
--
一時的なエラーハンドラーを設定する場合に、上記プログラムだと
dict.restoreだけで戻るので、現状復帰が簡単という安直な話です。

まつもとさんが「簡単なだけ」というのを好まないことは了解しています。
しかし、前のメールでも書いたように、「全部デフォルト」と「全部begin
.. rescue .. endでエラー処理する」の中間程度の真面目さのプログラムを書
きたい場合に、この方式は便利だろうと思っています。

ただ、標準クラスからこのようなエラーハンドラーを呼び出すようにすると、
最初からエラーが発生する事を期待して作られているようなプログラムで効率
が悪くなったりしないかと心配ではあります。

> |(2) 単独のrescue節で複数のエラーを処理できるように、現在捕まえているエ
> |  ラーオブジェクトを仮引数で受け取りたい。
> 
> $!でとれます。

はい。忘れていました。

>               実は現在のRubyで$変数から解放されていないのは、
> これと$>だけなんで(他はいちおう回避策がある)、これらに対して
> 別のアクセス法を用意したいとは思っています。良いアイディアが
> あれば歓迎します。
> 
>   begin
>   rescue IOError(err)
>   end

これは、IOErrorクラスのエラーの場合にこのrescue節に捕まって、詳細はerr
で参照できるオブジェクトを見ろという意味ですよね?

#おお、ご本家のドキュメントでは組み込みクラスのところにExceptionが増
#えていますね。今日まで、気が付きませんでした。

>   begin
>   rescue IOError
>     Exception::info
>   end

こっちは、クラス定数で参照できるという意味でしょうか?

私の好みは、前者です。

#なんか、後者だとやっぱりグローバルな変数にアクセスするのと変わりない
#気がして。
--
*------*				adachi@okidata.co.jp
|人∧鷲|				沖データ 第一研究所
| <女> |				安達 淳
|牛∨獅|
*------*


In This Thread