[#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:33921] RE: arguments for def [Re: 右辺の値なしでも実行可能? ]

From: "jihg" <jihg@...>
Date: 2002-02-14 13:02:51 UTC
List: ruby-list #33921
jihg です。

From: Masaaki Sakano [mailto:mas@star.le.ac.uk] 
Subject: [ruby-list:33853] arguments for def [Re: 右辺の値なしでも実行可
能? ]

>坂野 正明と申します。
...
>Ruby の def 文においては、引数の受渡しは、多重代入と大体同じ
>(違いは引数の数のミスマッチに関する厳しさだけ?)だと思います。ですの
で、
>def文の中で、破壊的メソッドを使う時は要注意なんだと認識しています。
...
>何か、lint のようなことで検出できれば、言うことないかな、と思います。
># しかし何が破壊的メソッドかの完全な判別は原理的に不可能に近い?
>いかがでしょうか?

lint がどういうものか知らない。tlint は Redhat に入ってた。ガイドで勉強
してみるつもり。

それはさておき、簡単に作ってみた。ろくに試してない。無いよりはましってこ
とで。(無いほうがましってこともあるが...)

先を越されたか?

+----------------- 説明

=begin
=機能

引数を破壊する操作を警告する。感度が高い。

=対象

組み込みクラス String ,Array ,Hash の破壊的メソッド。

自作クラスの破壊的メソッドには対応していない。
※課題。

=制約

関数定義は、def と end のインデントがバイト単位で同一でなければならな
い。

    def foo(arg)
        end             # 無視される
    
    arg << "break!"     # 警告

次のような形式は許されない。

    def foo(arg); ... ;end

def 〜 end を入れ子にすることは出来ない。

    def foo(arg)
        arg << "break!" # 警告
        eval <<EOS
            def bar        # ここから変わってしまう
            end         # ここで終わり
    EOS
        arg << "break!" # 警告されない
    ebd

def 〜 end 内に、バイト単位で同一のインデントを持つ end を置くことは出来
ない。

    def foo(arg)
    if flag
        true
    end                 # ここを def の終わりと認識する。
    
    arg << "break!"     # 警告されない
    end

def 〜 end の構文および対関係が適正でなければならない。

    def foo(arg         # 閉じ括弧がない
    end
    
    Def foo(arg)        # Def は間違い
    end
    
    def foo(arg)        # end が存在しない

=参考文献

「Ruby プログラミング入門」
原信一郎 著,まつもとゆきひろ 監修,オーム社
=end

+----------------- 本体

=begin
=挙動サンプル。

  class hoge
    def method(a ,b ,c = default)
      c << "break!"
      (c << "break!")
      a<<"break!"
      a+b<<"break!"
      a += "break!"
      a.chomp!
      a.replace("break!")
      a.push
      a.pop
      a.shift
      a.unshift
      a.concat(b)
      a.clear
      a.fill("break!")
      a.store(b,c)
      a[b]=c
      a.delete("hash")
      a.delete_if{}
      a.update(b)
      #
      @a << "break!"
      na << "break!"
      a+nb<<"break!"
      na += "break!"
      na.chomp!
      na.replace("break!")
      na.push
      na.pop
      na.shift
      na.unshift
      na.concat(b)
      na.clear
      na.fill("break!")
      na.store(b,c)
      na[b]=c
      na.delete("hash")
      na.delete_if{}
      na.update(b)
    end
    
    def method(aa)
      eval("aa << \"break!\"")
      #
      eval("a << \"break!\"")
    end
  end
  
  def func(ab)
    eval <<EOS
      ab << "break!"
  EOS
  end
  
  def func(ac)
    #
    eval("ac " + "<< \"break!\"")
  end
  
  def foo
    a << "break!"
    .shift
  end
  
  a << "break!"

=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|
        ss.gsub!(/(.+?)\s*(?:$|=.*)/){ $1 }
      end.join("|")
      re = /[^\w@](#{sRE})
        (?:
          (?:
            \.
            (?:
               (?:\w+!|replace)
              |(?:push|unshift|pop|shift|concat|clear|fill)
              |(?:store|delete(?:_if)?|update)
            )
            \b
          )
          |(?:\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
  print "(#{count})count."
end

#Version 2002.2.13

In This Thread