タグ

ブックマーク / tarao.hatenablog.com (15)

  • Scala 3のマクロTips 100連発 - 貳佰伍拾陸夜日記

    この記事はScala Advent Calendar 2023の12日目だ! Scala 3のマクロを書く上で役に立つ, メタれたTipsたちを紹介するぜ! 勢いに任せて書いていくからサンプルコードがちゃんと動かなかったらごめんな. 一応, Scala 3.3.1を想定しているぞ. マクロ 1. メソッドをマクロとして定義する 2. マクロの体を実装する 3. マクロ実装の記法の意味を知る 4. マクロで生成されるコードの内容を確認する 5. 引数の式を評価せずに使う 6. 返り値の型をマクロの実行結果によって決める 7. マクロの返り値の型を制限する 8. マクロの返り値の型を書かない 9. マクロで計算された型をテストする 10. マクロで計算された型をScalaTestでテストする 式 11. 定数式の値を得る 12. 定数式でなければコンパイルエラーにする 13. 定数値の式を作

    Scala 3のマクロTips 100連発 - 貳佰伍拾陸夜日記
  • あらゆるプログラミング言語の最先端を行くScala 3のマクロ - 貳佰伍拾陸夜日記

    この記事はScala Advent Calendar 2023の11日目です. 最近, 趣味Scala 3のコードをだいぶ書いていて, マクロの使い心地のよさに感心しました. 理論的な背景も含めて, 産業界で多く使われているプログラミング言語の中では筆者の知る限りぶっちぎりに優れたマクロを備えています. 他の言語にも見習ってほしいですね. たぶん見習おうとすると処理系を作り直す羽目になりますが. この記事ではScala 3のマクロのすごいところを例を使って紹介します. マクロの実践的な例 準備 実践的な例: NamedArray – 名前でアクセスできる配列 NamedArrayのマクロ実装 記述が明瞭 メタレベルのプログラムの扱い クォートとスプライスがある パターンマッチもある 生成コードに型がつく 多段階計算に基づいている クォートとスプライスの当の意味 ネストしたスプライス ネ

    あらゆるプログラミング言語の最先端を行くScala 3のマクロ - 貳佰伍拾陸夜日記
  • 部分型における変性と極性 - なぜScalaの変性は+や-で指定するのか - 貳佰伍拾陸夜日記

    この記事はScala Advent Calendar 2022の19日目です. Scalaではジェネリック型の変性(variance)は+や-で指定しますが, 他の言語(たとえば, C#, Kotlin)ではoutやinだったりします. この記事では変性の意味を整理して, なぜScalaでは+/-の記号を使うのか説明します. 追記ただし, ここで説明している内容は基的にC#やKotlinでも成立する(はずな)ので「なぜこれらの言語では+/-の記号を使わないのか」を説明するものではありません. 個人的には+/-の方がわかりやすいと思うし, out/inの記法は扱っている概念が簡単であるかのような誤解を生む(悪く言えば騙す)のでどちらかと言うと嫌いです. 発端 こういう話題がありました. Scala は共変が + で、反変が - なので理論重視? なのに対して、Kotlin と TypeSc

    部分型における変性と極性 - なぜScalaの変性は+や-で指定するのか - 貳佰伍拾陸夜日記
    xef
    xef 2022/12/20
  • コンパイル時計算でラムダ計算の構文解析器・評価器・型推論器を実現 (Scala 3編) - 貳佰伍拾陸夜日記

    またか. またなのか. 何回目だ. ということで, ラムダ計算のインタプリタの実装としては4回目くらい*1, コンパイル時計算でやるものとしても3回目くらいになってしまうけど, ラムダ計算の処理系をまた書いてしまった. 今回の目的は, Scala 3にはmatch typesという機能があり, これだけでチューリング完全なのではないか, というのを検証するため. また, 文字列リテラル型を操作する型レベル関数が3.1.2-RC1にきていて, これを使えば構文解析器だって書ける. 経緯 過去の事例 関数と返り値 パターンマッチと再帰呼出し Scala 3の型レベル言語 match types リテラル型操作 ラムダ計算の実装 評価 印字 構文解析 型推論 (型検査) おわりに 経緯 もともとは, id:xuweiさんが文字列リテラル型でコンパイル時に動作する構文解析器を実装していたのが始まり

    コンパイル時計算でラムダ計算の構文解析器・評価器・型推論器を実現 (Scala 3編) - 貳佰伍拾陸夜日記
  • 再帰的な構造のデータの同値性判定はどうしたらいいか - 貳佰伍拾陸夜日記

    数日前にTwitterで, JavaScriptのオブジェクトに対する===の挙動が初心者には難しいみたいな話を見かけた. 発端や周辺の議論をちゃんと追いかけてないからとくに出典は貼らない. たぶん元々の話は「へぇ, こういう挙動なんだ, 簡単ではないね」くらいの話だったのかもしれない. 自分のタイムラインの観測範囲では「そうだそうだ, (参照の同一性ではなく)同値性にしとけばいいのに」と思っている人もそれなりにいそうに見えた. 個人的にも同値性が簡単に確認できるとよい気はするものの, 「なんでそうしないんだ, オブジェクトの中身を確認していくだけだろ!」みたいな簡単な話ではないことも知っているため, 以下のようなツイートをしたのだった. JavaScriptのオブジェクトの同値性、再帰的な構造とか作るとぜんぜん自明じゃないんだよなぁ。リンクの構造は違うけどプロパティを辿ったときのパスはど

    再帰的な構造のデータの同値性判定はどうしたらいいか - 貳佰伍拾陸夜日記
  • Docker Quizを力技で解く - 貳佰伍拾陸夜日記

    こういうのがあった: 二時間目コンテナの講義ではDocker Quizが出題。君は、すべて解くことができるか? $ docker run --rm -i hatena/intern-2020-docker-quiz #hatenaintern2020— hatenatech (@hatenatech) 2020年9月7日 自社のインターンの課題だけど, 僕は今年のインターンには全く関わっていないので, 新鮮な気持ちで問題を楽しめた. みんな話題にしているのはQ7でなかなか骨がある. 全体的にCTFっぽさがある(参加したことないのでしらんけど)中で, Q7はとくにそっち方向の面白さがある. Q7 このイメージのentrypointとして指定されているコマンドのソースコードを復元して、この問題の答えを取得せよ 「ソースコードを復元して」と言われて「うーん, それホントに復元しないとダメかな?」

    Docker Quizを力技で解く - 貳佰伍拾陸夜日記
    xef
    xef 2020/09/09
  • なぜ型ファーストで考えるのか - 貳佰伍拾陸夜日記

    How do you imagine a building? You consciously create each aspect, puzzling over it in stages. Inception 型なし言語に馴染みはあるものの型付言語をいざ使ってみたらどういう気持ちで書いたらいいのかわからなかったと同僚から相談があり, それをきっかけにして社内の勉強会で以下の話をしました. よく型なし vs. 型付の文脈では「型を書くのは面倒だ」「安全の方が大事だ」「でも面倒だ」「それは型推論を前提にしていないからだ」などの議論になりがちな気がしますが、これはあくまで「計算ありきの型」を考えているからで, 「型ありきの計算」だと全く見え方が違います. 「型はある種の仕様」とおもえば, 型ファーストであることと, 型なし言語でテスト駆動開発(TDD)するときに最初にテストを書くこととは, 同じ

    なぜ型ファーストで考えるのか - 貳佰伍拾陸夜日記
  • プログラムで解く数学パズル: 囚人とスイッチの部屋の問題 - 解答の自動チェックのしくみ - 貳佰伍拾陸夜日記

    この記事ははてなエンジニア Advent Calendar 2018の18日目の記事です. 昨日はid:WindymeltのSmart::Argsのパーサを書いたでした. 明日の担当はid:hokkai7goです. 他の担当者の記事は割と業務っぽいものが多いですが, 今回は趣味っぽいゆるゆるのネタです. 社内でとある数学パズルを紹介したところAdvent Calendarに書いてくれとリクエストがあったので, 紹介します. 単に問題を紹介するだけでは面白くないので, コードを書いて解答できるようにしてみました. 問題 あなたは100人の囚人の一人です. 全員で以下のようなゲームをして, 見事勝利できれば全員釈放, 負ければ全員死刑となります. ゲーム開始と同時に全員別々の独房に入ります 独房内や通路で他の囚人とやりとりすることはできません ランダムに1人ずつスイッチの部屋に呼ばれます 十分

    プログラムで解く数学パズル: 囚人とスイッチの部屋の問題 - 解答の自動チェックのしくみ - 貳佰伍拾陸夜日記
    xef
    xef 2018/12/18
  • bullet-scala: N+1クエリ問題を回避する - 貳佰伍拾陸夜日記

    Scala関西 Summit 2015での発表で触れていたN+1クエリ問題をなんとかするためのライブラリを公開した. 発表は以下のもので, ここでは「関係モナド」という名前で紹介していたけれど, これは口頭でも説明したように便宜上てきとーにつけた名前であって, とくにそういう名前のよく知られたモナドがあるというわけでもなければ, そもそもモナドであるかどうかはあまり質的ではない. この発表のあとに, Rails (Active Record)でのbulletのようにN+1問題の検出をScalaでやる方法はないだろうか, と言っている人がいたので, そういうものを探していて辿りつけるとよかろうということで, bullet-scalaという名前にした. もちろんN+1問題の検出のためのライブラリというわけではないし, 動的に検出するのではなく原理的に問題が発生しないようにするものなので, 思

    bullet-scala: N+1クエリ問題を回避する - 貳佰伍拾陸夜日記
  • Scalaで型レベルのラムダ計算 - 貳佰伍拾陸夜日記

    新しい言語をさわったらとりあえずラムダ計算のインタプリタを実装するよね! Scalaでふつうにラムダ計算のインタプリタを実装するのはあまりに簡単*1なので, 型レベルでやってみた. まじめな話をしておくと, C++のテンプレートがチューリング完全なのは有名な話だけど, Scalaではどうなのか気になった. 以前C++のテンプレートでラムダ計算のインタプリタを実装したのと同様のことができるか思考実験してみると, だいたいできそうに思えたのでやってみた. できたもの 例 import lambda._ case class Equals[A >: B <: B, B]() // 型レベルの同値性チェック用 type S = x ->: y ->: z ->: ( x @@ z @@ (y @@ z) ) type K = x ->: y ->: x type result = ( S @@ K

    Scalaで型レベルのラムダ計算 - 貳佰伍拾陸夜日記
    xef
    xef 2015/05/05
  • 【はてなスタッフ非公式ブログバトン】 Haxeの善し悪し - 貳佰伍拾陸夜日記

    id:hatz48さんからバトンがまわってきました. 前々から個人的に興味があったので, 社内で言語の話題が出る度に「Haxe, Haxe」と言っていたら, 「Haxeと言えばtaraoさん」みたいになってて, なぜかHaxeについて書く羽目になってしまった. Haxeなんて1ミリも書いたことないのに! この記事は http://try.haxe.org/ でちょっと遊んだ程度のにわか知識で書かれております. もともとはよさげなAltJSを紹介していくみたいな文脈のようだけど, 個人的には特殊用途以外では素のJavaScript書いてりゃいいんじゃね, と思うので, 文脈無視で単純に言語/処理系の善し悪しについて書くよ! Haxeってなに http://haxe.org/ によれば「マルチプラットフォーム オープンソース プログラミング言語」らしい. AltJSなんてケチくさいこと言ってな

    【はてなスタッフ非公式ブログバトン】 Haxeの善し悪し - 貳佰伍拾陸夜日記
    xef
    xef 2013/12/14
  • Evil: EmacsをVimのごとく使う - 付録 (カスタム変数一覧) - 貳佰伍拾陸夜日記

    Evilのカスタム変数の一覧です. 導入編 設定編 拡張編 付録 カスタム変数一覧 evil-auto-indent evil-shift-width evil-shift-round evil-cross-lines evil-move-cursor-back evil-repeat-move-cursor evil-kbd-macro-suppress-motion-error evil-track-eol evil-bigword evil-mouse-word evil-cjk-emacs-word-boundary evil-cjk-word-separating-categories evil-cjk-word-combining-categories evil-want-fine-undo evil-want-change-word-to-end evil-want-C-i-

    Evil: EmacsをVimのごとく使う - 付録 (カスタム変数一覧) - 貳佰伍拾陸夜日記
  • Evil: EmacsをVimのごとく使う - 拡張編 - 貳佰伍拾陸夜日記

    Roads? Where we're going we don't need roads. Back to the Future Evilの真髄はその拡張性です. 稿では主にチュートリアルを通して, Evilを拡張する方法を解説します. 導入編 設定編 拡張編 Evilの拡張 例1: コメントアウトオペレータ 単純な選択範囲のコメントアウト 矩形選択範囲のコメントアウト キーマップ 例2: 次のシンボルへ移動するモーション モーションの定義 テキストオブジェクト キーマップ 例3: 同じ文字の間を表すオブジェクト 単純な実装 選択範囲の拡大 キーマップ 例4: かなステート ステートの定義 かな変換コマンド キーマップ リファレンス ステート コマンド オペレータ モーション テキストオブジェクト 補助関数 おわりに 付録 Evilの拡張Evilはもともと拡張性を考慮して設計されています

    Evil: EmacsをVimのごとく使う - 拡張編 - 貳佰伍拾陸夜日記
  • Evil: EmacsをVimのごとく使う - 設定編 - 貳佰伍拾陸夜日記

    Then you will see, it is not the spoon that bends, it is only yourself. The Matrix EmacsあるいはVimに慣れ親しんでいれば, Evilを使うのにある程度は勝手がわかるものの, 逆にしっくりこない点も多いでしょう. EvilEmacsの機能との相互運用性を重視していることから, Vimユーザにとって不慣れな点が生じることは避けられず, EvilVimをエミュレートする以上, Emacsユーザにとって不慣れな点が生じることも避けられません. 稿では, どちらに慣れ親しんだユーザにとっても快適に使えるようにEvilをカスタマイズするためのヒントを紹介します. ただし, いくらカスタマイズしても完全なVimや完全なEmacsになることはありません. 使い勝手をよくして自分の好みに合わせながら, できるだけ

    Evil: EmacsをVimのごとく使う - 設定編 - 貳佰伍拾陸夜日記
  • Evil: EmacsをVimのごとく使う - 導入編 - 貳佰伍拾陸夜日記

    You underestimate the power of the dark side. Star Wars: Episode VI - Return of the Jedi EmacsはLispで自由自在に拡張でき, エディタの枠におさまらず, コンピュータ上でのあらゆる創造的活動のための環境として発達してきました. しかし, 少なくともファイルを閲覧し編集するという操作に関しては, vi/Vimが非常に優れたインタフェースであることもまた事実です. 両者はそれぞれが根強いファンを抱え, 長らく宗教戦争を繰り返してきました. この対立が止揚された結果として生まれたのがEvilです. Emacsのなんでもありな環境の上でVimをエミュレートすることで, EmacsでありながらVimの操作性を実現したのです. 稿では, Evilとは何かということに始まり, 具体的な導入方法について解説し

    Evil: EmacsをVimのごとく使う - 導入編 - 貳佰伍拾陸夜日記
  • 1