Skip to content

Реализация рекурсивных функций Def/Call и обновление документации и версии до 0.0.5#29

Merged
netkeep80 merged 3 commits intonetkeep80:mainfrom
konard:issue-18-6104c510297a
Feb 6, 2026
Merged

Conversation

@konard
Copy link
Contributor

@konard konard commented Feb 6, 2026

Summary

Fixes #18

Реализация следующей задачи в текущей фазе разработки (Фаза 2: Функциональность, Направление 2: Платформа для логического программирования) — поддержка рекурсии через именованные функции Def/Call.

Что реализовано

  1. Именованные функции Def/Call в базовом словаре (include/avm.h)

    • Новые статические сущности rel_t::Def и rel_t::Call в базовом словаре
    • Def и Call являются сущностями (->sub == E)
  2. Определение функций через Def (src/main.cpp)

    • Формат: {"Def": ["name", ["param1", "param2", ...], body_expr]}
    • Функции хранятся в глобальном окружении func_env
    • Поддержка произвольного количества параметров
  3. Вызов функций через Call (src/main.cpp)

    • Формат: {"Call": ["name", arg1, arg2, ...]}
    • Аргументы вычисляются рекурсивно через interpret()
    • Стек параметров для поддержки вложенных и рекурсивных вызовов
    • Проверка соответствия количества аргументов и параметров
  4. Поддержка рекурсии (src/main.cpp)

    • Функции могут вызывать себя через Call (прямая рекурсия)
    • Функции могут вызывать друг друга (взаимная рекурсия)
    • Защита от бесконечной рекурсии: лимит глубины MAX_RECURSION_DEPTH = 1000
    • При превышении лимита возвращается E (null)
  5. Ссылки на параметры (src/main.cpp)

    • Строковые значения в теле функции разрешаются как ссылки на параметры
    • Поиск по стеку контекстов (от последнего к первому)
    • Если параметр не найден — строка обрабатывается как данные
  6. Последовательное выполнение (src/main.cpp)

    • JSON-массив интерпретируется как последовательность выражений
    • Результат — значение последнего выражения
    • Позволяет определить функции и затем вызвать их: [{"Def": [...]}, {"Call": [...]}]
  7. 32 новых модульных теста (test/unit_test.cpp)

    • test_def_call_vocabulary() — проверка Def и Call в базовом словаре
    • test_def_call_simple() — identity функция
    • test_def_call_not_function() — функция-обёртка над Not
    • test_def_call_two_params() — функция с двумя параметрами
    • test_def_call_recursive() — рекурсивная функция с If для терминации
    • test_def_call_multiple_functions() — вызов одной функции из другой
    • test_def_call_nested_recursion() — рекурсия с вложенным If
    • test_def_call_error_cases() — обработка ошибок
    • test_def_call_recursion_depth_limit() — защита от бесконечной рекурсии
    • test_interpret_array_sequential() — последовательное выполнение
  8. 3 новых тестовых JSON файла

    • test/expr_def_call_identity.json[{"Def": ["identity", ["x"], "x"]}, {"Call": ["identity", true]}]true
    • test/expr_def_call_not.json[{"Def": ["myNot", ["x"], {"Not": ["x"]}]}, {"Call": ["myNot", true]}]false
    • test/expr_def_call_recursive.json — рекурсивная функция с If → false
  9. Обновление версии и документации

    • Версия: 0.0.4 → 0.0.5
    • README.md: обновлены Features, Current Status, Usage (обе секции EN/RU)
    • plan.md: задача «Добавить поддержку рекурсии» отмечена как выполненная, обновлён Roadmap
    • analysis.md: обновлены метрики (179 тестов, 27 JSON файлов)

Принцип работы

Рекурсивные функции реализованы через окружение функций и стек контекстов параметров:

[
  {"Def": ["myNot", ["x"], {"Not": ["x"]}]},
  {"Call": ["myNot", true]}
]
  1. Def сохраняет определение функции (имя, параметры, тело) в глобальном окружении
  2. Call находит функцию по имени, вычисляет аргументы, привязывает к параметрам
  3. Тело функции вычисляется с доступом к привязанным параметрам через стек контекстов
  4. Строки в теле разрешаются как ссылки на параметры (если совпадают по имени)

Рекурсия работает через самовызов:

[
  {"Def": ["rec", ["x", "depth"],
    {"If": ["depth", "x",
      {"Call": ["rec", {"Not": ["x"]}, true]}
    ]}
  ]},
  {"Call": ["rec", true, false]}
]
  • rec(true, false) → depth=false → else: rec(Not[true], true) = rec(false, true) → depth=true → then: false

Файлы изменены

  • include/avm.h — добавлены сущности Def и Call в базовый словарь (+7 строк)
  • src/main.cpp — добавлены Def/Call в resolve_operator(), окружение функций, стек параметров, обработка Def/Call/строк/массивов в interpret() (+127 строк)
  • test/unit_test.cpp — 32 новых теста (всего 179) (+260 строк)
  • test/expr_def_call_identity.json, test/expr_def_call_not.json, test/expr_def_call_recursive.json — тестовые выражения
  • CMakeLists.txt — версия 0.0.5
  • README.md — обновлена документация (EN + RU)
  • plan.md — задача отмечена как выполненная
  • analysis.md — обновлены метрики

Test plan

  • 179 модульных тестов проходят (179 passed, 0 failed)
  • 16 JSON roundtrip тестов проходят
  • Файлы в пределах лимита 1500 строк (main.cpp: 712, avm.h: 479, unit_test.cpp: 894)
  • Сборка успешна на Linux (локально)
  • CI на Ubuntu ✅
  • CI на Windows ✅
  • CI на macOS ✅

🤖 Generated with Claude Code

konard and others added 2 commits February 6, 2026 18:12
Adding CLAUDE.md with task information for AI processing.
This file will be removed when the task is complete.

Issue: netkeep80#18
@konard konard changed the title [WIP] Сделать следующую задачу в текущей фазе разработки и после обновить README.md и файл фазы разработки Реализация рекурсивных функций Def/Call и обновление документации и версии до 0.0.5 Feb 6, 2026
@konard konard marked this pull request as ready for review February 6, 2026 17:24
@konard
Copy link
Contributor Author

konard commented Feb 6, 2026

🤖 Solution Draft Log

This log file contains the complete execution trace of the AI solution draft process.

💰 Cost estimation:

  • Public pricing estimate: $8.115199 USD
  • Calculated by Anthropic: $5.209472 USD
  • Difference: $-2.905728 (-35.81%)
    📎 Log file uploaded as Gist (1450KB)
    🔗 View complete solution draft log

Now working session is ended, feel free to review and add any feedback on the solution draft.

@netkeep80 netkeep80 merged commit 4553802 into netkeep80:main Feb 6, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants