lang

あらゆるプログラミング言語の最先端を行くScala 3のマクロ

この記事はScala Advent Calendar 2023の11日目です.最近, 趣味でScala 3のコードをだいぶ書いていて, マクロの使い心地のよさに感心しました. 理論的な背景も含めて, 産業界で多く使われているプログラミング言語の中では筆者の知る限りぶっちぎりに優れた…

部分型における変性と極性 - なぜScalaの変性は+や-で指定するのか

この記事はScala Advent Calendar 2022の19日目です.Scalaではジェネリック型の変性(variance)は+や-で指定しますが, 他の言語(たとえば, C#, Kotlin)ではoutやinだったりします. この記事では変性の意味を整理して, なぜScalaでは+/-の記号を使うのか説明し…

関数の再帰的な定義に名前付けは必要か

結論から言うと, 名前を付けることなく再帰的な関数を定義することは可能. 特定のプログラミング言語でどうかというよりは抽象概念としての関数の再帰を名前なしに実現可能かどうかという話(名前なしに実現できるプログラミング言語は存在するかという話). …

コンパイル時計算でラムダ計算の構文解析器・評価器・型推論器を実現 (Scala 3編)

またか. またなのか. 何回目だ. ということで, ラムダ計算のインタプリタの実装としては4回目くらい*1, コンパイル時計算でやるものとしても3回目くらいになってしまうけど, ラムダ計算の処理系をまた書いてしまった.今回の目的は, Scala 3にはmatch typesと…

再帰的な構造のデータの同値性判定はどうしたらいいか

数日前にTwitterで, JavaScriptのオブジェクトに対する===の挙動が初心者には難しいみたいな話を見かけた. 発端や周辺の議論をちゃんと追いかけてないからとくに出典は貼らない. たぶん元々の話は「へぇ, こういう挙動なんだ, 簡単ではないね」くらいの話だ…

なぜ型ファーストで考えるのか

よく型なし vs. 型付の文脈では「型を書くのは面倒だ」「安全の方が大事だ」「でも面倒だ」「それは型推論を前提にしていないからだ」などの議論になりがちな気がしますが、これはあくまで「計算ありきの型」を考えているからで, 「型ありきの計算」だと全く…

契約による設計と名前による型づけ, およびオブジェクトの不変性

契約による設計と名前による型づけ 最近, 社内で契約による設計の話が雑談として何度か出ていて, id:hakobe932さんが社内勉強会で紹介していたり, id:shiba_yu36さんがWEB+DB PRESSでSmart::Argsで制約をチェックする記事を書いていたり, 活発な議論になって…

Scalaで型レベルのラムダ計算

新しい言語をさわったらとりあえずラムダ計算のインタプリタを実装するよね! Scalaでふつうにラムダ計算のインタプリタを実装するのはあまりに簡単*1なので, 型レベルでやってみた.まじめな話をしておくと, C++のテンプレートがチューリング完全なのは有名な…

【はてなスタッフ非公式ブログバトン】 Haxeの善し悪し

id:hatz48さんからバトンがまわってきました.前々から個人的に興味があったので, 社内で言語の話題が出る度に「Haxe, Haxe」と言っていたら, 「Haxeと言えばtaraoさん」みたいになってて, なぜかHaxeについて書く羽目になってしまった. Haxeなんて1ミリも書…

Maybeに限らずJavaで直和型を実現できるか

JavaでMaybeを説明した以下の記事について, id:tozimaさんと某所*1でやりとりしていたら, 有益な話が出てきたのではないか, ということになったので, 紹介. *1:非公開なところ.

C++のテンプレートでラムダ計算と型推論

C++のテンプレートを, コンパイル時に走るプログラムを記述するための言語だと思うと, この言語はチューリング完全なので, 当然ラムダ計算のインタプリタを実装できるし, そのラムダ計算の項の型を推論することもできる. できるからと言って馬鹿みたいにやっ…

Rubyで関数型プログラミング

Rubyでの快適関数型プログラミングライフを追求するあまり, 使えるのか使えないのかよくわからないものを作ってしまったという話. Rubyに不慣れな人や関数型プログラミングに不慣れな人に対して酷なのはまだわかるとしても, C++(というかboostでの関数型プロ…

最小限のJavaで素数を列挙(Javaで無限リスト)

以前書いた「ラムダ計算基礎文法最速マスター」では, ラムダ計算に自然数やデータ構造, 条件分岐, ループが用意されていないため, これらをラムダ項を使って模倣する方法を紹介しました. このようなことはどんなプログラミング言語でも起きうることで, たと…

JavaScriptで読む「ラムダ計算基礎文法最速マスター」

以前書いた「ラムダ計算基礎文法最速マスター」(以下「最速マスター」)は, 予想以上に多くの人に興味を持ってもらえたようですが, 同時に難しくてわからなかったという人も多かったようです. 反響から察するに, 構文を見慣れていない(と錯覚してしまう)こと…

ラムダ計算基礎文法最速マスター

ラムダ計算は, 多くのプログラミング言語, とくに関数型言語の原形になっています. ラムダ計算について理解しておくことは, 多くのプログラミング言語の習得に役立つでしょう.ラムダ計算はチューリング完全で, 計算能力としてはふつうのプログラミング言語と…