[ruby-list:49869] Re: Rubyへの要望(願望)
From:
Nobuyoshi Nakada <nobu@...>
Date:
2014-07-12 06:17:40 UTC
List:
ruby-list #49869
(2014/07/12 13:12), MASAKI Yuhsuke wrote:
> Ruby listの皆様、はじめまして、MASAKI Yuhsukeです。
> 個人的にRubyに欲しい機能、Rubyに欲しい振る舞いを述べさせてください。
> なお、ちゃんと把握しているのは1.8.6で、それ以降についてはNEWSは見ましたが、
> 「既にそうなっているよ!」「既に議題に上って結論出てるよ!」ということがあるかもしれませんが、ご容赦ください。
> (そもそも誤解があるかもしれませんが、それもご容赦ください)
いろいろなものがバラバラに詰め込まれすぎていて、正直読むのが大変です。
できれば一つ一つ
https://bugs.ruby-lang.org/projects/ruby-trunk/issues/new
にお願いします。
> #inpicit Array#to_s
> Array#to_sの挙動が変更された上、暗黙に文字列を要求するところでArrayを与えることが禁止されていますが、
> 値が1以上で、内容文字列が操作されるようなケースにおいて、値はStringまたはArrayとなり、
> それが文字列を要求するメソッドに渡されるケースにおいてはArrayが自動的に連結されてStringとして振る舞うことが望ましいことは多々あります。
> そのようにしておくことにはやはり支障があるのでしょうか。
一要素のArrayだと確証があるなら、splatでいいのではないでしょうか。
> なお、StringとIntegerの変換もできるだけinplicitにやって頂けると嬉しいのですが…
Implicitな変換というと、以下のような動作がお望みのものでしょうか。
"1" + 2 #=> "12"
1 + "2" #=> 3
> #3 part forとcontinueブロック
> continueブロックはブロックにおいてbreakが呼ばれると実行されないループの付属ブロックです。
> 現状、そのようにするためにはフラグ変数を用意してのensureか、もしくはnext/breakのかわりにthrowを使うようなことが必要で、スマートではあり
> ません。
> 例えば
>
> while re =~ str
> # nextまたはbreakを伴うような条件判定のある内容
> continue
> str.sub! matched_pattern, escape_str
> end
>
> のようなことをしたいことがあります。
breakが呼ばれるとブロック内のそれ以降の部分は実行されませんから、nextで
実行される部分ということでしょうか。要望は理解できますが、予約語の追加
は無理でしょう。
> また、3part forはこれに加えて、そのループで使うための値を用意することをループの中でもたせる、ということができます。
>
> for(str = STDIN.gets nil; str == ptn1 .. ptn2; str = str.sub(re, substr))
> # strを使った処理...
> end
>
> この場合、strはforループが終わったら殺してください。
既存のsyntaxとの整合性を取るのが難しそうです。
> #文字列の強制エンコーディング処理
> Web appなどでは入力文字のエンコーディングを強制することができないため、
> 「自動判別の上、特定のエンコーディングに強制変換する」機能が欲しいと思っています。
> 今はNKFを使っていますが、日本語でない場合も考えられますから。
> lvのような振る舞いをしてくれるといいかな。バイト列の文字セットなどに関しては、予め優先順位を設定できるようにするか、
> 欲を言えばバイトシーケンスから推測してくれるといいな、と思います。
コンテキスト依存度が非常に高いので、おそらく標準で用意することはないと
思います。そういうgemを利用するのがいいのではないでしょうか。
> #Zsh EXTENDED_GLOBのサポート
> Dir.globで**をサポートするなら、ZshのEXTENDED_GLOBをフルサポートして欲しい!
> ZshのEXTENDED_GLOBは非常に便利ですし、**だけならkshでも*(...)でできてしまいますし。
> Dirに組み込めないにしても、標準ライブラリにできませんか。
機能が多すぎて、取捨選択が必要そうです。
> #IO.mkfifoが欲しい
> プラットフォームごとの差異を吸収してくれて、さらにブロックで削除まで面倒を見てくれるといいな、と思います。
たしかFile.mknodやFile.mkfifoは過去に提案されてrejectされたはずです。
ちょっと見つけられませんでしたが。
> #File#flockにブロックを
> File#flockの仕様がRubyらしくないと思うのです。
> できることならFile.openにflockまで持たせられるようにしてほしいのですが、それができないにしてもせめて
> File.open(path, "r") do |f|
> f.flock(:EX) do
> # ...
> end
> end
> とできるようにしてほしいと思うのです。
一部の間だけflockするというのはあまり必要性を感じませんが、まぁあっても
いいんじゃないでしょうか。
> #自由な区切り文字による入力をメソッド定義に
> %q(...)形式ですが、特にDSL的アプローチをしていると新しいリテラルが欲しくなることは多々あります。
> これを
> def Kernel.perquote_q(str)
> # ...
> end
> のようなメソッドで定義できるようにしてくれると嬉しいと思います。
これもrejectされています。
> #メソッド名にsymbolを増強
> 同じくDSL的アプローチにおいてsymbolを使ったメソッド名が欲しいことが多々あります。
> ?と!は自由に使えるとはいえ、どのように振る舞うべきかは決まってしまっていますから、振る舞いが規定されていないpostfix symbolが欲しいのと、
> 単純に前置することでprivateなinstance methodだと理解されるようなsymbolのメソッドが欲しいとも思います。
> つまり
> <sym> arg
> が
> self.<sym> arg
> と認識されるということですね。
個人的には必要性を感じません。
> #blockをbindingで評価できるようにして
> Procのインスタンスメソッドでなく、Kernel.evalが文字列でなくブロックもとれるようになれば良いと思うのですが、
> 特定のbindingで評価したいブロックを予め書いておきたいケースは多々ありますし。
> 私が抱えている実際のケースとしては、
> DSL的アプローチにおいて、本文中のローカル変数を後ろでまとめて定義できるようにしたいのですが、
> そうなると文字列で書かせる必要があり、美しくないので気に入らないのです。
evalはブロックも取れますし、bindingも指定できます。
> #明らかにいらないオブジェクトを解放して
> 一時変数などで大量のオブジェクトが生成されるケースで、実験はしていませんが理屈上は一時的にメモリーを非常に食ってしまうように思われます。
> GCの改善によってフリーズタイムが減少しているとしても、メモリー使用量自体を増大させたくないケースは多々ありますから、
> リファレンスをひとつしか作らず、すぐに失うようなケース(メソッドで定義されたローカル変数がメソッド外に持ちだされないような)ではさっさと解放してほ
> しいと思います。
> 「使わないよ」と明示しないと難しいなら、何らかの特殊ブロックの中で作られたオブジェクトはブロックを終了すると直ちに解放される、ということではどう
> でしょうか?
> もっとインテリジェントには、メソッドやブロックのreturn時に局所的なGCを走らせるのが良いのではないかと思いますが、これは性能低下につながる気もし
> ますね。
2.0以降で試してください。
> #カンマ代替文字が欲しい
> これもDSL的アプローチにおける話ですが、
> Ordered hash的な独自のクラスを定義した場合、その定義がどうしてもすべて,で区切らざるをえず、非常に見づらくなります。
> Perlでは=>が,のsynonymになっているため使い分けることで見やすくかけますが、やはりそういうものは欲しいな、と感じます。
Rubyでは=>は必須になっていますが、そういうことではなく?
> #Kernel.syscallにStringを渡せるようにしてほしい
> まんまです。
詳細をどうぞ。
> # next/redo/breakのターゲットを明示できるようにする
> ネストしたループにおいてループ内でこの3つを全て使うようなケースでは、throw/catchとbegin/ensureを使ってもDRYを守れません。
これは以前から検討しているのですが、既存の文法とのすり合わせができてい
ません。何かアイディアがあればどうぞ。
> #File.openのargはinplicit to_sしてくれてもいいのでは
> ファイルでスクリプタをとりますが、IO.openでなくFile.openでファイルデスクリプタをとる必要がありますでしょうか?
たしかになくてもいい気がしますが、まずは警告でしょうか。
> # String#evalが欲しい
> 文字列を式展開を含めた文字列解釈をするメソッドが欲しいのです。
これも以前同じようなチケットを見た気がしますが、任意の文字列にすると
Kernel#evalと変わりませんし、Procで遅延評価させるか、String#%やERBを使
うというのが代替案でしょう。
> # String#scanのブロック引数はMatchDataであるべきではないか?
> 影響の大きい変更となりますが…
これも以前からの課題です。おそらく別メソッドを追加ということになるので
はないかと思いますが、他の案などがあればどうぞ。
> # IO#write_reopen/IO#read_reopen?
> IO.popenが全二重のパイプを作るので、リダイレクト面倒です。
> これに対する対応はないのでしょうか。IO.pipeとforkを使え、ということでしょうか。
IO.popenやIO#reopenの第二引数でmodeを指定できます。
> # サブプロセスからの読み戻し
> Kernel.`をKernel.execのような形で呼べる書式が欲しいということと、
> 入力を渡してその出力が戻り値になるようなメソッドが欲しいと思います。つまり
> filter(["wc", "-l"], "I\nwant\nit")
> のようなものです。
前者は意図がよくわかりません。後者はそういうgemかなにかで。
> # 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
chunkとかslice_before,slice_afterあたりでできないでしょうか。
> # 先進的演算子
> 他ではみないものですが、あるといいな、と思うのが
> .=
> 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でやりたいのです。
AOTはまだ構想段階です。
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦