2011-02-25 3 views
0

보다 기본적인 함수로 특정 함수를 다시 쓰기 위해 match-lambda를 사용하고 있습니다. 여기 패턴 일치에서 재귀 호출의 강제 평가

(define let*→nested-unary-lets 
    (match-lambda 
    (`(let* (()) ,<exprs>) 
    `(let() ,<exprs>)) 
    (`(let* ((,<var> ,<val>)) ,<exprs>) 
    `(let ((,<var> ,<val>)) (let() ,<exprs>))) 
    (`(let* ((,<var> ,<val>) . ,<clauses>) ,<exprs>) 
    `(let ((,<var> ,<val>)) (let*→nested-unary-lets '(let* (,@<clauses>) ,<exprs>)))))) 

이 * → 중첩 된 단항-할 수 있도록하는 호출의 예입니다 : 여기에하자 * 통화에 대한 입력 코드를 나타내는 문자열을 받아 중첩 된 단항로 변환 문자열을 할 수 있습니다로를 반환하는 예제입니다

단지 중첩 포함 출력 문자열이 있습니다 더 이상의 평가를 (GPT)를 사용하지 않도록 * → 수 있도록 재귀 호출의 평가를 강제로 어떤 방법이 있는지
(let*→nested-unary-lets '(let* ((a 1) (b (+ a 1)) (c (+ a b))) (displayln c))) 
'(let ((a 1)) 
    (let*→nested-unary-lets 
    '(let* ((b (+ a 1)) (c (+ a b))) 
     (displayln c)))) 

하는 것이 궁금 중첩 된 단항가-수 있습니다.

감사합니다.

답변

1

이미 그래서 그냥 let*->nested-unary-lets에 재귀 호출하기 전에 쉼표 (,)를 추가, 출력 재귀 경우 답을 quasiquoting 사용하고 있으므로 즉시 평가 (<var><val> 전에 것과 같은). 쿼시 쿼츠의 ,은 변수뿐만 아니라 모든 표현식의 결과로 이어 붙일 수 있습니다. 라인 :

`(let ((,<var> ,<val>)) (let*→nested-unary-lets '(let* (,@<clauses>) ,<exprs>))) 

뿐만 아니라 다른 문제를 가지고 일할 수있는 ,@ 위해서는, 내부 let* 요구하기 전에 '` 될 수 있습니다.

`(let ((,<var> ,<val>)) ,(let*→nested-unary-lets `(let* ,<clauses> . ,<exprs>))) 

<exprs>의 일치 하나 이상을 허용 . ,<exprs>로 변경해야합니다 : 여기에 내가 제안 버전입니다.

+0

감사합니다. 그것은 (* *, nets-unary-lets'(let * (, @), )) 필요합니다. 그러나 나는 결코 당신의 제안없이 거기에 도착했을 것입니다. :-) – Schemer

+0

@Schemer : 둘 이상을 허용하기 위해'.'앞에'.'를 추가했습니다. 만약 당신이 하나만 일치한다면, quasiquoted 출력에'.'을 써서는 안됩니다. –