free as in air

2007|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|09|11|12|
2012|03|04|05|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|03|04|06|09|
トップ «前の日記(2008-04-01) 最新 次の日記(2008-04-09)» /編集

2008-04-03 [長年日記]

§ [program] プログラミングGauche 17章末のコラム

プログラミング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)と等価なのは確かにそうなんだけど。

けど。普通のオブジェクト指向言語の構文は、主語+動詞を明示したいからでもある。

でも主語+動詞が自然なのは、副作用があるからだよね。副作用がないなら主語も動詞もいらない。