[#49868] Rubyへの要望(願望) — MASAKI Yuhsuke <reasonset@...>

Ruby list=E3=81=AE=E7=9A=86=E6=A7=98=E3=80=81=E3=81=AF=E3=81=98=E3=82=81=E3=

14 messages 2014/07/12

[#49877] Rubyリファレンス chm版リミックス更新(2014年7月版) — Dice <tetradice@...>

44GT44KT44Gr44Gh44Gv44CCRGljZeOBp+OBmeOAgg0KDQpSdWJ544Oq44OV44Kh44Os44Oz44K5

21 messages 2014/07/13
[#49879] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Kazuhiro NISHIYAMA <zn@...> 2014/07/13

西山和広です。

[#49890] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Dice <tetradice@...> 2014/07/23

6KW/5bGx5ZKM5bqD44GV44KTDQoNCkRpY2XjgafjgZnjgIINCuOBmeOBv+OBvuOBm+OCk+OAgeOD

[#49891] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Kazuhiro NISHIYAMA <zn@...> 2014/07/24

西山和広です。

[#49893] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Dice <tetradice@...> 2014/07/25

RGljZeOBp+OBmeOAgg0KDQo+IENobUZveCDjgafjgoLjgYbjgaHjgofjgaPjgajplrLopqfjgZfj

[#49894] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Dice <tetradice@...> 2014/07/26

RGljZeOBp+OBmeOAgg0KDQrvvJ7opb/lsbHlkozluoPjgZXjgpMNCuWFiOaXpeOBlOWgseWRiuOB

[#49895] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Kazuhiro NISHIYAMA <zn@...> 2014/07/26

西山和広です。

[#49897] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Kazuhiro NISHIYAMA <zn@...> 2014/07/27

西山和広です。

[#49899] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Dice <tetradice@...> 2014/07/31

RGljZeOBp+OBmeOAgg0K44GZ44G/44G+44Gb44KT44CB6L+U5L+h44GM6YGF44GP44Gq44KK44G+

[#49906] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Dice <tetradice@...> 2014/08/10

RGljZeOBp+OBmeOAgg0KDQrjgYLjga7lvozjgYTjgo3jgYTjgo3oqabjgZfjgabjgb/jgZ/jga7j

[#49907] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Kazuhiro NISHIYAMA <zn@...> 2014/08/11

西山和広です。

[#49909] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Dice <tetradice@...> 2014/08/11

RGljZeOBp+OBmeOAgg0KDQo+IENobUZveCDjgpLlhaXjgozjgabjgb/jgovjga7jga/jgZ3jgpPj

[#49919] Re: Rubyリファレンス chm版リミックス更新(2014年7月版) — Dice <tetradice@...> 2014/08/17

RGljZeOBp+OBmeOAgg0KDQrlhYjpgLHjgYroqbHjgZfjgZfjgabjgYTjgZ8NCuOAjG5vZGUtd2Vi

[ruby-list:49882] Re: Rubyへの要望(願望)

From: "NARUSE, Yui" <naruse@...>
Date: 2014-07-15 04:09:24 UTC
List: ruby-list #49882
2014年7月12日 13:12 MASAKI Yuhsuke <reasonset@yahoo.co.jp>:
> #inpicit Array#to_s
> Array#to_sの挙動が変更された上、暗黙に文字列を要求するところでArrayを与えることが禁止されていますが、
> 値が1以上で、内容文字列が操作されるようなケースにおいて、値はStringまたはArrayとなり、
> それが文字列を要求するメソッドに渡されるケースにおいては
> Arrayが自動的に連結されてStringとして振る舞うことが望ましいことは多々あります。
> そのようにしておくことにはやはり支障があるのでしょうか。
> なお、StringとIntegerの変換もできるだけinplicitにやって頂けると嬉しいのですが…

暗黙的変換をした方がいいようなケースはあまり記憶にありませんねぇ。
String/Integerの変換も、Perl時代に邪魔だった印象の方が強いです。

> #文字列の強制エンコーディング処理
> Web appなどでは入力文字のエンコーディングを強制することができないため、
> 「自動判別の上、特定のエンコーディングに強制変換する」機能が欲しいと思っています。
> 今はNKFを使っていますが、日本語でない場合も考えられますから。
> lvのような振る舞いをしてくれるといいかな。バイト列の文字セットなどに関しては、予め優先順位を設定できるようにするか、
> 欲を言えばバイトシーケンスから推測してくれるといいな、と思います。

まず、入力文字のエンコーディングを強制する方法は、_charset_というものが存在します。
また、現在生存しているほぼ全てのブラウザはそのページのエンコーディングでフォーム送信するはずです。
HTML5ではこの現状を追認し、仕様の一部としています。
http://www.w3.org/TR/html5/forms.html#selecting-a-form-submission-encoding
そもそも現代でこれが問題になるケースって存在するんですか?

2000年の時点でも、ページ以外のエンコーディングで送信するブラウザはごく一部だったはずです。
https://web.archive.org/web/20080515160719/http://www.ibport.ne.jp/~yui/cgiwork/code/

> #Zsh EXTENDED_GLOBのサポート
> Dir.globで**をサポートするなら、ZshのEXTENDED_GLOBをフルサポートして欲しい!
> ZshのEXTENDED_GLOBは非常に便利ですし、**だけならkshでも*(...)でできてしまいますし。
> Dirに組み込めないにしても、標準ライブラリにできませんか。
>
> #IO.mkfifoが欲しい
> プラットフォームごとの差異を吸収してくれて、さらにブロックで削除まで面倒を見てくれるといいな、と思います。

gemでしょうねぇ。

> #File#flockにブロックを
> File#flockの仕様がRubyらしくないと思うのです。
> できることならFile.openにflockまで持たせられるようにしてほしいのですが、それができないにしてもせめて
> File.open(path, "r") do |f|
>   f.flock(:EX) do
>     # ...
>   end
> end
> とできるようにしてほしいと思うのです。

FreeBSD なら open(2) に O_EXLOCK を渡せるんですが、Linux にはないんですよね。
で、自力実装してしまうと mode が "w" な時とかに挙動がおかしくなるのでよくないでしょう。
なお、flockしたままcloseすればいいだけなので、blockは必要ないでしょう。

> #明らかにいらないオブジェクトを解放して
> 一時変数などで大量のオブジェクトが生成されるケースで、実験はしていませんが理屈上は一時的にメモリーを非常に食ってしまうように思われます。
> GCの改善によってフリーズタイムが減少しているとしても、メモリー使用量自体を増大させたくないケースは多々ありますから、
> リファレンスをひとつしか作らず、すぐに失うようなケース(メソッドで定義されたローカル変数がメソッド外に持ちだされないような)ではさっさと解放してほしいと思います。
> 「使わないよ」と明示しないと難しいなら、何らかの特殊ブロックの中で作られたオブジェクトはブロックを終了すると直ちに解放される、ということではどうでしょうか?
> もっとインテリジェントには、メソッドやブロックのreturn時に局所的なGCを走らせるのが良いのではないかと思いますが、これは性能低下につながる気もしますね。

「短寿命オブジェクトを対象とした静的解析 GC の提案」という論文があります。
http://almond.cs.uec.ac.jp/papers/pdf/2009/komuro_prosym.pdf

ささださんが既にコメントされているとおり、実際にはRubyでこのアイディアを実装するのは難しく、
近々では2.1で入ったRGenGCが現実的なアプローチになります。

> #カンマ代替文字が欲しい
> これもDSL的アプローチにおける話ですが、
> Ordered hash的な独自のクラスを定義した場合、その定義がどうしてもすべて,で区切らざるをえず、非常に見づらくなります。
> Perlでは=>が,のsynonymになっているため使い分けることで見やすくかけますが、やはりそういうものは欲しいな、と感じます。

RubyのHashは順序を保存するので、Hashを渡せばいいでしょう。

> #File.openのargはinplicit to_sしてくれてもいいのでは
> ファイルでスクリプタをとりますが、IO.openでなくFile.openでファイルデスクリプタをとる必要がありますでしょうか?

基本的にRubyは型を気にする言語なので、積極的な理由がなければ暗黙的変換はしません。

> # String#scanのブロック引数はMatchDataであるべきではないか?
> 影響の大きい変更となりますが…

2.0前だったかに提案したんですが、流れてしまいました。

> # IO#write_reopen/IO#read_reopen?
> IO.popenが全二重のパイプを作るので、リダイレクト面倒です。
> これに対する対応はないのでしょうか。IO.pipeとforkを使え、ということでしょうか。
>
> # サブプロセスからの読み戻し
> Kernel.`をKernel.execのような形で呼べる書式が欲しいということと、
> 入力を渡してその出力が戻り値になるようなメソッドが欲しいと思います。つまり
> filter(["wc", "-l"], "I\nwant\nit")
> のようなものです。

「open3 のはなし」をご覧下さい。
https://staff.aist.go.jp/tanaka-akira/pub/tokyo-rubykaigi-03-akr-2010.pdf

> # 先進的演算子
> 他ではみないものですが、あるといいな、と思うのが
> .=
>   obj .= method(arg)
>   -> obj = obj.method(arg)
> ?=
>   obj ?= 1 : 0 #-> obj = obj ? 1: 0
>   obj ?= + 1 : 0 #-> obj = obj ? obj + 1 : 0
> 同様に&&=もメソッドをとれるようにしてもらえるといいな、と思っています。
> .&
>   メソッドを呼び出し、戻り値がnilならば続くメソッドを呼び出さずnilでreturnする。
>   特にl.gets.&chomp.splitというようなシーンでゆうようです。これは
>   ->() { (l.gets || break nil).chomp.split }.call
>   のようなメソッドです。中間オブジェクトを書かなくてすみ、すっきりしたコードが書けると思います。

Groovyが挙げられていますが、今話題のSwiftでも?.ですね。
どこかになかださんが作ったパッチがあると思うのですが……。

> # 軽量な起動, precompile
> 小さなスクリプトで頻繁に起動されるようなケースでは毎回Rubyを起動してparseしてcompileして、というのがかなりロスになります。
> PerlのC/CCコンパイラのように予め必要な情報を埋め込んだコードを生成しておくことはできないのでしょうか。
> もちろん、mrubyを使えばバイトコードまたはCコードにしておいてからの起動が可能でしょうが、CRubyでやりたいのです。

「Ruby 用 AOT コンパイラ」のような試みはありますね。
http://rubykaigi.org/2010/ja/events/85

-- 
NARUSE, Yui  <naruse@airemix.jp>

2014年7月12日 13:12 MASAKI Yuhsuke <reasonset@yahoo.co.jp>:
> Ruby listの皆様、はじめまして、MASAKI Yuhsukeです。
>
> 個人的にRubyに欲しい機能、Rubyに欲しい振る舞いを述べさせてください。
> なお、ちゃんと把握しているのは1.8.6で、それ以降についてはNEWSは見ましたが、
> 「既にそうなっているよ!」「既に議題に上って結論出てるよ!」ということがあるかもしれませんが、ご容赦ください。
> (そもそも誤解があるかもしれませんが、それもご容赦ください)
>
> なお、大いにIf you want Perl, you know where to find it.なところがあるかと思われますが、ご容赦くださいませ。
>
> #inpicit Array#to_s
> Array#to_sの挙動が変更された上、暗黙に文字列を要求するところでArrayを与えることが禁止されていますが、
> 値が1以上で、内容文字列が操作されるようなケースにおいて、値はStringまたはArrayとなり、
> それが文字列を要求するメソッドに渡されるケースにおいてはArrayが自動的に連結されてStringとして振る舞うことが望ましいことは多々あります。
> そのようにしておくことにはやはり支障があるのでしょうか。
> なお、StringとIntegerの変換もできるだけinplicitにやって頂けると嬉しいのですが…
>
> #3 part forとcontinueブロック
> continueブロックはブロックにおいてbreakが呼ばれると実行されないループの付属ブロックです。
> 現状、そのようにするためにはフラグ変数を用意してのensureか、もしくはnext/breakのかわりにthrowを使うようなことが必要で、スマートではあり
> ません。
> 例えば
>
> while re =~ str
>   # nextまたはbreakを伴うような条件判定のある内容
> continue
>   str.sub! matched_pattern, escape_str
> end
>
> のようなことをしたいことがあります。
> また、3part forはこれに加えて、そのループで使うための値を用意することをループの中でもたせる、ということができます。
>
> for(str = STDIN.gets nil; str == ptn1 .. ptn2; str = str.sub(re, substr))
>   # strを使った処理...
> end
>
> この場合、strはforループが終わったら殺してください。
>
>
> #文字列の強制エンコーディング処理
> Web appなどでは入力文字のエンコーディングを強制することができないため、
> 「自動判別の上、特定のエンコーディングに強制変換する」機能が欲しいと思っています。
> 今はNKFを使っていますが、日本語でない場合も考えられますから。
> lvのような振る舞いをしてくれるといいかな。バイト列の文字セットなどに関しては、予め優先順位を設定できるようにするか、
> 欲を言えばバイトシーケンスから推測してくれるといいな、と思います。
>
>
> #Zsh EXTENDED_GLOBのサポート
> Dir.globで**をサポートするなら、ZshのEXTENDED_GLOBをフルサポートして欲しい!
> ZshのEXTENDED_GLOBは非常に便利ですし、**だけならkshでも*(...)でできてしまいますし。
> Dirに組み込めないにしても、標準ライブラリにできませんか。
>
>
> #IO.mkfifoが欲しい
> プラットフォームごとの差異を吸収してくれて、さらにブロックで削除まで面倒を見てくれるといいな、と思います。
>
>
> #File#flockにブロックを
> File#flockの仕様がRubyらしくないと思うのです。
> できることならFile.openにflockまで持たせられるようにしてほしいのですが、それができないにしてもせめて
> File.open(path, "r") do |f|
>   f.flock(:EX) do
>     # ...
>   end
> end
> とできるようにしてほしいと思うのです。
>
>
> #自由な区切り文字による入力をメソッド定義に
> %q(...)形式ですが、特にDSL的アプローチをしていると新しいリテラルが欲しくなることは多々あります。
> これを
> def Kernel.perquote_q(str)
>   # ...
> end
> のようなメソッドで定義できるようにしてくれると嬉しいと思います。
>
>
> #メソッド名にsymbolを増強
> 同じくDSL的アプローチにおいてsymbolを使ったメソッド名が欲しいことが多々あります。
> ?と!は自由に使えるとはいえ、どのように振る舞うべきかは決まってしまっていますから、振る舞いが規定されていないpostfix symbolが欲しいのと、
> 単純に前置することでprivateなinstance methodだと理解されるようなsymbolのメソッドが欲しいとも思います。
> つまり
> <sym> arg
> が
> self.<sym> arg
> と認識されるということですね。
>
>
> #blockをbindingで評価できるようにして
> Procのインスタンスメソッドでなく、Kernel.evalが文字列でなくブロックもとれるようになれば良いと思うのですが、
> 特定のbindingで評価したいブロックを予め書いておきたいケースは多々ありますし。
> 私が抱えている実際のケースとしては、
> DSL的アプローチにおいて、本文中のローカル変数を後ろでまとめて定義できるようにしたいのですが、
> そうなると文字列で書かせる必要があり、美しくないので気に入らないのです。
>
>
> #明らかにいらないオブジェクトを解放して
> 一時変数などで大量のオブジェクトが生成されるケースで、実験はしていませんが理屈上は一時的にメモリーを非常に食ってしまうように思われます。
> GCの改善によってフリーズタイムが減少しているとしても、メモリー使用量自体を増大させたくないケースは多々ありますから、
> リファレンスをひとつしか作らず、すぐに失うようなケース(メソッドで定義されたローカル変数がメソッド外に持ちだされないような)ではさっさと解放してほ
> しいと思います。
> 「使わないよ」と明示しないと難しいなら、何らかの特殊ブロックの中で作られたオブジェクトはブロックを終了すると直ちに解放される、ということではどう
> でしょうか?
> もっとインテリジェントには、メソッドやブロックのreturn時に局所的なGCを走らせるのが良いのではないかと思いますが、これは性能低下につながる気もし
> ますね。
>
>
> #カンマ代替文字が欲しい
> これもDSL的アプローチにおける話ですが、
> Ordered hash的な独自のクラスを定義した場合、その定義がどうしてもすべて,で区切らざるをえず、非常に見づらくなります。
> Perlでは=>が,のsynonymになっているため使い分けることで見やすくかけますが、やはりそういうものは欲しいな、と感じます。
>
>
> #Kernel.syscallにStringを渡せるようにしてほしい
> まんまです。
>
> # next/redo/breakのターゲットを明示できるようにする
> ネストしたループにおいてループ内でこの3つを全て使うようなケースでは、throw/catchとbegin/ensureを使ってもDRYを守れません。
>
> #File.openのargはinplicit to_sしてくれてもいいのでは
> ファイルでスクリプタをとりますが、IO.openでなくFile.openでファイルデスクリプタをとる必要がありますでしょうか?
>
> # String#evalが欲しい
> 文字列を式展開を含めた文字列解釈をするメソッドが欲しいのです。
>
> # String#scanのブロック引数はMatchDataであるべきではないか?
> 影響の大きい変更となりますが…
>
> # IO#write_reopen/IO#read_reopen?
> IO.popenが全二重のパイプを作るので、リダイレクト面倒です。
> これに対する対応はないのでしょうか。IO.pipeとforkを使え、ということでしょうか。
>
> # サブプロセスからの読み戻し
> Kernel.`をKernel.execのような形で呼べる書式が欲しいということと、
> 入力を渡してその出力が戻り値になるようなメソッドが欲しいと思います。つまり
> filter(["wc", "-l"], "I\nwant\nit")
> のようなものです。
>
> # Enumerable#split
> こんな感じ。
> class Enumerable
>   def split(obj)
>     result = [ Array.new ]
>     if block_given?
>       self.each {|i| yield(i) ? result[-1].push(i) : result.push(Array.new) }
>     else
>       self.each{|i| obj === i ? result[-1].push(i) : result.push(Array.new) }
>     end
>   end
> end
>
> # 先進的演算子
> 他ではみないものですが、あるといいな、と思うのが
> .=
>   obj .= method(arg)
>   -> obj = obj.method(arg)
> ?=
>   obj ?= 1 : 0 #-> obj = obj ? 1: 0
>   obj ?= + 1 : 0 #-> obj = obj ? obj + 1 : 0
> 同様に&&=もメソッドをとれるようにしてもらえるといいな、と思っています。
> .&
>   メソッドを呼び出し、戻り値がnilならば続くメソッドを呼び出さずnilでreturnする。
>   特にl.gets.&chomp.splitというようなシーンでゆうようです。これは
>   ->() { (l.gets || break nil).chomp.split }.call
>   のようなメソッドです。中間オブジェクトを書かなくてすみ、すっきりしたコードが書けると思います。
>
>
> # 軽量な起動, precompile
> 小さなスクリプトで頻繁に起動されるようなケースでは毎回Rubyを起動してparseしてcompileして、というのがかなりロスになります。
> PerlのC/CCコンパイラのように予め必要な情報を埋め込んだコードを生成しておくことはできないのでしょうか。
> もちろん、mrubyを使えばバイトコードまたはCコードにしておいてからの起動が可能でしょうが、CRubyでやりたいのです。
>
>
> 賛同頂けますと(さらには開発の参考にしていただけますと)とても嬉しく思います。
>
>
> ================================
> # The Rider, Hacker and Musician
> #    ENABLE YOUR HEART.
> #
> #  mailto:MASAKI Yuhsuke <reasonset@yahoo.co.jp>
> # Blog: http://reasonset.net/journal/
> # Twitter @reasonset
> =================================



-- 
NARUSE, Yui  <naruse@airemix.jp>

In This Thread