2014-06-11
Swiftのおもしろ仕様と、Scalaの特殊な(?)構文
以下の、Appleが最近発表したSwiftという言語の、面白い(?)仕様が話題になってますが、
大事なことは全部MLが教えてくれた 〜 Apple の Swift の mutability 周りの件を理解する
これ見て、なんとなくScalaの "とある構文" を思い出したので書いてみる。
自分の理解では、要するに
「b.append(5)というのが、単なるメソッド呼び出しとかではなく、コピーして、追加して、かつ元の変数b自身の参照を書き換える(再代入する)」
という挙動をするあたりが、(他の言語でこんな動きするのがないので)、みんなが驚いているところですよね?
(Swiftの言語仕様上で、どういう定義のされ方をしてるのかは知らないが、とりあえず自分はそのように解釈した、という話)
それで、この
「普通のメソッド呼び出しに見えて、それは実は特殊な構文みたいなもので、代入以外の方法で変数に再代入のようなことが可能」
って、他にもありますよね?そう、Scalaで。
あとは、もう3年以上も前に書いたこれを読んでもらえばいいわけですが
scalaでは、なぜインクリメントやデクリメントができないのか?
要約すると、Scalaでは、「i += 1」は、実は「i = i + 1」のシンタックスシュガーです。インクリメントに限らず、イコールで終わるようにすれば、任意のものに適用できます。
Scalaの言語仕様を今更批判するつもりもないし、個人的にはSwiftもどうでもいいんですが
「Scalaのこの仕様を知らない人が初めて知ったら、どう思うのだろうなぁ」
というのが気になりました。
「Swiftのあの仕様と、Scalaのこの仕様、どっちが気持ち悪く感じるのかなぁ」
とか。
ちなみにScalaのこの仕様、少しは使われてますが、それほど多く使われてるわけでもなく、個人的には、最悪なくなっても困らない気はします。逆に「積極的になくすべきだ!」とも思わないですが。
以上、Swiftと関係あるのかどうか微妙な、どうでもいい話でした
- 71 http://t.co/1102eYiVhJ
- 71 http://t.co/lRoVnBzjkl
- 28 http://d.hatena.ne.jp/camlspotter/20140611/1402457362
- 19 http://t.co/qaUAnfQHTC
- 10 http://t.co/GAUEW6RTNJ
- 10 http://togetter.com/li/679705
- 6 http://b.hatena.ne.jp/
- 6 http://news.google.com/
- 6 http://pipes.yahoo.com/pipes/pipe.info?_id=02db597254ec68550537866a2fca2ce6
- 6 http://t.co/gks2l3Adgu
Switfのarrayやdictionaryは少々不可解な挙動を示しておりまして。
* letと宣言した変数に代入されたのがSwift nativeのarrayやdictionaryである場合、それらはmutableである
* varと宣言した変数に代入されたのがSwift natvieのarrayやdictionaryである場合、それらはimmutableである
とで挙動が異なるのが不思議がられているのです。ですから、リンク元に記事は何が不思議かという点についての全体をそもそもはっきり示していません(camlspotterさんは個人的にも存じ上げていますが、今回の点についてはSwift Bookを読まないと問題の全体像がわかりません)。
平たく言うと、「letに代入された」arrayやdictionaryはSwiftにおいてimmutableとみなされるということなのですが、ここでのimmutableの定義が鬼門です。
AppleのSwift Bookから引用しましょう。そこには恐るべき事が書かれています。
“For dictionaries, immutability also means that you cannot replace the value for an existing key in the dictionary. An immutable dictionary’s contents cannot be changed once they are set.
Immutability has a slightly different meaning for arrays, however. You are still not allowed to perform any action that has the potential to change the size of an immutable array, but you are allowed to set a new value for an existing index in the array. This enables Swift’s Array type to provide optimal performance for array operations when the size of an array is fixed.”
抜粋:: Apple Inc. “The Swift Programming Language”。 iBooks. https://itun.es/jp/jEUH0.l
つまり、「immutableな配列においても」サイズは変更できないが*要素の値は変更できる*、と言っているのですね。そして、immutableかどうかは宣言がletかvarによって異なります。これが問題の全体像です。
これがわかって、
https://twitter.com/dwarfland/status/476310789763395584
の問題の邪悪さの全体像が初めて理解できます。というわけで、今回に限ってはcamlspotterさんの推測ははずれです。
> * letと宣言した変数に代入されたのがSwift nativeのarrayやdictionaryである場合、それらはmutableである
> * varと宣言した変数に代入されたのがSwift natvieのarrayやdictionaryである場合、それらはimmutableである
順番が逆でした。つまり、
* letと宣言した変数に代入されたのがSwift nativeのarrayやdictionaryである場合、それらはimmutableである
* varと宣言した変数に代入されたのがSwift natvieのarrayやdictionaryである場合、それらはmutableである
黒歴史をこの身に刻みます…
参考: https://twitter.com/kmizu/status/477342364575342593