一般化set!

9章6節。最近は1日1節にも満たないなぁ。
超スローペース。こりゃいかん。
id:yagiey:20090307:1236410958で登場したset!が再び登場。


set!は既に束縛されている名前を別のオブジェクトに束縛し直す手続き(?マクロ?よく分からんけど)だったけど、SRFI-17(Gaucheでは組み込みでサポート)の拡張では、名前だけではなく

(set! (car ) )
(set! (cdr ) )

みたいなこともできるそうな。
なるほど、これは便利そうな気がする。
ってことで、使ってみる。

gosh> (define p (cons 1 2))
p
gosh> p
(1 . 2)
gosh> (set! (car p) 3)
#<undef>
gosh> p
(3 . 2)
gosh> (set! (cdr p) 4)
#<undef>
gosh> p
(3 . 4)

push!で束縛し直す場合にもset!同様に

gosh> (push! (cdr *nums*) 1/2)
#<undef>
gosh> *nums*
(1 1/2 2 3 4)

みたいにできる。


本来はset!の第1引数には名前が必要で、carやcdrが使えるのはSRFI-17による拡張だと。
同じ働きをする専用の手続き、set-car!とset-cdr!があるそうだ。
...という文脈なので、この2個はSchemeの仕様にあるのかな。