Feature #10059

[PATCH and SUGGEST] 代数構造を記述する時にメタプログラミングは非常に非常に強力ですが

Added by gogo tanaka 8 months ago. Updated 6 months ago.

[ruby-dev:48429]
Status:Feedback
Priority:Low
Assignee:-

Description

タイトルに書きました通り、代数構造を記述する時にメタプログラミングは非常に非常に強力で

保守性や可読性を著しく推し上げます. 著しくです. これは代数的な性質(演算子の対称性、可逆性など)を記述出来る事に起因します.

しかし議論を呼びそうなのと取り分け優先度が高い訳でないので、提案レベルで簡単なPATCHを投げさせて頂きます. お手透きの時にでも目をお通し下さい.

using_define_method_for_Vector_arithmetic.patch Magnifier (1.29 KB) gogo tanaka, 07/18/2014 08:29 AM

using_define_method_for_Scalar_arithmetic.patch Magnifier (1.04 KB) gogo tanaka, 07/18/2014 08:29 AM

using_define_method_for_Matrix__arithmetic.patch Magnifier (2.04 KB) gogo tanaka, 07/18/2014 08:29 AM

History

#1 Updated by Akira Tanaka 8 months ago

ふとパッチを見たのですが、これって rdoc で生成されるドキュメントはどうなるのでしょうか。

#2 Updated by Motohiro KOSAKI 8 months ago

  • Status changed from Open to Feedback

#3 Updated by gogo tanaka 7 months ago

Feedbackを頂いたのにも関わらず、見落としておりました.

失礼しました.

Akira Tanaka wrote:

ふとパッチを見たのですが、これって rdoc で生成されるドキュメントはどうなるのでしょうか。

試みたところ、期待されるモノは生成されませんでした.

rdocの部分を除いても、このfeature自体、見直す余地がありますので一旦取り下げさせて頂きたいと考えております.

蛇足となりますが、method_define を用いたメソッドに対するrdocの生成など面白いかもしれませんね.

お騒がせ致しました.

#4 Updated by Naohisa Goto 7 months ago

現在のRDocの挙動では、以下のように、メソッド定義そっくりだが実際には定義されない文を記述しておくと、メソッドは定義されないがRDocには反映されるので、私はそれを活用しています。
ただし、これが本当に正しいのか、単に現在のRDocの挙動に依存しているだけなのか、はわかりません。

 # このabcdeメソッドの説明文。
 # 説明文続き。
 # 説明文続き。
 def abcde(f="g") end if false

#5 Updated by gogo tanaka 7 months ago

@Naohisa Goto さん

なるほど、そちら面白いですね.

しかし、そちらの場合はむしろドキュメントが生成されない方が好ましい気もしますし

method_define を用いた場合は生成されて欲しいです.

(実際に定義されたものを必要十分にドキュメントは生成すべきと考えます)

RDocの方に投げかけてみたいと思います.

ともあれご教授ありがとうございました. 非常によい見地を頂きました.

#6 Updated by Naohisa Goto 6 months ago

RDocの件について、前述の"def xxx end if false"のように常に偽になるなら話は簡単ですが、極端な場合だと "def xxx end if rand(5)<3" のようにランダムにメソッド定義が発生するコードも可能ですし、さらに rand関数を再定義するのも可能です。

このような場合も考えると、現在のRDocの挙動(defによるメソッド定義に書かれたドキュメントは詳細な条件分岐は見ずに使う)は順当だと思っています。

# このメソッドのRDocはどうする?
def abcd(e="f") end if rand(5)<3

# rand は常に10を返す関数と定義
def rand(*arg); 10; end

# rand(5)>5 は、普通(Kernel.randが呼ばれる場合)は必ず偽になるが、
# このコンテキストではrandは常に10を返すと定義したので、
# rand(5)>5は常に正になる。
# では、このメソッドのRDocはどうする?
def efgh(i="j") end if rand(5)>5

Also available in: Atom PDF