[#33732] 文字列の式展開について — Masao Mutoh <mutoh@...>

むとうです。

14 messages 2002/02/03
[#33733] Re: 文字列の式展開について — Tietew <tietew-ml-ruby-list@...> 2002/02/03

[#33745] Re: 文字列の式展開について — Masao Mutoh <mutoh@...> 2002/02/04

むとうです。

[#33746] Re: 文字列の式展開について — Take_tk <ggb03124@...> 2002/02/04

たけ(tk)です。

[#33762] WebDAV client — HIDAKA Takahiro <cv8t-hdk@...>

 ひだかです。

15 messages 2002/02/05

[#33793] 右辺の値なしでも実行可能? — "井上 浩一" <kyoui32@...>

井上です。

48 messages 2002/02/08
[#33794] Re: 右辺の値なしでも実行可能? — Tietew <tietew-ml-ruby-list@...> 2002/02/08

[#33797] 変数の宣言 — Yasuhiro Hayase <hayase@...> 2002/02/08

早瀬@大阪大学基礎工学部情報科学科 です。

[#33798] Re: 変数の宣言 — matz@... (Yukihiro Matsumoto) 2002/02/08

まつもと ゆきひろです

[#33839] Re: 変数の宣言 — Yasuhiro Hayase <hayase@...> 2002/02/11

早瀬@阪大です。

[#33840] Re: 変数の宣言 — Tanaka Akira <akr@...17n.org> 2002/02/11

In article <20020211224442.48d0e668.hayase@hcn.zaq.ne.jp>,

[#33841] Re: 変数の宣言 — nobu.nakada@... 2002/02/11

なかだです。

[#33845] Re: 変数の宣言 — shudo@... 2002/02/12

> > > あえて宣言文の途中で、代入前に変数の値を使った場合にエラーを出そうと思うと、

[#33847] スクリプト言語 (Re: 変数の宣言 ) — TAKAHASHI Masayoshi <maki@...> 2002/02/12

高橋征義です。

[#33850] Re: スクリプト言語 (Re: 変数の宣言 ) — Takaaki Tateishi <ttate@...> 2002/02/12

At Tue, 12 Feb 2002 13:27:58 +0900,

[#33871] Re: スクリプト言語 (Re: 変数の宣言 ) — TAKAHASHI Masayoshi <maki@...> 2002/02/12

Takaaki Tateishi <ttate@kt.jaist.ac.jp> wrote:

[#33795] Re: 右辺の値なしでも実行可能? — "井上 浩一" <kyoui32@...>

井上です。

13 messages 2002/02/08

[#33807] Re: 右辺の値なしでも実行可能? — "井上 浩一" <kyoui32@...>

井上です。

38 messages 2002/02/08
[#33824] Re: 右辺の値なしでも実行可能? — "jihg" <jihg@...> 2002/02/08

jihg です。新入りです。

[#33825] Re: 右辺の値なしでも実行可能? — Tanaka Akira <akr@...17n.org> 2002/02/08

In article <000001c1b0c1$04eca980$b7d08bcb@soteccomputer>,

[#33831] Re: 右辺の値なしでも実行可能? — "jihg" <jihg@...> 2002/02/09

> Pseudo-Simplicity(擬似単純性)

[#33853] arguments for def [Re: 右辺の値なしでも実行可能? ] — Masaaki Sakano <mas@...> 2002/02/12

坂野 正明と申します。

[#33856] Re: arguments for def [Re: 右辺の値なしでも実行可能? ] — shukaku@... 2002/02/12

At Tue, 12 Feb 2002 19:14:03 +0900,

[#33867] Re: arguments for def [Re: 右辺の値なしでも実行可能? ] — Masaaki Sakano <mas@...> 2002/02/12

坂野 正明です。

[#33846] quickml サーバ — Satoru Takabayashi <satoru@...>

高林と申します

22 messages 2002/02/12
[#34082] SlowML /Re: quickml サーバ — rubiben <ozaki@...> 2002/02/25

るびべん です:

[#34086] Re: SlowML /Re: quickml サーバ — matz@... (Yukihiro Matsumoto) 2002/02/26

まつもと ゆきひろです

[#34100] Re: SlowML /Re: quickml サーバ — rubiben <ozaki@...> 2002/02/27

るびべん です:

[#34117] SlowML 実装実験 /Re: quickml サーバ — rubiben <ozaki@...> 2002/02/27

るびべん です:

[#33966] 「たまてばこ」開発版が SecurityE rror — dellin <dellin@...>

dellinといいます。

17 messages 2002/02/18
[#33968] Re: 「たまてばこ」開発版が SecurityError — nobu.nakada@... 2002/02/18

なかだです。

[#33972] world writeable dir (Re: 「たまてばこ」開発版が SecurityError) — Kazuhiro NISHIYAMA <zn@...> 2002/02/18

西山和広です。

[#34053] 漢数字 -> 数 — TOYOFUKU Chikanobu <toyofuku@...>

豊福です。

18 messages 2002/02/25

[#34056] ruby-dev summary — TAKAHASHI Masayoshi <maki@...>

高橋征義です。

16 messages 2002/02/25

[ruby-list:33927] Re: [Summary]arguments for def

From: Masaaki Sakano <mas@...>
Date: 2002-02-14 21:50:06 UTC
List: ruby-list #33927
坂野 正明%かっての北白川住人です。

新井さん、どうも丁寧な解説をありがとうございました。
知らなかったこと、気づかなかったことがたくさん出てきて、
大変勉強になりました。

斉藤さん、フォローを、特に make_clones() をありがとうございました。
binding を使うと、eval でうまく実現できちゃうんですねぇ。感心しました。
以下、少しだけ工夫を加えてみました。
	def make_clones( bind, names )
	  #names.split( "[, ]+" ).each do | name |
	  names.gsub(/[*&]/,'').split( "[, ]+" ).each do | name |
	   #eval( "#{name} = #{name}.clone", bind )
	    eval( "#{name} = #{name}.clone rescue nil", bind )
	  end
	end

原さん、ポインタをありがとうございます。そのスレッドを早速拝見しました。
# 議論が爆発してますね (@_@)

	http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/21267
に示されているように、「網(network)」のクラス図の構築には、現在の
仕様(それこそオブジェクト指向というべきなんですか?)が必須なんですね。
# もっとも、複雑過ぎて私の理解を超えるので、自分でそういうクラスを
# 作ることはないと思いますけど (^^;

あと、(アーカイブの)議論の中で気づいた点を二点。

 .clone は、オブジェクト自体をコピーするけれど、オブジェクトが指し示す
他のオブジェクトまで再帰的にコピーするわけではないんですね(!)。
# .clone って使った経験がほとんどなかったので気づきませんでした。

irb(main):035:0> x="ABC"
"ABC"
irb(main):036:0> x.id
67542462
irb(main):037:0> e=[x]
["ABC"]
irb(main):038:0> f=e.clone
["ABC"]
irb(main):039:0> [e.id,f.id,e[0].id,f[0].id]
[67536372, 67532862, 67542462, 67542462]
	=> x, e[0], f[0] は、"equal"

ということは、特に、多重配列とかになると、 .clone のありがたみは
ほとんどなさそうですね。

もう一点は、土岐仁謙さんの御投稿の
	http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/21302
name = name.dup
name.sub! (....)
は、なるほど、と思いました。これだと、色々考えなくていいですね。
# あくまで破壊的メソッドを使う場合の(私にとっての)一般論です。sub の
# 場合に限れば、name = name.sub(....) で十分ですし、また、あえて破壊的
# メソッドを使う必要がある場合は実はそう多くない、とも思いますが。


いずれにせよ、初級者(当然私も含みます ^^;)には、lint みたいなもので、
破壊的メソッドを使っているかどうかをちゃんと外部からチェックできれば
ありがたい、と感じます。(初級者には)ちょっと見つけにくいバグになる
でしょうから。

というわけで、jihg さん、御投稿をありがとうございます。
簡単に試してしてみたところ、いい感じですね。String, Array,
Hash について簡単なチェックができるので、実用的に使えそうです。

いくつか不完全(?)のところがあるように思ったので、以下のように
いくつか書き換えてみましたが、いかがでしょう?


○=制約
  def abc (a)
    b=a
    b.xxx!
は検出できませんね(多重代入まで考えるともっと複雑!)。

○def x (a,*b,&c) にも対応させました。

他、いくつか。


皆様への御礼を兼ねて、先ほどの Summary の改定版を準備中です。
できれば明日(もしくは週明け…)投稿します。

--------------
さかのまさあき


# jihg さんのスクリプトに対する
#-------------- patch ------------
*** lintdef.rb	Thu Feb 14 19:15:08 2002
--- lintdef.new.rb	Thu Feb 14 19:15:56 2002
***************
*** 8,11 ****
--- 8,13 ----
      line.scan(/(?:^|\s+|;)def\s+.+?\((.*?)\)/i) do |s|
        sRE = (s[0].split(/\s*,\s*/)).each do |ss|
+       	next if /^\s*\&/ =~ ss
+       	ss.sub!(/^\s*\*/,'')
          ss.gsub!(/(.+?)\s*(?:$|=.*)/){ $1 }
        end.join("|")
***************
*** 15,25 ****
              \.
              (?:
!                (?:\w+!|replace)
!               |(?:push|unshift|pop|shift|concat|clear|fill)
!               |(?:store|delete(?:_if)?|update)
              )
-             \b
            )
!           |(?:\s*(?:<<|\+=))
            |(?:\[.+?\]\s*=\s*)
          )
--- 17,29 ----
              \.
              (?:
!               (?:
!                  (?:replace)
!                 |(?:push|unshift|pop|shift|concat|clear|fill)
!                 |(?:store|delete(?:_if|_at)?|update)
!               )
!               \b|\w+!
              )
            )
!           |(?:\s*(?:<<))
            |(?:\[.+?\]\s*=\s*)
          )
***************
*** 39,43 ****
      row += 1
    end
!   print "(#{count})count."
  end
  
--- 43,47 ----
      row += 1
    end
!   puts "(#{count})count."
  end
  
#-------------- 修正されたスクリプト ------------
flnm = ARGV.shift
open(flnm ,"r") do |flh|
  row = 1
  count = 0
  re = nil
  reEnd = nil
  while line = flh.gets
    line.scan(/(?:^|\s+|;)def\s+.+?\((.*?)\)/i) do |s|
      sRE = (s[0].split(/\s*,\s*/)).each do |ss|
      	next if /^\s*\&/ =~ ss
      	ss.sub!(/^\s*\*/,'')
        ss.gsub!(/(.+?)\s*(?:$|=.*)/){ $1 }
      end.join("|")
      re = /[^\w@](#{sRE})
        (?:
          (?:
            \.
            (?:
              (?:
                 (?:replace)
                |(?:push|unshift|pop|shift|concat|clear|fill)
                |(?:store|delete(?:_if|_at)?|update)
              )
              \b|\w+!
            )
          )
          |(?:\s*(?:<<))
          |(?:\[.+?\]\s*=\s*)
        )
      /x
      sREEnd = line.scan(/\s*/)[0]
      reEnd = /^#{sREEnd}end\b"/
    end
    unless re.nil?
      line.scan(re) do |sArg|
        print "warning : #{flnm}(#{row})---" +
          " 引数 #{sArg} に対し破壊的な操作をしています。" +
          "'#{line.scan(/(.*?)(?:\r\n|\r|\n)/)}'\n"
        count += 1
      end
      re = nil if reEnd =~ line
    end
    row += 1
  end
  puts "(#{count})count."
end

#Version 2002.2.13 -> 14?
#-------------- ここまで ------------

In This Thread