2011-03-14 5 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", 그 정의 앞에 - 피할 수없는 것 같습니다.

모든 조언을 주시면 감사하겠습니다.

감사합니다.


좋아, 여기에 더 흥미로운 문제가 있습니다.

일치 작성자은 일치 항목이 없으면 인수를 반환한다는 것을 제외하고는 그냥 일치하는 lambda 인 함수를 작성했습니다.

(define arithmetic 
    (match-rewriter (`(+ ,a ,b) (+ a b)) 
       (`(* ,a ,b) (* a b)) 
       )) 
(rewrite arithmetic '(+ (* 2 (+ 3 4)) 5)) 
: 여기
#| (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)))) 

적절한 사용의 예입니다

내가하는 재 작성 다른 함수에 전달 될 수있는 규칙을 쓸 수 있기를 원하는 일치 라이터를 사용하는 것은 이것이다

==>

19 

다음 글을 작성했습니다. 구현하는

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

일치하는 내용을 기록하는 사람이이 패턴에 일치하는 항목을 찾지 못했음을 의미하는 인수를 반환합니다.

모든 조언을 주시면 감사하겠습니다.

감사합니다.

답변

0

나는,하지만 난 당신이 쓴 무엇을 계획, 알고있는 것과 이전 계획 매크로 또는 구문 관련 기능이 작동하지 않은 : 당신의 "쌍"(어떤 때문에

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

가 이해되지 않는다, 점으로 생성)에는 실제로 4 개의 요소가 포함됩니다. 목록을 만들려고하셨습니까?

+0

당신 말이 맞습니다. "." (λ (, ., ) (, ., )와 같이 일치를 다시 써서 해결했습니다. – Schemer