考虑以下代码:
#!r6rs
(library
(test)
(export)
(import (rnrs))
(define a 5)
(begin
(define b 4)
(+ 3 b))
'cont
(define c 5)
'done)来自R6RS报告7.1
A就像a(见第11.3条),但a不需要包括任何词句。它必须采用以下形式:
<definition> ... <expression> ...
我以为它会发出错误,因为c的定义是在表达式'cont之后,但是这个程序被清晰地接受了。
在此之后,我认为a和c可以导出。但是,不是c,而是b可以导出。(a可以像我想的那样导出。)
我认为关于R6RS库规则有一些我没有意识到的东西。我错过了什么?提前谢谢。
我用的是球拍v5.3.3
发布于 2013-04-29 14:21:03
来自R6RS 2007规范:
A library definition must have the following form:
(library <library name>
(export <export spec> ...)
(import <import spec> ...)
<library body>)
...
The <library body> is the library body, consisting of a sequence of definitions
followed by a sequence of expressions. The definitions may be both for local
(unexported) and exported bindings, and the expressions are initialization
expressions to be evaluated for their effects.因此,对于示例代码,应该引发错误。
发布于 2013-04-26 05:32:56
对不起,这不是正确的答案。这是程序的工作方式,而不是图书馆的图层。把它留在这里供参考。
在程序中,事物的工作方式与正常情况有一点不同(通常是你解释它的方式)。
编译器将重写代码,如下所示:
(define a 5)
(define b 4)
(define dummy1 (+ 3 b))
(define dummy2 'cont)
(define c 5)
'done备注:
begin拼接letrec*,同样的规则也适用。https://stackoverflow.com/questions/16227798
复制相似问题