2011-03-14 119 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