【问题标题】:Scheme let* as nested unary letsScheme let* 作为嵌套的一元让
【发布时间】:2011-07-04 03:33:13
【问题描述】:

作为一个练习,我尝试将表示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>)

clauses 项仅匹配第二个子句(c d)。在我看来,它应该将所有剩余的(var val) 子句作为列表((c d) (e f))。无论如何,我需要它这样做。

感谢任何建议。

让我感到困惑的是 exprs 会匹配一个表达式列表,所以我想不出任何为什么 clauses 不会这样做。

【问题讨论】:

标签: scheme racket let rewriting


【解决方案1】:

您需要. ,&lt;clauses&gt;,因为您想匹配列表的其余部分,而不仅仅是单个元素。出于同样的原因,,&lt;exprs&gt; 部分需要为 . ,&lt;exprs&gt;。我相信还有其他专门用于匹配列表的语法,但使用 . 很简单,并且与列表的内部实现方式相匹配。

【讨论】:

  • 谢谢。这 ”。”成功了。奇怪的是 没有它也能正常工作——这让我很困惑。
  • @Schemer:这可能只是因为您正在尝试 let* 的正文中只有一个表达式。在,&lt;exprs&gt; 之前尝试不带.(let* ((a (+ 2 3)) (b (* 6 7))) (display (- b a)) (newline)),看看是否可行。
猜你喜欢
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 2023-03-15
  • 2019-02-27
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多