为什么球拍宏的lambda不返回任何内容?

时间:2019-03-13 18:05:47

标签: scheme lisp racket dsl

我正在尝试为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)

0 个答案:

没有答案