Почему лямбда-макет ракетки ничего не возвращает? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь создать базовый язык записи журнала в ракетке для класса по 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)
...