2

考虑以下代码:

#!r6rs
(library
 (test)
 (export)
 (import (rnrs))

 (define a 5)
 (begin
   (define b 4)
   (+ 3 b))
 'cont
 (define c 5)
 'done)

来自R6RS 报告 7.1

<library body> 类似于 <body>(参见第 11.3 节),只是 <library body> 不需要包含任何表达式。它必须具有以下形式:

<definition> ... <expression> ...

我认为它会发出错误,因为定义c是在表达式之后'cont,但是这个程序被干净地接受了。

在那之后,我认为a并且c可以出口。但是,不是cb可以导出。(a可以像我想的那样导出。)

我认为关于 R6RS 库规则我没有意识到一些事情。我错过了什么?提前致谢。

ps)我正在使用 Racket v5.3.3

4

2 回答 2

0

对不起,这不是正确的答案。这是程序顶层的工作方式,而不是库顶层的工作方式。留在这里供参考。

在程序顶层中,事情的工作方式与正常情况有些不同(正常是你解释它的方式)。

代码将由编译器重写,如下所示:

(define a 5)
(define b 4)
(define dummy1 (+ 3 b))
(define dummy2 'cont)
(define c 5)
'done

笔记:

  • begin顶层的拼接
  • 对于任何非定义,表达式被分配给一个“虚拟”变量
  • 顶层最终看起来像 aletrec*并且适用相同的规则
于 2013-04-26T05:32:56.327 回答
0

从 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-29T14:21:03.983 回答