Clojure の Var について

Clojure の Var についてちょっと教えてもらったことをまとめました。
4

Var についてちょっとボヤいたら少し教えてもらえた。

あやぴー @ayato_p

Clojure の var が理解できない。なんだこれ。 というか、イミュータブルなの?ミュータブルなの?イミュータブルでいいんだよね。

2014-06-12 23:14:55
Masanori Ogino @omasanori

@ayato_p 参照であるvar「は」mutableですが、varの参照先の値はimmutableです(Javaの世界から持ってきたオブジェクトなら話は別)

2014-06-12 23:17:25
あやぴー @ayato_p

@omasanori Hmmm... 今混乱しているのが (def x 5) としたときに x が var になるんですか?それとも var フォームを使うことで var を参照することが出来るんですか?

2014-06-12 23:20:27
Masanori Ogino @omasanori

@ayato_p xと(var x)の違いは古典的なLispのxと(quote x)に近いものだと私は考えています。xはvarであり、単にxと書くとvarの値(参照先)が得られます。一方、(var x)と書くことによってvarを表現するオブジェクトそのものが得られます。

2014-06-12 23:25:23

結局、再定義できるという部分に確信がもてなかったので質問してみた。

あやぴー @ayato_p

@athos0220 あちょすさん、少し質問いいですか?

2014-06-13 11:48:49
あやぴー @ayato_p

@athos0220 twitter.com/ayato_p/status… これってどう説明してあげると良いと思いますか?僕があんまり理解してないってのもあるはあるんですけど、よく分かんなくて。。。

2014-06-13 12:38:14
athos)))))))) @athos0220

@ayato_p Varは実際イミュータブルではないです。defによる再定義の他、alter-var-root等のAPIで値を更新できます。しかし、これらの機能はREPLやファイルのリロードによる値の更新を実現するための機能であって、一般のユーザがプログラム中から自由に値(続く)

2014-06-13 12:56:17
athos)))))))) @athos0220

@ayato_p (続き)を更新することはあまり推奨されません。あくまでそういう慣習になっているだけですが。

2014-06-13 12:58:48
あやぴー @ayato_p

@athos0220 そう、そこがやっぱり良くわからないんです。参照している先が変わったという認識でいいんですよね? バインドされているオブジェクトが変わったというか。

2014-06-13 13:03:47
athos)))))))) @athos0220

@ayato_p そうですそうです。VarというのはVarオブジェクトという一種の参照型になっていて、トップレベルの定義はそのオブジェクトへ値を束縛します。

2014-06-13 13:07:45
あやぴー @ayato_p

@athos0220 だから今回の例だと5が変更されたわけではなくて、参照する先が6になったということでいいんですよね?この辺、何読んだらわかるのか分かんなくて、悩んでました。ありがとうございます!

2014-06-13 13:10:18
athos)))))))) @athos0220

@ayato_p その理解であってます。整数が破壊的に更新できる言語ってなかなかないんじゃないですかねー。

2014-06-13 13:14:22
あやぴー @ayato_p

@athos0220 まぁ今回の例は整数ですけど、これが他のオブジェクトになっても動きは同じですよね?

2014-06-13 13:15:49
athos)))))))) @athos0220

@ayato_p はい、もちろんそうです。

2014-06-13 13:16:42
あやぴー @ayato_p

@athos0220 うんうん。なるほど。 あと、束縛の考え方は他のLisp系とだいたい同じでいいんですか?参照とか言われ始めると違うのかなーとか思うんですけど。

2014-06-13 13:19:56
athos)))))))) @athos0220

@ayato_p 関数の引数やletで導入されるようなローカルな束縛に関しては(破壊的に更新できない点を除けば)だいたい同じじゃないですかね。トップレベルの束縛は、さっき言ったように実体はVarオブジェクトというファーストクラスの値なので、扱いは少し違うと思います。

2014-06-13 13:29:13
あやぴー @ayato_p

@athos0220 ありがとうございます!だいたい理解できました!

2014-06-13 13:31:34