Я пытаюсь создать базовый язык записи журнала в ракетке для класса по DSL (в частности, красивая ракетка, обучающая версия). У меня правильный парсер и читатель, но у меня проблемы с моими макросами. Ниже мой код расширителя. Я пытаюсь, чтобы мой DSL был функциональным, а не обязательным (я знаю, что у меня может быть значение глобальной книги, которое я обновляю, но это не соответствует духу этого проекта).
Я включил код для важных функций в этот модуль. Многие из них основаны на этом уроке: https://beautifulracket.com/bf/a-functional-expander.html
Прямо сейчас, когда я запускаю свой код для этого текста:
[1920-02-19<equipment-20000><cash-10000,stock-10000>]
[2020-12-20<insurance-500><cash-500>]
Я получаю этот вывод из моих вызовов дисплея:
(#<date 1920-02-19> debits credits)()(#<date 2020-12-20> debits credits)#<void>#<void>
Похоже, моя лямбда не возвращает обновленный регистр в моем макросе записей журнала. Мои знания невелики, когда дело доходит до Ракетки, поэтому я не уверен, что я делаю здесь неправильно. Любые советы?
(define (fold-funcs apl ac-funcs)
(for/fold ([current-apl apl])
([ac-func (in-list ac-funcs)])
(ac-func current-apl)
(display current-apl)))
(define-macro (ac-line ENTRIES ...)
#'(begin
(define ledger empty)
(set! ledger (fold-funcs ledger (list ENTRIES ...)))
(display ledger)))
(provide ac-line)
(define-macro (journal-entry "[" INFO ... "]")
#'(lambda (ledger)
(define entry (list INFO ...))
(define dt (first entry))
(set! entry (rest entry))
(define d (first entry))
(set! entry (rest entry))
(define c (first entry))
(define e (list dt d c))
(display e)
(set! ledger (cons e ledger))
ledger
))
(provide journal-entry)