2011-02-25 41 views
0

我正在使用匹配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>)))))) 

下面是一個呼叫的一個例子,讓*→嵌套一元 - 讓:

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

我想知道是否有任何方法來強制遞歸調用的評估讓*→nested-unary-let讓輸出字符串只包含嵌套的讓和請求沒有進一步的評估。

謝謝。

回答

1

您已經使用quasiquoting輸出遞歸情況下,你的答案,所以遞歸調用之前只加一個逗號(,)到let*->nested-unary-lets(如<var><val>以前生產的),因此它被立即求。 quasiquotes中的,可以拼接任何表達式的結果,而不僅僅是變量。行:

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

有一些其他的問題:爲了讓,@工作,前內let*需求'`。下面是我建議的版本:這要求匹配<exprs>改爲. ,<exprs>允許多於一個

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

+0

非常感謝!事實證明它必須是:,(let *→nested-unary-let'(let *(,@),)) - 但是如果沒有你的建議,我永遠不會得到它。 :-) – Schemer 2011-02-25 23:09:01

+0

@Schemer:我在''之前加了'.','以允許多於一個;如果只匹配一個,那麼在quasiquoted輸出中也不應該有'.'。 – 2011-02-25 23:11:38