実験ノート:Claude Code on the webで、静的型付き関数型プログラミング言語をvibe coding
白状しよう、もうClaude Code on the webに与えられた、$250クレジットを11/18までに使い切れる気がしない。もう様々なものを流すことにする。
お題は静的型付き関数型言語処理系
Xで、ネクストビートの水島さんが、Codex CLIで静的型付き関数型言語を作らせるという記事

Zennの投稿はこちら、
Claude Codeにこれを読んでもらって、再現できるかトライ。
いつものようにコンテンツをspecifications.mdに放り込んで、以下のinstructions.mdをつくる。TreePの処理系を作るだけだとつまらないので、木とくれば、トランスデューサーなので、これもアプリとして作ってもらうことにした。
spec/specifications.md を余で、TreePの言語処理系を設計し、これを実装してほしい。
また応用として、ある木構造を別の木構造に変換するトランスデューサーを、TreePを活用した宣言的な変換ルールから生成するような仕組みも追加してほしい。
そのために木構造を変換するルール記述言語も作ること。
Claude Code on the webでvibe coding開始
出だしは快調。

Lexerつくり、Parser作り、型システムをつくってから、インタプリタを作る、最後にトランスディユーサーを実装、順番としてはそうだろう。
なんか、今回は順調で、10分もしないうちに完成。。

トランスディユーサーは、

ついでに、ドキュメントも作ってもらった。
このTreePおよびトランスディユーサーの説明資料をdocの下に作ってほしい。
なんか、立派なものができたぞ。

doc/overviewによると、

マクロ、、衛生的なマクロなんじゃ?

当然関数型プログラミングであり、糖被構文も、

設計思想について、解説してくれる。

doc/tutorial.mdにあるように、インストールして npm testを実行すると

lexer,parser,transduderのテストが全部通ったことになっている。
まずはhello world、
def main() returns: Int {
println("Hello, TreeP!")
return 0
}これを、typescriptに埋め込んで実行するらしい。
import { TreeP } from '../src/index';
// Example 1: Simple TreeP program
const source1 = `
def main() returns: Int {
println("Hello, TreeP!")
return 0
}
`;
console.log('=== Example 1: Hello World ===');
const treep1 = new TreeP(source1);
const result1 = treep1.run();
console.log('Result:', result1);
// Example 2: Function with parameters
const source2 = `
def add(x, y) {
return x + y
}
def main() returns: Int {
let result = add(10, 20)
println(result)
return 0
}
`;
console.log('\n=== Example 2: Function with Parameters ===');
const treep2 = new TreeP(source2);
const result2 = treep2.run();
console.log('Result:', result2);
// Example 3: Using built-in macros
const source3 = `
def main() returns: Int {
let x = 10
when(x > 0) {
println("x is positive")
}
debug(x)
return 0
}
`;
console.log('\n=== Example 3: Using Macros ===');
const treep3 = new TreeP(source3);
const result3 = treep3.run();
console.log('Result:', result3);しかし出力は、
=== Example 1: Hello World ===
Result: { kind: 'Unit' }
=== Example 2: Function with Parameters ===
Result: { kind: 'Unit' }
どうもうまくprintlnが動いていない。

デバグの結果、Example1は動くようになったが、なんかExample2は0が返るはずなのに変だ、そして修正

Example3のエラーは、根が深かった模様。

根が深いバグをとって、動いたらしい。

git pullして、再実行

さて、トランスディユーサーは、たとえば、defをfunctionに変化するルールは

これもいろいろ動かない、、

パターンマッチングのエラー。。。。
なんか、致命的なエラーがあるような、、

そして、サンプルも修正が必要となった。

修正後なんとか動くようになった。
感想
いやあ、言語処理系を実装するという話であったが、なんか最初は快適にコーディングが進んで、単体テストも通ったのに、いざサンプルを動かそうとするとボロボロだった。。printlnとか、あまり本質的ではないとはいえ、いや大切だ。
トランスディユーサーは、なんかそれじゃないものができた気がする。パタン―マッチでリプレースしているだけのような感じ、まあそれも最初は動かず、デバグで動くようになった。
なかなかこれは大変だ、しかし午後ぐらいでちゃんと動いたのはえらい。
残り$210クレジット。。。
成果物をここに供養する
追記:macro tree transducerを作ってもらった
気を使ったtransducerといえば、macro tree transducerだろう。
TreeP の機能を活かして、macro tree transducerのような変換器を実現して
するとほどなく、実装終了。

例題としては、ASTの最適化

論理簡約と算術最適化をパイプラインでつなぐ。
そして高度な変換例、DSLを使う。


これでおしまい!その2に続く、
