SelfAssigner

i++  >  i+=1  >  i:=i+1

やはりインクリメントやら自己代入が無いのはゴルフ的によろしくない,ということでなんとかしてみる。

Object subclass: #SelfAssigner
  instanceVariableNames: 'value'
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Experiment'
!
!SelfAssigner class methodsFor: 'creating instances'!
as: sym with: o
  ^Object classPool at: sym put: (super basicNew setValue: o)!
!
!SelfAssigner methodsFor: 'hacking'!
doesNotUnderstand: m
  ^value := m sendTo: value!
setValue: o
  value := o!
!
!Symbol methodsFor: 'golf'!
<+ o
  ^SelfAssigner as: self with: o!
$ ./gost.st -
GNU Smalltalk ready

st> #i <+ 1!
SelfAssigner new "<0x19b9d7a8>"
st> i + 1!
2
st> i * 2!
4
st> i ? 3!
64

なんとかなったようだ。しかしこのままだと Object に定義済みのメソッドが

st> i class!
SelfAssigner

うまく動かない(この場合 SmallInteger となってほしい)。
未定義扱いにするのはムリそうなので,上書きしてなんとか出来ればいいのだけど

[:m| Object selectors do: [:s| SelfAssigner addSelector: s withMethod: m ] ]
  value: SelfAssigner>>#delegateToValue!

この #delegateToValue の中身をどうしたものか。
仮引数に頼らずに引数を取得する(JSならargumentsで可能)には…?