Scheme let*作为嵌套的一元let
作为练习,我试图将表示Scheme let*作为嵌套的一元let,scheme,racket,let,rewriting,Scheme,Racket,Let,Rewriting,作为练习,我试图将表示let*源代码的字符串重写为嵌套的一元let。以下是我最大的努力: (define let*→nested-unary-lets (match-lambda (`(let* (()) ,<exprs>) `(let () ,<exprs>)) (`(let* ((,<var> ,<val>)) ,<exprs>) `(let ((,<var> ,<val>)) (
let*
源代码的字符串重写为嵌套的一元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*→嵌套一元let
(匹配lambda
(`(let*(()),)
`(让(),)
(`(let*(,),)
`(let(,)(let(),))
(`(let*(,),),)
`例如:让*→嵌套的一元let'(let*(,@),))、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
我目前遇到的问题是模式:
`(let* ((,<var> ,<val>) ,<clauses>) ,<exprs>)
`(让*(,),),)
与以下字符串不匹配:
'(let* ((a b) (c d) (e f)) <expressions>)
(让*((a b)(c d)(e f)))
术语子句仅与第二个子句相匹配(cd)
。在我看来,它应该将所有剩余的(var val)
子句作为一个列表((cd)(ef))
。无论如何,我需要它这样做
任何建议都将不胜感激
让我困惑的是,expr将匹配表达式列表,因此我想不出子句不匹配的任何原因。您需要
代码>因为您希望匹配列表的其余部分,而不仅仅是单个元素。,
零件需要是代码>出于同样的原因。我相信还有其他专门用于匹配列表的语法,但是使用
非常简单,并且与列表的内部实现方式相匹配。谢谢。“.”成功了。奇怪的是,如果没有它,它可以正常工作——这让我很困惑。@Schemer:这可能只是因为您正在尝试一个let*
,在主体中有一个表达式。在,
之前尝试(让*((a(+23))(b(*6 7)))(显示(-b a))(换行符))
而不使用,
,看看这是否有效。这是对的后续问题。