方案:模式匹配语法

时间:2011-03-14 01:38:20

标签: scheme pattern-matching syntax-error racket

我正在尝试为这样的调用编写模式匹配:

(define let→λ&call
  (match-lambda (`(let ((,<var> ,<val>) . (,<vars> ,<vals>)) ,<expr> . ,<exprs>)
                   `((λ ,<var> . ,<vars> . ,<expr> . ,<exprs>) ,<val> . ,<vals>))))

但我遇到两个我无法解决的问题。

1)intperter抱怨“。”在:

,<expr> . ,<exprs>

在匹配部分

2)调用let→λ&amp; call(删除了违规的“。”):

(let→λ&call ((x 1) (y 2) (z 3)) (displayln x) (displayln y) (displayln z))

在定义之前得到关于引用标识符“x”的投诉 - 这似乎是不可避免的。

感谢任何建议。

感谢。


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

我编写了一个函数 match-rewriter ,它只是match-lambda,但如果找不到匹配则返回它的参数。

使用匹配重写器我希望能够编写可以传递给另一个函数的规则重写,这就是:

#| (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))

==&GT;

19

现在我写了:

(define let→λ&call
  (match-rewriter (`(let ((,<var> ,<val>) . (,<vars> ,<vals>)) ,<expr> . ,<exprs>)
                   `((λ (,<var> . ,<vars>) ,<expr> . ,<exprs>) ,<val> . ,<vals>))))

实现let作为lambda调用,但这就是它的行为方式:

(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))

只返回其参数,这意味着匹配重写器找不到此模式的匹配项。

感谢任何建议。

感谢。

1 个答案:

答案 0 :(得分:0)

之前我没有使用过Scheme宏或语法相关的功能,但是根据我所知的Scheme,你写了什么:

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

毫无意义,因为你的“对”(用点创建)实际上包含4个元素。你的意思是列表吗?