Goat
Учебный функциональный язык программирования с деревообходящим интерпретатором, интерактивным REPL и полноценной стандартной библиотекой — реализован на F#.
fun rec fib n =
match n with
| 0 => 0
| 1 => 1
| n => fib (n - 1) + fib (n - 2)
fun rec fibs a b =
a :: lazy (fibs b (a + b))
let fibStream = fibs 0 1
fun main _ =
io {
do! println (show (take 10 fibStream))
}
Возможности
Функциональное ядро
Функции первого класса, замыкания, лямбды, частичное применение, каррирование и хвостовая рекурсия.
Ленивые вычисления
Явная ленивость через lazy / force. Бесконечные списки, потоки и коpекурсия.
Алгебраические типы
ADT с несколькими конструкторами, вложенные данные и исчерпывающий pattern matching с гардами.
IO-монада
Блоки io { } с синтаксисом do! / let! для чистой работы с вводом-выводом.
Стандартная библиотека
Option, Result, списочные комбинаторы, строковые функции и математика — написаны на самом Goat.
REPL и CLI
Интерактивная оболочка, команды run / check и Makefile для быстрого запуска.
Быстрый старт
Склонируйте репозиторий
git clone <repo-url>
cd funcpro-coursework-goatwhistle
Соберите проект
dotnet restore Goat.slnx
dotnet build Goat.slnx
Запустите REPL или программу
dotnet run --project src/Goat.Repl
dotnet run --project src/Goat.Cli -- run examples/factorial.goat
Или используйте Makefile
make repl
make run FILE=examples/fibonacci.goat
make test
Требования
| Инструмент | Версия |
|---|---|
| .NET SDK | 10.0.x (или 8.0.x) |
| F# | 8+ |
| ОС | Windows / Linux / macOS |
Команды Makefile
| Команда | Действие |
|---|---|
make build | Компиляция |
make test | 138 xUnit тестов |
make repl | REPL |
make run FILE=… | Запуск файла |
make examples | Запуск всех примеров |
make watch | Watch-режим тестов |
make clean | Очистка артефактов |
Документация
Синтаксис языка →
Литералы, привязки, функции, сопоставление с образцом, ленивость, IO-блоки, ADT, операторы и комментарии.
Стандартная библиотека →
Полный справочник встроенных функций: IO, строки, математика, списки, Option, Result и ленивые потоки.
Примеры программ →
Разобранные примеры: факториал, Фибоначчи, быстрая сортировка, бесконечные потоки, Option-монада, ADT и работа с файлами.
Архитектура →
Устройство интерпретатора: лексер, парсер, AST, desugar, evaluator, runtime-значения и IO-система.