Mapping 模式匹配语法

Mapping 模式匹配语法,mapping,scheme,syntax-error,racket,Mapping,Scheme,Syntax Error,Racket,这是对先前帖子的编辑。我之所以转载它,是因为我认为原著没有得到更多的意见,因为我已经接受了部分答案 我编写了一个函数match rewriter,它只是匹配lambda,但如果没有找到匹配项,它将返回其参数 使用match rewriter,我希望能够编写可以传递给另一个函数的规则,即重写: #| (rewrite rule s) repeatedly calls unary function 'rule' on every "part" of s-expr s, in unspeci

这是对先前帖子的编辑。我之所以转载它,是因为我认为原著没有得到更多的意见,因为我已经接受了部分答案

我编写了一个函数match rewriter,它只是匹配lambda,但如果没有找到匹配项,它将返回其参数

使用match rewriter,我希望能够编写可以传递给另一个函数的规则,即重写:

#| (rewrite rule s) repeatedly calls unary function 'rule' on every "part" 
    of s-expr s, in unspecified order, replacing each part with result of rule, 
    until calling rule makes no more changes to any part. 
     Parts are s, elements of s, and (recursively) parts of the elements of s. (define (rewrite rule s) |#

  (let* ([with-subparts-rewritten
          (if (list? s) (map (λ (element) (rewrite rule element)) s) s)]
         [with-also-rule-self (rule with-subparts-rewritten)])
    (if (equal? with-also-rule-self with-subparts-rewritten)
        with-also-rule-self
        (rewrite rule with-also-rule-self))))
以下是正确使用的示例:

(define arithmetic 
   (match-rewriter (`(+ ,a ,b) (+ a b)) 
                (`(* ,a ,b) (* a b)) 
                ))
(rewrite arithmetic '(+ (* 2 (+ 3 4)) 5))
==>

现在我写了:

(define let→λ&call
  (match-rewriter (`(let ((,<var> ,<val>) . (,<vars> ,<vals>)) ,<expr> . ,<exprs>)
                   `((λ (,<var> . ,<vars>) ,<expr> . ,<exprs>) ,<val> . ,<vals>))))
我不得不说,这真的让我难堪。奇怪的是,这个电话:

(rewrite let→λ&call '(let((w 0) (x 1) (y 2) (z 3)) (displayln w) (displayln x) (displayln y) (displayln z)))
'(let ((w 0) (x 1) (y 2) (z 3))
   (displayln w)
   (displayln x)
   (displayln y)
   (displayln z))
只返回其参数,这意味着match rewriter没有找到此模式的匹配项

任何建议都将不胜感激

谢谢。

此模式:

((,<var> ,<val>) . (,<vars> ,<vals>))
(rewrite let→λ&call '(let((w 0) (x 1) (y 2) (z 3)) (displayln w) (displayln x) (displayln y) (displayln z)))
'(let ((w 0) (x 1) (y 2) (z 3))
   (displayln w)
   (displayln x)
   (displayln y)
   (displayln z))
((,<var> ,<val>) . (,<vars> ,<vals>))
((,<var> ,<val>) ,<vars> ,<vals>)
(list (list <var> <val>) (list <vars> <vals>) ...)