Var についてちょっとボヤいたら少し教えてもらえた。
Clojure の var が理解できない。なんだこれ。 というか、イミュータブルなの?ミュータブルなの?イミュータブルでいいんだよね。
2014-06-12 23:14:55@ayato_p 参照であるvar「は」mutableですが、varの参照先の値はimmutableです(Javaの世界から持ってきたオブジェクトなら話は別)
2014-06-12 23:17:25@omasanori Hmmm... 今混乱しているのが (def x 5) としたときに x が var になるんですか?それとも var フォームを使うことで var を参照することが出来るんですか?
2014-06-12 23:20:27@ayato_p xと(var x)の違いは古典的なLispのxと(quote x)に近いものだと私は考えています。xはvarであり、単にxと書くとvarの値(参照先)が得られます。一方、(var x)と書くことによってvarを表現するオブジェクトそのものが得られます。
2014-06-12 23:25:23結局、再定義できるという部分に確信がもてなかったので質問してみた。
@athos0220 twitter.com/ayato_p/status… これってどう説明してあげると良いと思いますか?僕があんまり理解してないってのもあるはあるんですけど、よく分かんなくて。。。
2014-06-13 12:38:14@ayato_p Varは実際イミュータブルではないです。defによる再定義の他、alter-var-root等のAPIで値を更新できます。しかし、これらの機能はREPLやファイルのリロードによる値の更新を実現するための機能であって、一般のユーザがプログラム中から自由に値(続く)
2014-06-13 12:56:17@athos0220 そう、そこがやっぱり良くわからないんです。参照している先が変わったという認識でいいんですよね? バインドされているオブジェクトが変わったというか。
2014-06-13 13:03:47@ayato_p そうですそうです。VarというのはVarオブジェクトという一種の参照型になっていて、トップレベルの定義はそのオブジェクトへ値を束縛します。
2014-06-13 13:07:45@athos0220 だから今回の例だと5が変更されたわけではなくて、参照する先が6になったということでいいんですよね?この辺、何読んだらわかるのか分かんなくて、悩んでました。ありがとうございます!
2014-06-13 13:10:18@athos0220 うんうん。なるほど。 あと、束縛の考え方は他のLisp系とだいたい同じでいいんですか?参照とか言われ始めると違うのかなーとか思うんですけど。
2014-06-13 13:19:56@ayato_p 関数の引数やletで導入されるようなローカルな束縛に関しては(破壊的に更新できない点を除けば)だいたい同じじゃないですかね。トップレベルの束縛は、さっき言ったように実体はVarオブジェクトというファーストクラスの値なので、扱いは少し違うと思います。
2014-06-13 13:29:13