プログラミングGaucheの17章末のコラムで、obj.methodのような構文の言語とは違うってのと、そういう普通のオブジェクト指向言語ではレシーバとメソッドをちゃんと指定しないと動かないよね(a-point.move-by(b-vector)
なのかb-vector.move-by(a-point)
なのか)とか書いてあるけど。
(define-method move-by! ((p <2d-point>) (v <2d-vector>)) (inc! (ref p 'x) (ref v 'x)) (inc! (ref p 'y) (ref v 'y))) (define-method move-by! ((v <2d-vector>) (p <2d-point>)) (inc! (ref p 'x) (ref v 'x)) (inc! (ref p 'y) (ref v 'y)))
と同じ意味のコードを素直にRubyで考えるなら
class Vector attr :x, :y def initialize(x, y) @x = x; @y = y end end class Point attr_accessor :x, :y def initialize(x, y) @x = x; @y = y end def move(v) @x += v.x; @y += v.y end end
で、Gaucheで上のdefine-methodが適用されているなら(move-by! b-vector a-point)
でも(move-by! a-point b-vector)
と等価なのは確かにそうなんだけど。
けど。普通のオブジェクト指向言語の構文は、主語+動詞を明示したいからでもある。
でも主語+動詞が自然なのは、副作用があるからだよね。副作用がないなら主語も動詞もいらない。