2021/06/06

[kotlin] はてな はnullable

少し前に、JavaScript の ?? や ?. の意味を調べた。

hiro99ma blog: [js]はてな、はてなはてな、はてなドット
https://blog.hirokuma.work/2021/05/js.html

C言語だと ! は否定、 ? は三項演算子の1番目、という意味しかなかったのだが、JavaScript はいろいろ意味があるんだなぁ、くらいに思っていた。

 

が、Kotlin にも ? がけっこう出てくることに気付いた。
最近の言語の流行りなんだろうか。

 

以前も載せた気がするのだが、もう私の記憶に残っていないからよしとしよう。

Keywords and operators | Kotlin
https://kotlinlang.org/docs/keyword-reference.html#operators-and-special-symbols

演算子なので operator だ。

? だけだと「これは nullableですよ」、 ?. は、nullではない場合だけ呼び出すという意味だそうな。

 


Kotlin にも === と !== があった。
referential equality という名前で、 a === b は a と b が同じオブジェクトを指している場合に trueになる。

 

JavaScript はどうだったかというと、 strict equality という名前で、日本語だと「厳密等価」と呼ぶそうだ。アルゴリズムに従って判定するとのこと。 x === y の場合、

  1. Type(x) と Type(y) が異なるならば false
  2. Type(x) が undefined なら true
  3. Type(x) が null なら true
  4. Type(x) が 数値の場合、
    1. x が NaN なら false
    2. y が NaN なら false
    3. x と y の数値が同じ値なら true
    4. x が +0、 y が -0 なら true
    5. x が -0、 y が +0 なら true
  5. Type(x) が 文字列の場合、 x と y が同じ文字列(同じ文字長かつ各位置の文字が一致)なら true、それ以外は false
  6. Type(x) が 真偽値(boolean)の場合、どちらも true か どちらも falseの場合は true、それ以外は false
  7. x と y が同じオブジェクトを指しているなら true、それ以外は false

 

7番目が kotlin の定義と同じなのだけど、じゃあ Kotlin でオブジェクト以外だと === が使えないということなのか? いやそもそも Kotlin は JavaScript を意識した言語なのだろうか?

そんなことを考えながらページを見ていったのだが 「JS」 というのがあることに気付いた。

image

意識しているとかなんとかではなく、

Kotlin for JavaScript | Kotlin
https://kotlinlang.org/docs/js-overview.html

Kotlin for JS という JavaScript からトランスパイルするものだそうな。
トランスパイルって何だろうと検索すると、TypeScript を JavaScript にトランスパイルする、とか、トランスパイラーとか、そんなのが出てきた。中間言語に置き換える、というのともちょっと違うのかもしれんが、昔の cfront みたいなものと思ってもよいのかもしれん。

ともかく、Kotlin for JS は transpile to JavaScript なので、Kotlin で書いたものを JavaScript に変換して、あとは JavaScript でやってもらうのだろう。立ち位置としては TypeScript と同じようなところにいるのか。まあ、Android などの場合も JVM に transpile するものだし、 Kotlin/Native は iOSも対象に入っているようなので、Kotlin が各ネイティブ言語へのラッパー言語のような戦略をとっているということか。 Java や .NET がやっていることよりも階層が上なので、各言語に対応する大変さはあるものの、その言語が使える環境であれば仮想的なものを用意せずに動かせるという利点がある。今のように「Android は Java」「iOS は Swift」のようにプラットフォームと言語がかなり固定化している時代に向いていると思う。 Kotlin で書いておけば「Android は Java やめます」ってなったとしても、 Kotlin から新しい環境へのトランスパイラさえ作ってあれば済むしね。大変だろうけど。

今回の === も、対応する概念がない言語の場合はトランスパイラがそういうコードを吐いてくれればよいだけなので、言語的な共通さを探すのはあまり意味が無いのかもしれんな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。