---
date: "2023-12-07T17:36:32+0900"
---
 #programming-language 

メタプログラミングの技法の一種。[[MetaOCaml]]などが有名

https://www.pls-lab.org/en/multi-stage-programming

[[Scala]]のバージョン3にも導入されてるらしい

https://logmi.jp/tech/articles/324146

日本語での詳細な解説

MetaOCaml を使った自己反映言語のコンパイル 浅井 健一  (Black )
http://www.is.ocha.ac.jp/~asai/jpapers/ppl/asai14.pdf

メタプログラミングのための時相論理に基づく型付 λ 計算 湯瀬 芳洋 [[五十嵐淳]]
http://www.fos.kuis.kyoto-u.ac.jp/~igarashi/papers/pdf/lambdaCB-PPL05.pdf

筑波大学　論理と計算（2）
http://www.cs.tsukuba.ac.jp/~kam/lecture/gairon2-2012/gairon2.pdf

λ○: nextとprevを導入

[MetaML](https://www.sciencedirect.com/science/article/pii/S0304397500000530) nextとprevに加えてrunを導入

[[MacroML]] MetaMLをバックエンドにマクロとしてのわかりやすいシンタックス(`letmac`)とかを導入？

λ□: box(cross-stage persistence)を導入

λ○□：両方を統合

[[SATySFi]]：組版言語だが、マクロのシステムとして多段階計算が導入されている。

[多段階計算の型システムの基礎 - gfnweb](https://gfngfn.github.io/ja/posts/2022-05-12-slides-type-system-matsuri-2020/)([[Suwa Takashi]])

[SATySFi の多段階計算入門](https://sankantsu.hatenablog.com/entry/2022/08/19/215024)

## 用語

**Cross-Stage Persistence**：基本的にステージ0/1でのコードはそれぞれステージ0/1の中でしか使えない。何らかの方法で両方のステージで跨いで使える仕組みを作れると便利

[multi-stage-programs-in-context.pdf](https://mpickering.github.io/papers/multi-stage-programs-in-context.pdf)

Path Based Persistence: グローバルレベルで定義されたシンボルはどのステージでも使えるようにする

Serialisation-based persistence

各プリミティブにliftという関数を用意して、値→値リテラルのコードを変換できるようにする。構造体などは各フィールドを再帰的にliftしたものになる。

問題は関数丸ごとリフトするような一般的な方法がないことである。

例えばこんなコードだったら

``let x = `(x+1) ``

``let x = `($(lift(x) + 1))` ``であってほしい。これは構文木を再帰的に辿れば一応できそう

## [[依存型]]との組み合わせ

[A Dependently Typed Multi-Stage Calculus](https://arxiv.org/abs/1908.02035)

https://link.springer.com/chapter/10.1007/978-3-030-34175-6_4

> Let’s consider an application, for example, in computer graphics, in which we have potentially many pairs of vectors of the fixed (but statically unknown) length and a function—such as vector addition—to be applied to them. 
> This function should be fast because it is applied many times and be safe because just one runtime error may ruin the whole long-running calculation. 
> Our goal is to define the function `vadd` of type $$Πn : Int.∀β.⊲β(Vector (\%_αn) → Vector (\%_αn) → Vector (\%_αn))$$
> .It takes the length n and returns (β-closed) code of a function to add two vectors of length n. The generated code is run by applying it to ε to obtain a function of type $Vector\; n → Vector\; n → Vector\; n$ as expected.

この辺はなんかやりたいことに近そうな予感がする


## [[モジュール]]システムとの組み合わせ

[A Research Talk at FLOPS 2024: An ML-Style Module System for Cross-Stage Type Abstraction in Multi-Stage Programs - gfnweb](https://gfngfn.github.io/posts/2024-05-18-slides-flops2024/)

[[Suwa Takashi]] 




## [[Rust]]でのプログラム合成

https://fitzgeraldnick.com/2018/11/15/program-synthesis-is-possible-in-rust.html

impl Return typeと組み合わせたらもっと派手なことできそう