scalc — 突然完全な電卓(関数型ミニ言語)
概要
scalcは「Suddenly Complete cALCulator」の名の通り、電卓的な操作から出発してラムダ式を導入することでプログラム可能になった小型の関数型言語実装です。C言語で書かれており、対話的に式を評価できます。ラムダ(\ ‘x …)や関数適用(~ 演算子)をサポートし、ラムダカルキュラスの表現をそのまま記述できることが特徴。開発者は「オメガコンビネータ」のような自己適用の式も試せると記しており、あえて未防備な再帰や無限ループでスタックオーバーフローを引き起こす可能性がある点も明示しています(約300字)。
リポジトリの統計情報
- スター数: 3
- フォーク数: 0
- ウォッチャー数: 3
- コミット数: 28
- ファイル数: 25
- メインの言語: C
主な特徴
- ラムダ式(匿名関数)を扱える簡易関数型言語インタプリタ。
- Cで実装されたシンプルな実行系。小規模でソースを追いやすい。
- ラムダカルキュラス表現のサポートによりチューリング完全性を主張。
- 対話的な電卓としても利用可能。学習・実験用途に最適。
技術的なポイント
scalcはCで書かれた小さなインタプリタ/電卓で、設計の核は「式のパース → AST(抽象構文木)生成 → 評価(イバリュエーション)」という典型的な流れにあります。READMEの例記法から、ラムダ式を ”\ ‘x ( … )” のように表記し、関数適用に ”~” を用いる独自構文を採用していることが分かります。これによりラムダカルキュラスの基本構成要素(関数抽象、適用、変数束縛)を直接記述できます。
実装上のポイントとしては、Cでラムダやクロージャを表現するために、値表現(数値/関数オブジェクト)、環境(変数名と値の束縛)管理、メモリ確保と解放が必要になります。小さなプロジェクトでは単純なヒープ割当てと明示的なfree、あるいは参照カウント的な手法でクロージャを扱っている可能性が高く、READMEにある「クラッシュ(スタックオーバーフロー)」の注意書きは、再帰や自己適用をネイティブコールスタックで評価していることを示唆します。言い換えれば、末尾再帰最適化やトランポリン評価を導入していない場合、深い再帰はプロセスのスタック制限に達する恐れがあります。
さらに、式の評価戦略(正格評価/非正格評価)やスコープ(静的スコープ/動的スコープ)は言語の挙動に直結します。ラムダカルキュラス風の表現を扱うなら静的スコープとクロージャの生成が自然ですが、実装上は評価順序の違いが副作用や無限ループの発生に影響します。C実装の利点は低レベルな制御(効率やポインタ操作)ですが、その分メモリ管理やエラー処理(例外やガード)が手作業になりやすく、学習用プロジェクトとしては「言語実装のコア」を学ぶには良い教材です。
最後にビルド周りはMakefileが用意されており、シンプルにコンパイルして動かせることが想定されます。テストやドキュメントは限定的ですが、ソースを読み解くことでパーサーやインタプリタの基本設計、ラムダ処理の実際を把握できます(約700字)。
プロジェクトの構成
主要なファイルとディレクトリ:
- .clangd: file
- .gitignore: file
- LICENSE: file
- Makefile: file
- README.md: file
…他 20 ファイル
まとめ
小さくまとまったC製のラムダ対応電卓。言語実装の学習素材として有用。50字程度。
リポジトリ情報:
- 名前: scalc
- 説明: A functional programming language that started as a calculator
- スター数: 3
- 言語: C
- URL: https://github.com/baka-senpai-lts/scalc
- オーナー: baka-senpai-lts
- アバター: https://avatars.githubusercontent.com/u/70858886?v=4
READMEの抜粋:
scalc - Suddenly Complete cALCulator
I built this calculator for personal usage and added lambdas. Now it’s Turing-complete.
About project
This is a fully functioning calculator that happens to also be fully programmable. You can write a function as a lambda. If you are familiar with lambda calculus, this piece of code will represent an omega combinator application:
~ (\ 'x (~ x x)) (\ 'x (~ x x))
But be aware that this WILL crash scalc (unless I added stack overflow p…