首页 文章

如果有的话,这个方案中letrec的定义有什么问题?

提问于
浏览
5

R5RS为库语法形式提供了建议的宏定义:

http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-10.html#%_sec_7.3

其中也以一种非常复杂的方式定义了letrec,当然不是我如何定义它,我会简单地使用:

(define-syntax letrec2
  (syntax-rules ()
    ((letrec2 ((name val) ...) body bodies ...)
     ((lambda ()
       (define name val) ...
       body bodies ...)))))

据我所知,letrec的语义,我经常使用它作为命名let . 它以这种方式运作,但是我与哲学家们进行了公平的辩论,他们认为他们可以反驳狭义相对论或已 Build 的语音学理论,我知道当你认为你有一个复杂问题的简单解决方案时,它可能是错误 . 必须要有一点,这个宏不能满足letrec的语义,否则他们可能已经使用过了 .

在这个定义中,定义是letrec主体的局部定义,它们可以相互引用相互递归,我不太确定是什么(如果有的话)是错误的 .

4 回答

  • 5

    在我看来,你已经将实现的责任从宏扩展到R5RS设计者似乎试图避免的编译器 .

    事实上,本地定义是在R5RS中使用letrec实现的 . 见6.2.2 Internal definitions .

    我认为设计师的意图总结在_2656735中:

    编程语言的设计不应该通过功能顶部的打桩功能来设计,而是通过消除使得需要其他功能的弱点和限制 . Scheme表明,用于形成表达式的极少数规则,对它们的组成方式没有限制,足以形成一种实用且高效的编程语言,该语言足够灵活,可支持当今使用的大多数主要编程范例 .

    edit1:内部定义的示例转换为let5的r5rs版本 . PLT方案4.2.5收集/ r5rs / main.ss

    (define-syntax (r5rs:body stx)
    (syntax-case stx (let)
      [(_ (let () . body))
       #'(let () . body)]
      [_
       ;; Convert internal definitions to `r5rs:letrec', as opposed
       ;; to `letrec'.
    ...
    

    在R5RS模式下的PLT方案中,确实将内部定义转换为letrec的R5RS版本 . 您还可以在具有内部定义的任何代码上使用DrScheme的宏扩展器来自行测试 .

  • 0

    R5RS指出 letrec 的语义与内部定义的语义完全相同 . 有关详细信息,请参阅the section devoted to the latter;我引用下面的关键片段:

    包含内部定义的<body>始终可以转换为完全等效的letrec表达式 .

    因此,根据内部定义来定义 letrec 只会改变问题 .

    此外,我发现定义 letrec 宏并将 lambda desugar内部定义到 letrec 比将所有复杂代码填充到 lambda 处理程序并构建 letrec 更简单 . 这没有涉及哪个是在非顶级范围内引入相互递归绑定的更漂亮的形式的问题...... ;-)

  • 0

    好问题 .

    我认为 define 序列的问题是这样的:

    “表达式expr的评估顺序是未指定的,因此在计算所有值之前,程序不得评估对letrec表达式绑定的任何变量的引用”

    这里:http://www.scheme.com/tspl4/binding.html#./binding:s20

  • 3

    好吧,我终于找到了原因,它就像无用一样简单,我的定义没有任何问题,实际上是由于某些错误优于R5RS .

    http://community.schemewiki.org/?scheme-faq-macros

    寻找'letrec',你们都无法回答我的错误问题,显然没有错,R5RS显然在信息部分有一个“错误” . 我猜我现在将被迫接受我自己的答案......

    现在问题是为什么R5RS作者没有选择这个简单的解决方案,而是选择了一个非常复杂的解决方案甚至包含错误...

相关问题