There’s a neat paper Type Systems as Macros by Chang, Knauth, and Greenman [1] that describes how to implement a typed language using an untyped host language and macro expansion. The paper is neat, but I found the code hard to follow—the paper uses a compact notation that’s convenient for print, but not so much for reproducing on one’s own. This post is my attempt to implement and explain in more
Macros, Safety, and SOA About a year ago I wrote soa-rs, a structure-of-arrays (SOA) crate for Rust that makes extensive use of procedural macros and unsafe. In this post, I want to reflect on my experience with those tools. Much that I have to say mirrors Chad Austin's recent Unsafe Rust Is Harder Than C, which perfectly articulates the unsafe experience: The result of my pain is a safe, efficie
209 MacoCaml: Staging Composable and Compilable Macros NINGNING XIE, University of Toronto, Canada LEO WHITE, Jane Street Capital, UK OLIVIER NICOLE, Tarides, France JEREMY YALLOP, University of Cambridge, UK We introduce MacoCaml, a new design and implementation of compile-time code generation for the OCaml language. MacoCaml features a novel combination of macros with phase separation and quotat
この記事は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 Advent Calendar 2023の11日目です. 最近, 趣味でScala 3のコードをだいぶ書いていて, マクロの使い心地のよさに感心しました. 理論的な背景も含めて, 産業界で多く使われているプログラミング言語の中では筆者の知る限りぶっちぎりに優れたマクロを備えています. 他の言語にも見習ってほしいですね. たぶん見習おうとすると処理系を作り直す羽目になりますが. この記事ではScala 3のマクロのすごいところを例を使って紹介します. マクロの実践的な例 準備 実践的な例: NamedArray – 名前でアクセスできる配列 NamedArrayのマクロ実装 記述が明瞭 メタレベルのプログラムの扱い クォートとスプライスがある パターンマッチもある 生成コードに型がつく 多段階計算に基づいている クォートとスプライスの本当の意味 ネストしたスプライス ネ
A macro for writing HTML html! { h1 { "Hello, world!" } p.intro { "This is an example of the " a href="https://github.com/lambda-fairy/maud" { "Maud" } " template language." } } Maud is an HTML template engine for Rust. It's implemented as a macro, html!, which compiles your markup to specialized Rust code. This unique approach makes Maud templates fast, type-safe, and easy to deploy. Tight integr
In this article, we’ll discuss challenges that language servers face when supporting macros. This is interesting, because for rust-analyzer, macros are the hardest nut to crack. While we use Rust as an example, the primary motivation here is to inform future language design. As this is a case study rather than a thorough analysis, conclusions should be taken with a grain of salt. In particular, I
Rust has an amazing dbg macro that lets you quickly set up an expression printer that will also put in the source line. It also returns the value of the expression so you can even easily inline the printing when you want to! #!rust let a = 2; let b = dbg!(a * 2) + 1; // ^-- prints: [src/main.rs:2] a * 2 = 4 assert_eq!(b, 5); Doing a bunch of Python, I want this in Python as well. I want a debug ma
This is going to be another one of those posts where I did something ridiculous and then show you how I got there, so let’s just get right to it. use objc_rust::*; use std::ffi::CStr; pub fn main() { #[link(name = "Foundation", kind = "framework")] extern {} objc! { let cls = ObjCClass::lookup("NSNumber\0").unwrap(); let value = [[cls.into() numberWithUnsignedInt:42u32] stringValue]; let result =
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く