Scheme 模式匹配
我编写了以下语法规则:Scheme 模式匹配,scheme,design-patterns,racket,matching,Scheme,Design Patterns,Racket,Matching,我编写了以下语法规则: (define-syntax match-rewriter (syntax-rules () ((_ (patt body) ...) (λ (x) (match x (patt body) ... (_ x)))))) 它本质上是match lambda,除非它在没有找到匹配项时返回其参数,而不是抛出异常 现在我想编写一个函数,let_as_lambda,它将源代码字符串作为输入,并将let语句重写为新的let_as_lambda函数。这就是
(define-syntax match-rewriter
(syntax-rules ()
((_ (patt body) ...)
(λ (x) (match x (patt body) ... (_ x))))))
它本质上是match lambda
,除非它在没有找到匹配项时返回其参数,而不是抛出异常
现在我想编写一个函数,let_as_lambda
,它将源代码字符串作为输入,并将let
语句重写为新的let_as_lambda
函数。这就是我所拥有的:
(define let_as_lambda
(match-rewriter (`(let((,<var> ,<val>)) ... ,<expressions>)
`((lambda (,<var> ...) ,<expressions>) ,<val> ...))))
返回:
'((λ ((x) ...) (+ x 2)) (3) ...)
仍然显示椭圆和括号中的“3”。我认为我的问题是我不理解模式匹配中符号`
、
和、
的正确用法
如果有人能告诉我正确的方法,我将不胜感激
谢谢。您可能会感到困惑,因为您使用了两种不同的模式匹配工具。第一个是通过
语法规则
得到的,第二个是匹配
。它们看起来很接近,但有一些重要的区别——在本例中,主要问题是与语法规则不同,您不能在匹配的准引用结果中使用..
。因此,要处理匹配值的列表,您需要使用unquote拼接
(或,@
)和其他功能,如map
等。例如,比较这两个表达式的结果:
(match '(1 2 3) [`(,x ...) `(foo ,x ...)])
(match '(1 2 3) [`(,x ...) `(foo ,@x)])
顺便说一句,如果通常的准引号
可以满足您的需求,那就太好了,但是要获得一个完整的解决方案,还需要使用简单的函数——这会使整个问题变得复杂(使用…
将需要转换为应用
)。该死!我在写我的。你太快了,伊莱。你关于在Quasikote中添加“…”的可行性的评论也会让你的评论比我的好。正如我的学生所写:>O
(match '(1 2 3) [`(,x ...) `(foo ,x ...)])
(match '(1 2 3) [`(,x ...) `(foo ,@x)])