首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R6RS库体:表达式后的定义

R6RS库体:表达式后的定义
EN

Stack Overflow用户
提问于 2013-04-26 02:28:27
回答 2查看 154关注 0票数 2

考虑以下代码:

代码语言:javascript
复制
#!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之后,但是这个程序被清晰地接受了。

在此之后,我认为ac可以导出。但是,不是c,而是b可以导出。(a可以像我想的那样导出。)

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

我用的是球拍v5.3.3

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-29 14:21:03

来自R6RS 2007规范:

代码语言:javascript
复制
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.

因此,对于示例代码,应该引发错误。

票数 0
EN

Stack Overflow用户

发布于 2013-04-26 05:32:56

对不起,这不是正确的答案。这是程序的工作方式,而不是图书馆的图层。把它留在这里供参考。

在程序中,事物的工作方式与正常情况有一点不同(通常是你解释它的方式)。

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

代码语言:javascript
复制
(define a 5)
(define b 4)
(define dummy1 (+ 3 b))
(define dummy2 'cont)
(define c 5)
'done

备注:

  • 图层中的begin拼接
  • 对于任何非定义的表达式,表达式都分配给一个“虚拟”变量。
  • 这个toplevel最终看起来像一个letrec*,同样的规则也适用。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16227798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档