我正在尝试为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>
我的lambda似乎没有在日记条目宏中返回更新的分类帐。我对Racket的了解不是很好,所以我不确定我在做什么错。有提示吗?
(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)