見出し画像

実験ノート:Claude Code on the webで、静的型付き関数型プログラミング言語をvibe coding

白状しよう、もうClaude Code on the webに与えられた、$250クレジットを11/18までに使い切れる気がしない。もう様々なものを流すことにする。


お題は静的型付き関数型言語処理系

Xで、ネクストビートの水島さんが、Codex CLIで静的型付き関数型言語を作らせるという記事

Xのポストより

Zennの投稿はこちら、

Claude Codeにこれを読んでもらって、再現できるかトライ。

いつものようにコンテンツをspecifications.mdに放り込んで、以下のinstructions.mdをつくる。TreePの処理系を作るだけだとつまらないので、木とくれば、トランスデューサーなので、これもアプリとして作ってもらうことにした。

spec/specifications.md を余で、TreePの言語処理系を設計し、これを実装してほしい。

また応用として、ある木構造を別の木構造に変換するトランスデューサーを、TreePを活用した宣言的な変換ルールから生成するような仕組みも追加してほしい。

そのために木構造を変換するルール記述言語も作ること。

instructions.md

Claude Code on the webでvibe coding開始

出だしは快調。

Lexerつくり、Parser作り、型システムをつくってから、インタプリタを作る、最後にトランスディユーサーを実装、順番としてはそうだろう。

なんか、今回は順調で、10分もしないうちに完成。。

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

ついでに、ドキュメントも作ってもらった。

このTreePおよびトランスディユーサーの説明資料をdocの下に作ってほしい。

追加のお願い

なんか、立派なものができたぞ。

GitHubトップ

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に続く、


いいなと思ったら応援しよう!