プログラミング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)と等価なのは確かにそうなんだけど。
けど。普通のオブジェクト指向言語の構文は、主語+動詞を明示したいからでもある。
でも主語+動詞が自然なのは、副作用があるからだよね。副作用がないなら主語も動詞もいらない。