首页 > 解决方案 > 为什么球拍宏的 lambda 没有返回任何内容?

问题描述

我正在尝试为关于 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 没有在我的日记条目宏中返回更新的分类帐。我对球拍的了解并不多,所以我不确定我在这里做错了什么。有小费吗?


(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)

标签: schemelispracketdsl

解决方案


推荐阅读