我经常使用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])
但我还没有找到任何方法来制作那些&#34; Case#&#34;字符串。
以下是我尝试的宏定义:
(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的宏风格。
答案 0 :(得分:5)
这是一个解决方案。
辅助函数case (1):
{
System.out.println("Please enter amount to deposit: ");
int amount = in.nextInt();
System.out.println("Amount - " + amount);
Deposit(currentAccountPos, bank);
break;
}
返回从0到小于子句数的数字列表。然后使用它为每个子句赋予其自己的编号。请注意,此解决方案从0开始计算(而不是示例中的1)。
clauses->numbers
输出:
#lang racket
(require (for-syntax syntax/parse))
(begin-for-syntax
(require racket/list) ; import range
(define (clauses->numbers stx)
(range (length (syntax->list stx)))))
(define-syntax (match/debug stx)
(syntax-parse stx
[(_match/debug id [pattern value] ...)
(with-syntax ([(n ...) (clauses->numbers #'([pattern value] ...))])
(syntax/loc stx
(match id
[pattern (begin (displayln (~a "Case: " n)) value)]
...)))]))
(match/debug 'one
['one 1]
['two 2])
(match/debug 'two
['one 1]
['two 2])