update.つい先日、Facebookが新しいプログラミングSkipの処理系をOSSとして公開しました。Veteransの6つが挙げられています。Language」の部分についてのみ調べてみることにしました。結論からいうと、Skipの言語仕様は、特に構文においてはScalaやKotlinの影響が色濃く、セマンティクスもそれらの言語の影響を大きく受けていると言えそうだと感じました。以下、Skipの構文について述べていきます。コード例はDocsのページのコード例をだいたい元にしており、コードがそのまま動作するか確認してはいないことに注意してください。Playgroundで簡単にコードを実行してみることはできるのですが、mainメソッドがないと実行ができないのでややめんどくさいです。非常に短いコードでもコンパイルが遅いです。使い、返り値の型の後に中括弧が来て本体が来る辺りは、Kotlinの文法の影響があるようです。キーワードが必須なのに対してSkipでは必要ないところでしょうか。z}ここで面白いのは、レキシカルな最初の代入が変数の宣言を兼ねているところです。動的型付き言語ではよくありますが、静的型付き言語では比較的珍しい仕様だと感じます。拙作のOnionでもこの方式を採用していましたが、変数の宣言が目立たなくなるという欠点はあるように感じます。ように、先頭に!を付けなければいけないという制約があるためではないかと考えています。変数の型を明示的に指定することもできます。z}Skipの型推論はさほど強くないように見えますし、明示的に型を割り当てる構文は必要そうです。以下のプログラムは正しいです。いう語を引きずったのでしょうか。いったおなじみのものがそろっています。found.}無名関数(クロージャ):最近の言語ではお馴染みです。つけることで、無名関数(クロージャ)を作ることができます。ように、変数名の前に、プレフィクス!を付ける必要があるようです。これが、あとで副作用をトラッキングすることに使うのかもしれません。クラス定義とメソッド以下を見るとわかりますが、Scala/Kotlinと近い方式を採用しています。クラス名の後にクラスパラメータが来る方式です。Point()でなく、Point(...)を使うのはKotlinの影響でしょうか。名前付き引数これまでの構文はScala/Kotlinの影響が大きく見られましたが、名前付き引数はちょっと違った構文を採用しています。囲んだ仮引数列を与えることで、インスタンス生成時に引数名を指定することができるようです。メソッドの引数名が自動的にAPIの一部になってしまう設計よりは、このように、名前付き引数を指定できる形式にする方が事故を起こす可能性が減ってよさそうです。代数的データ型Skipのドキュメントでは、ツリーを作るのに冗長な構文を避けるためにあるように書かれていますが、後の例を見ると、これは代数的データ型をクラスでエンコードする方式を取りつつ、冗長な記述を避けるための構文のように見えます。Parent<T>と等価であると説明されているわけですが、これはまさしく代数的データ型のためのシンタックスシュガーに他ならないように見えます(後で出てくるパターンマッチの話を合わせて考えると)。ジェネリクスScala/Kotlinのジェネリクスとだいたい同じです。MyReference<T>(T)Kotlinのそれとちょっと違う点として、型パラメータの宣言位置が関数名の後に来ている点で、これは、型パラメータの適用との構文的整合性を考えると改良といっていいと思います。同じで、特筆すべきところは特にありません。...トレイト最近、トレイトと称する機能を持った言語がいくつもあって混乱するのですが、Skipのトレイトは、実装すべきメソッドのシグニチャを規定するものであっても、それ自体は型になりえないようです。あったとき、Showableという型は存在していないと述べられています。これがあることによってどのような問題が解決されるかについては、ドキュメントのトレイトのページでは明確に述べられていないため、とりあえずおいておきます(たぶん、バイナリメソッドを定義するときに役立つのではないかと想像しますが)。静的メソッドここまで、割とScala/Kotlinに近い方向だったのですが、シングルトンオブジェクトに関数的なメソッドを入れるという方向は選ばなかったようで、JavaやC#の静的メソッドと同様のものが普通に使えるようです。拡張クラス最近のオブジェクト指向言語では割とよく見かけるようになった機能の一つですが、既存のクラスに対してメソッドを追加したように見せかけることができます。classに続いて、拡張対象のクラス名を指定するだけでなく、拡張に使うトレイトを指定している点です。必須なのか気になったのでPlaygroundで試してみたところ、別に書かなくてもコンパイルは通ったので、拡張メソッドとしてこのトレイトにあるメソッド群を実装してほしい、というときに使うのでしょうか(要調査)。遅延メソッド親クラスでは実際の型がわからないが、親クラスではとりあえず実装を書いておいて、子クラスで型を与える、といったときに使うようです。実際の型が決まるようです。memberらしき機能の使い方といい、Scalaの影響が濃く感じられるところです。値クラスこれはScala等にもある機能なのですが、なるべくヒープ割り当てを行わないようにする機能のようです。2);のシンタックスシュガーであるというのはまんまScalaであり、Scalaの影響が大きいようです。可変性これまで見てきた部分は、おおむねScala/Kotlinから継承した部分であり、あまり面白みのある部分ではありませんでしたが、可変性に関するアプローチは異なっています。TとTは互換性がないようです。仮にクラスの状態を変更するメソッドがあったとしても、(immutableな)Tに対して状態をを変更するメソッドを呼び出すことはできないようです。メソッドしか呼び出すことができないようです。この辺はおそらくSkipのキモでもある部分なので、後日もうちょっとちゃんと調べてみたいところです。その他、パターンマッチnullability(あるいはOption)文字列補間マクロなど色々ありますが、あまり特筆すべきものが感じられなかったので、省略します。まとめざっとSkipの構文について眺めてみました。構文についてはScala/Kotlinのものをある程度受け継ぎつつ、可変性に関するアプローチが多少変わっている、といったところでしょうか。新鮮さの感じられない言語ではありますが、そこのところには元々さほど力を入れていないのでは、という気がしました。ちなみに、今回やたらScala/Kotlinの影響について書きましたが、実際には他の言語の影響も多々あるかと思います。構文的にはScala/Kotlinの影響がだいぶ大きいという印象です。今回、可変性に関するアプローチはほんのちょっとしか調べられていなかったので、これについて深堀りをすることで印象が変わるかもしれません。次回は、可変性に関する型システム上の扱いについて詳しく調べてみたいと思います。標榜するインターネット広告代理店。中心にアドテクetc...に取り組んでいます。upLoginユーザーは見つかりませんでした。