1

let*演習として、ソースコードを表す文字列をネストされた単項レットとして書き直そうとしています。これが私の最善の努力です:

(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* ((,<var> ,<val>) ,<clauses>) ,<exprs>)

次のような文字列と一致しません:

'(let* ((a b) (c d) (e f)) <expressions>)

という用語は、2番目の節にのみ一致し(c d)ます。(var val)残りのすべての句をリストとして受け取る必要があるように思われます((c d) (e f))。とにかくそうする必要があります。

アドバイスをいただければ幸いです。

私を困惑させるのは、exprsが式のリストと一致するため、も一致しない理由を考えることができないことです。

4

1 に答える 1

2

. ,<clauses>単一の要素だけでなく、リストの残りの部分と一致させたいので、必要になります。パーツは同じ理由である,<exprs>必要があります。. ,<exprs>リストを照合するための構文は他にもあると思いますが、使用.は簡単で、リストが内部でどのように実装されているかと一致します。

于 2011-02-25T08:26:57.437 に答える