Scheme 模式匹配语法

Scheme 模式匹配语法,scheme,pattern-matching,syntax-error,racket,Scheme,Pattern Matching,Syntax Error,Racket,我正在尝试为调用编写一个模式匹配,如下所示: (define let→λ&call (match-lambda (`(let ((,<var> ,<val>) . (,<vars> ,<vals>)) ,<expr> . ,<exprs>) `((λ ,<var> . ,<vars> . ,<expr> . ,<exprs>)

我正在尝试为调用编写一个模式匹配,如下所示:

(define let→λ&call
  (match-lambda (`(let ((,<var> ,<val>) . (,<vars> ,<vals>)) ,<expr> . ,<exprs>)
                   `((λ ,<var> . ,<vars> . ,<expr> . ,<exprs>) ,<val> . ,<vals>))))
在其定义之前引用标识符x,这似乎是不可避免的

任何建议都将不胜感激

谢谢

好的,这是一个完整的,更有趣的问题

我已经编写了一个函数匹配重写器,它只是匹配lambda,除非它在没有找到匹配项的情况下返回其参数

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

#| (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没有找到此模式的匹配项

任何建议都将不胜感激


谢谢。

我以前没有使用过Scheme宏或语法相关功能,但根据我对Scheme的了解,您写了:

(λ ,<var> . ,<vars> . ,<expr> . ,<exprs>)

没有意义,因为用点创建的对实际上包含4个元素。你是想列个清单吗?

你说得对。问题在于这个问题。通过将匹配重写为λ,,,,来解决,
(define let→λ&call
  (match-rewriter (`(let ((,<var> ,<val>) . (,<vars> ,<vals>)) ,<expr> . ,<exprs>)
                   `((λ (,<var> . ,<vars>) ,<expr> . ,<exprs>) ,<val> . ,<vals>))))
(rewrite let→λ&call '(let((x 1) (y 2) (z 3)) (displayln x) (displayln y) (displayln z)))
'((λ (x y 2)
    (displayln x)
    (displayln y)
    (displayln z))
  1
  z
  3)
(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> . ,<vars> . ,<expr> . ,<exprs>)