タグ

ブックマーク / susisu.hatenablog.com (2)

  • TypeScript で実行時の入力を含む文字列を型で弾く - Object.create(null)

    TypeScript (4.7 時点) において, 文字列に付けられる型には以下の 3 つ (とそのユニオン型) があります. 文字列型 string 文字列リテラル型 ("foo" など) テンプレートリテラル型 (`data-${string}` など) これらのうち, 実行時の入力, 特に事前にパターンが想定されていないような任意の入力が含まれるような文字列に対しては, string や string を含むテンプレートリテラル型を付けることはできても, 文字列リテラル型を付けることはできません. 文字列リテラル型を付けるためには型検査時 (実行の前) に入力文字列の内容がわかっている必要があるので, まあそれはそうですね. このことを利用して, 実行時の入力を含む文字列を与えようとすると型検査に失敗するような関数を作ることができそうです. まずは与えられた型が文字列リテラル型, ま

    TypeScript で実行時の入力を含む文字列を型で弾く - Object.create(null)
    shunkeen
    shunkeen 2022/08/13
    “与えられた型が文字列リテラル型, または文字列リテラル型のユニオン型かどうかを判定する述語が定義できます. できるんです.”>スゲ〜。#ZigLang のcomptime装飾子みたいなものを#TypeScript の型再帰関数で実現できるのか
  • プログラムの複雑さ・表面積・グラフの構造 - Object.create(null)

    特に何かしらの出典はありません. プログラムの複雑さに対する大局的で直感的な指標として, 表面積とグラフの構造というのを個人的に意識しているという話. いわゆる code smell をどう嗅ぎつけているか. 表面積 プログラムは最も単純には 1 つの入力チャンネル (引数) と 1 つの出力チャンネル (戻り値) でモデル化できます. 要するに関数ということですが, 関数型プログラミングに限らず大抵は似たような考え方ができます. graph LR yield[ ] -- 引数 --> program[プログラム] -- 戻り値 --> return[ ] 一方で現実世界で価値のあるプログラムとなるためには引数と戻り値だけでは不十分で, 実際にはその他の入出力チャンネルも必要になってきます. 例えば, 可変な変数の読み書き 環境変数の読み取り ユーザー入力の読み取り 画面への出力 ファイル

    プログラムの複雑さ・表面積・グラフの構造 - Object.create(null)
    shunkeen
    shunkeen 2022/05/06
    パスを数え上げてみるとサイクルを持つ有向グラフは無限ループするし、DAGはすぐ組み合わせ爆発する。その点、外向木はいいよな。葉の数しかパスがないんだから。暗黙の入力があると木のふりしたPolytreeとかで🫠
  • 1