【发布时间】:2016-11-29 07:28:27
【问题描述】:
我经常使用 Racket 的模式匹配构造 match,并且我想了一种方法来帮助自己使用 match 调试程序并了解 Racket/Scheme 宏的工作原理,即创建一个包含信息的宏比如匹配了哪个模式。
换句话说,我希望创建一个宏,鉴于此:
(match/debug 'two
['one 1]
['two 2])
输出如下:
Case 2 <-- Printed
2 <-- Returned value
到目前为止,主要障碍是试图让表示已解决案例的数字正确显示。
我的目标是尝试编写一些可以像这样扩展的东西:
(match 'two
['one (displayln "Case 1") 1]
['two (displayln "Case 2") 2])
但我还没有找到任何方法来生成那些“Case #”字符串。
这是我尝试的宏定义:
(define-syntax-rule (match/debug id [pattern value] ...)
(let ([index 0])
(match id
[(begin
(set! index (add1 index))
pattern)
(printf "Case ~a\n" index)
value] ...)))
似乎match 的语法不允许我做这样的事情,但这是我能想到的唯一方法。我只是真的习惯了 Common Lisp 的宏风格。
【问题讨论】: