2011-03-14 74 views
0

我试图写一个模式匹配进行通话,让这样的:方案:模式匹配语法

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

,但我有,我不能解决两个问题。

1)intperter抱怨“。”在:

,<expr> . ,<exprs> 
在匹配部分

2)调用,让→λ&通话(与违规移除)一样。 “”:

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

==>

19 

现在我已经写了:

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

实现让为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)) 

刚刚返回它的参数,这意味着匹配重写没有找到该模式的匹配。

任何意见表示赞赏。

谢谢。

回答

0

我还没有计划宏或语法相关的功能工作过,但是从我所知道的方案,你写的:

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

是没有意义的,因为你的“配对”(这是用点创建)实际上包含4个元素。你的意思是做一个清单吗?

+0

你说得对。与“。”的问题通过将匹配改写为(λ(,。,)(,。,)) – Schemer