代码之家  ›  专栏  ›  技术社区  ›  Zorf

如果有的话,方案中对letrec的定义有什么错误?

  •  5
  • Zorf  · 技术社区  · 16 年前

    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。它是这样工作的,然而,我和哲学家们有过相当多的争论,他们认为他们可以反驳狭义相对论或已建立的音位学理论,我知道当你认为你有一个简单的解决复杂问题的方法时,这可能是错误的。必须有一点,这个宏不能满足letrec的语义,否则他们可能会使用它。

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

    4 回复  |  直到 16 年前
        1
  •  5
  •   Davorak    16 年前

    在我看来,您已经将实现的责任从宏推到了编译器上,这是R5RS设计者试图避免的。

    实际上,本地定义是用R5R中的letrec实现的。 6.2.2 Internal definitions .

    我认为设计师的意图在 introduction to the R5RS :

    编程语言的设计不应将特性堆积在顶部。 功能,但通过删除 弱点和限制 其他功能似乎是必需的。 方案表明,一个非常小的 形成规则的数目 表达式,不受限制 它们是如何组成的,足以形成 实用有效的程序设计 足够灵活的语言 支持大部分主要编程 今天使用的范例。

    Eddi1: 内部定义的示例转换为LETREC的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'.
    ...
    

    在PLT方案中,R5RS模式将内部定义转换为RETREC的R5RS版本。 您也可以通过在任何具有内部定义的代码上使用drscheme的宏扩展程序来测试这一点。

        2
  •  3
  •   Michał Marczyk    16 年前

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

    包含内部定义的<body>始终可以转换为完全等效的 莱特雷克 表达式。

    从而定义 莱特雷克 就内部定义而言,只是改变了问题的方向。

    此外,我发现定义 莱特雷克 宏和有 lambda 德加内部定义为 莱特雷克 而不是把所有复杂的代码塞进 兰姆达 处理程序和生成 莱特雷克 最重要的是。这不涉及在非顶级范围内引入相互递归绑定的更漂亮的形式是什么…;-)

        3
  •  0
  •   Mark Bolusmjak    16 年前

    问得好。

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

    “评估的顺序 表达式表达式…未指明的, 所以程序不能评估 对任何变量的引用 由之前的letrec表达式绑定 所有值都已计算完毕。”

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

        4
  •  0
  •   Zorf    16 年前

    好吧,我终于找到了原因,这很简单,没用,我的定义没有什么错,事实上,这是由于一些优于R5R的错误。

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

    寻找“Letrec”,你们都不可能回答我的问题,什么是错的,显然没有什么错,R5R在一个信息部分显然有一个“勘误表”。我想我现在不得不接受我自己的答案了…

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