never型とプロパティアクセス
TypeScriptにはneverという型があります。先日も記事にしましたが、簡単に言うとこれは「値を持たない型」です。
never型は、あらゆる型に対してその部分型として振る舞います。例えば、never
が number
の部分型であることは次のコードでわかります:
TypeScriptにはneverという型があります。先日も記事にしましたが、簡単に言うとこれは「値を持たない型」です。
never型は、あらゆる型に対してその部分型として振る舞います。例えば、never
が number
の部分型であることは次のコードでわかります:
TypeScriptをはじめとするいくつかのプログラミング言語には、never型という型がある。この型は典型的には「制御を返さない関数」の返り値として使われる:
function f(x: string): never {
console.error(x);
throw new Error();
}
never型は型システム的には「値を持たない型」「任意の型の部分型」として特徴づけられる。
他のプログラミング言語、例えば私が作っているLunarMLにもnever型があると便利だろうか?
続きを読むプログラミング言語のインタプリタの説明で「逐次機械語に翻訳する」という説明を見かけることがある。ググればそういう説明がたくさん出てくるので具体例は割愛する。
しかし、「機械語に翻訳する」という説明は好意的に言えば「誤解を招く言い方」で、率直に言うと「デタラメ」である。
そういう説明を書く人は、自分でインタプリタを書いたことがあるのだろうか?誰かが書いた間違った説明文をそのまま引き写しているのだろうか?
もちろん、世の中にはJITコンパイルする言語処理系もあるが、それはインタプリタのように使えたとしても「コンパイラ」なのではないか。
続きを読む最近はメインのテキストエディターとしてVisual Studio Codeを使っています。しかし、いまいち使いこなせている気がしません。
作業内容としては、最近はGHCのSIMDプリミティブの実装をやっていて、x86-64 WindowsマシンのWSL2で作業することが多いです。しかし、私のメインマシンはMacで、MacでFirefoxを開きつつ、リモートデスクトップでWindowsにつなぎ、その上でターミナルとVS Codeを立ち上げて作業していました。「直接Windowsで作業しろよ」とか言われそうですね。
このやり方では困ったことがあって、Mac miniのネットワークの問題なのか、時々リモートデスクトップが固まります。固まっている間はエディターへの入力もできなくなります。
リモートデスクトップ越しではなく、手元のVS Codeを使えばこの問題を回避できそうです。ネットワーク接続はファイルを開くタイミングと保存するタイミングで繋がっていればいいわけですからね。つまり、MacのVS CodeからWindows機のWSL2へSSH接続するのです。
(昔使っていたEmacsにもSSH越しに作業するモードがありました。)
というわけで、重い腰を上げてVS CodeでSSH越しに作業する方法を調べました。
続きを読む最近のプログラミング言語処理系を見ていると、バックエンドをLLVMに任せているものがちょいちょいあります。Rust, Swift, Juliaなどは一例に過ぎません。
私もプログラミング言語処理系の開発者として、LLVMを使うコンパイラーを触ったりしています。GHCのLLVMバックエンドを触ったり、SML#をAArch64に対応させたり、HaskellからLLVMを呼び出してJITコンパイルしたり、です。
LLVMは強力で便利なのですが、依存することのデメリットも感じるようになってきました。
続きを読むこの記事はHaskell Advent Calendar 2024の24日目の記事です。
私はここ数年、Haskellの主要な処理系であるGHCに趣味で貢献しています。この記事では、今年(2024年)行なった貢献を紹介します。バグ報告のみ(修正は他の人)のものも含みますが、その場合はその旨を書いています。
同様の記事を去年(2023年)も書きました:GHCへの私の貢献2023
GHC 9.12に入ったものは「GHC 9.12の新機能」でも触れています。
こういう記事を書く目的は、一つにはOSSへの貢献の対価として名誉が欲しいというものがあります。そのほかに、自分用の備忘録という目的もあります(あのバグはどのバージョンで修正されたんだっけ、ということがたまにあります)。あとは、単純にGHCの開発状況やホットな話題を皆さんに知って欲しいというのもあります(私の趣味全開なので、非常に偏った視点ではありますが)。
GHCへの貢献方法は去年の記事を読んでください。
続きを読む普通のプログラミング言語の普通の関数は、実行時に決まる値を受け取ることができます。
# 疑似コード
def foo(x: int, y: int) = print(x + y)
x = parseInt(readLine())
# x の値は実行時に決まる
foo(x + 4, 2 * x) # x + 4 や 2 * x の値も実行時に決まる
これに対して、「コンパイル時に決まる値しか受け付けない引数」を表現できると便利な場面があるのではないかと思うことが最近ありました。
続きを読むLunarMLの今年の進捗を振り返ります。この記事は言語実装 – Qiita Advent Calendar 2024の14日目の記事です。
続きを読むLunarMLをLuaの代替として使う際、Luaの機能を自然に使えると良さそうです。例えば、文字列フォーマット関数 string.format
を呼び出す際には現状では引数の型キャストが必要ですが、フォーマット文字列にいい感じの型をつければキャストが不要になるのではないでしょうか。
ML系言語の仲間であるOCamlには、フォーマット文字列が期待される文脈で特別な型付けを行う機能があります。LunarMLでも似たようなことをするといいのではないか、というわけで検討します(検討するだけならタダなので)。
続きを読む前回から日が開きましたが、引き続きMacでBinary Hacks Rebootedの内容を試していきます。
今回は「7章 数値表現とデータ処理Hack」の内容を試していきます。サンプルコードは https://github.com/oreilly-japan/binary-hacks-rebooted から取得できます。
$ git clone https://github.com/oreilly-japan/binary-hacks-rebooted.git
$ cd binary-hacks-rebooted
私の環境はApple M4 Pro / macOS Sequoia 15.1.1です。以下のアセンブリコードはAArch64向けです。
続きを読む