言語女子会: undefとnullは両方必要?

Twitterのタイムラインが面白すぎて、ついうっかり言語を擬人化して脳内で言語女子会なるものを開いてしまいました。なお、登場人物と実在の人物は1対1に対応しません。

undefinedとnullの両方必要なの?


:

Perl: JavaScriptundefinednull
JavaScript: undefined
Python: 
Ruby: 
Python & Ruby: 
Java: null0
C: 
Perl: (C Java) nullundef
Lisp: (  nil     (   )  #t  )
JavaScript: 

空リストからpopしたら?

JavaScript: 例えばさ、空のリストからpopした時ってundefined返したいじゃない?
Python: 例外投げて死ねばいいよね、Rubyちゃん
Ruby: え?nilを返すでしょ常識的に考えて
Python: は?じゃあnilの入っていたリストからpopした場合とどうやって区別するの?
C: これだから最近の若い子は…私は成功した時に0 <= n < 256の値を返す関数でも、失敗した時に-1を返すためだけにint型にしているというのに!まったく考えなしのゆとりなんだから!
Ruby: (Cおばさん、めんどくさっ) Lispさんはどう思いますか?
Lisp: (あらあら そんな昔のこと 忘れたわ (と gosh を 起動して 試してみる)) (car ()) は 例外を投げる ようね*1

存在しないキーへのアクセス


JavaScript: undefined
Python: obj.has_key(k) *2 *3
JavaScript: 
Python: Ruby
Ruby: nil*4
Memcached: (false)*5
Python: nil()
Ruby: (-_-#)
Haskell: undefinednull使
JavaScript: Haskell使Maybe
Python: Nothing*6
Haskell: (-_-)

まとめ

Python: でもま、CさんやHaskellちゃんの言うとおり、返り値でエラーを伝える場合、それは成功した時に返されうる値以外でなきゃダメよねー、成功したのか失敗したのかわかんなくなっちゃうもんねー(とニヤニヤしながらRubyの顔を見る)
Haskell: (賛成してもらえてとても嬉しいのだが、その感情はIOモナドに押し込められて無表情)
Python: そういう意味で、リストや属性に入れられるnullと、失敗を伝えるための無効値undefinedを区別するのは合理的ね。JavaScriptちゃんもいいところあるのよね
JavaScript: あれ、いい忘れたけどundefinedはリストに入れられるよ
Python: はぁ?!死ねばいいのに!!

あとがき

PerlPythonRubyをDISりはじめたあたりから、思い当たるフシがありすぎて心の中が$_=~#(;_;)#;#$@#{$#}...

このSSを書くインスピレーションを与えてくれた皆さんにthanks! @__gfx__ @kazuho @__kan @tanakh

興味を持った方には僕の書いた「言語設計の基礎知識」を含む60冊分のPDFが1冊にまとまったWebDB Press 総集編がオススメ:

補足

僕の発案だという勘違いがあるみたいなので引用しておきます。女子会になった理由はコレを「彼女」ではなく「彼氏」にしたかったからでした! https://twitter.com/#!/__kan/status/180580941335502848

@__kan: nullとundefinedの両方が存在してる理由が分からないっていうけど、今彼女が居ないのと生まれてこのかた彼女がいないのは明確に区別するべきでしょう

あとはこれを読んでMaybe→Nothingというオチを思いついたことも書く動機になりました笑 https://twitter.com/#!/tanakh/status/180593265706414080

@tanakh: 今更nullとかundefinedとかにフラストレーション貯めてる人はHaskel使ったほうがいいよ



 (by @raitu thanks!)



NULL(byid:yappo thanks!)



ES54.3.94.3.11(by @yukoba thanks!)



ClojurenilClojure (pop '())  (pop nil) nilnilpop (by @omasanori thanks!)



JS undefined  (by @tnacigam thanks!) 



PHP (byid:Retrorocket thanks!)

PHP:() (byid:koyhoge thanks!)



(Ruby)20key[]fetchalias (by @yugui thanks!)



SQLnullundef (car ())schemeclispnilcdr(by @Tomokatz thanks!)



Lua  nil (by @torus thanks!)


*1:by @ser1zw Common LispNILCLISPthanks!

*2:PythonRubyobj.fooRubyNoMethodError

*3:by @a_yasui (has_key)2.63.0 使in使thanks! 

*4:by @niku_name  hash.fetch 使Python() http://rurema.clear-code.com/1.9.3/method/Hash/i/fetch.htmlthanks! 

*5:by @methane Memcachedfalsephpmemcachedfalse0nullthanks!

*6:HaskellMaybeNothing