This site is a static rendering of the Trac instance that was used by R7RS-WG1 for its work on R7RS-small (PDF), which was ratified in 2013. For more information, see Home.

Source for ticket #521

cc


    

changetime

2013-07-07 03:20:44

component

WG1 - Core

description

Mikael More writes:

  Problem:  The Library syntax requires all library content to be put within the `define-library` form (there in a `begin` or `include*`).  This means that to define a library, the programmer is reasonably required to either put all library code in a `define-library` and also indent accordingly, or maintain two files per library.

  Rationale:  An incremental development situation makes use of any convenience as to increase the speed of experimentation.  In such a situation, creating two files per library would seem completely unjustified. Also, in general Scheme development, Scheme can be made to work reliably without need for separation of a library into anything like a separate header and code file. By this reason, I will not consider the two files per library use-case further here but focus on the other point:

  I find a requirement that >99% of the Scheme code in existence needing to be made within a particular form and indented accordingly peculiar indeed.  The way Scheme code traditionally is divided into files works so well that I believe a specific `define-library` form in addition to this to contain the library, to be superfluous. And, Scheme's traditional forms provide sufficient structure to perform indentation based on.

  Suggestion:  Please find a way so that the library body in the library definition file is at the top level.

  One way would be to allow a variant of `define-library` of 5.6.1. to be used as `(define-library (library name))` and then provide the library declarations subsequent to this one, with the exception of the `begin` library declaration whose contents are inlined by themselves.

  I'd guess many times the Scheme file's filename would provide the information otherwise provided by `(define-library (library name))` , so that that line could be made optional generally also.

In response to the last point only:  Both Chibi and most R6RS Schemes use the approach of having a library-path to specify the directories which are the roots of the library system.  Without an explicit name associated with the library, changing the root would implicitly change the name.

id

521

keywords


    

milestone


    

owner

alexshinn

priority

major

reporter

cowan

resolution

wontfix

severity


    

status

closed

summary

Make library contents be at top level

time

2013-05-13 16:26:43

type

defect

Changes

Change at time 2013-07-07 03:20:44

author

cowan

field

comment

newvalue

The WG decided by unanimous consent to take no action on this ticket.

oldvalue

3

raw-time

1373142044410382

ticket

521

time

2013-07-07 03:20:44

Change at time 2013-07-07 03:20:44

author

cowan

field

resolution

newvalue

wontfix

oldvalue


    

raw-time

1373142044410382

ticket

521

time

2013-07-07 03:20:44

Change at time 2013-07-07 03:20:44

author

cowan

field

status

newvalue

closed

oldvalue

new

raw-time

1373142044410382

ticket

521

time

2013-07-07 03:20:44

Change at time 2013-05-21 01:35:47

author

cowan

field

comment

newvalue

As was pointed out on the list, it's easy to change your identer not to ident the contents of `define-library` forms.

oldvalue

2

raw-time

1369074947126607

ticket

521

time

2013-05-21 01:35:47

Change at time 2013-05-13 16:36:15

author

cowan

field

comment

newvalue

My experience (which as I said is still very limited) is that the modest discipline imposed by the two-file solution has surprising advantages.  For one thing, it provides superior delivery to the various kinds of Scheme implementations out there to have one or more files of code supplemented by a library-declaration file whose form depends on the system it is to be used for.

Thus, I can deliver a library `foo` for both Chibi and Chicken (my two platforms of choice) by providing a `foo-impl.scm` file containing pure R5RS-ish code and two files that include it: a `foo.scm` file that takes the form of a Chicken module declaration, and a `foo.sld` file that takes the form of an R7RS library declaration.  I could easily add various `foo.*.sls` files for R6RS systems if I wanted to.  Furthermore, an  implementation of Scheme that lacks modules can just load `foo-impl.scm` and ignore all the library junk.  Note that no additional indentation exists within the `foo-impl.scm` file.

In addition, while debugging I often want access to the private (non-exported) functions of the library: see my comment on #520 for why there often are such functions.  By using `load` at the REPL to load the `foo-impl.scm` file rather than some version of `import` (in Chicken, `use`), I get access to the private functions from the REPL without having to touch the export declarations.

oldvalue

1

raw-time

1368437775578733

ticket

521

time

2013-05-13 16:36:15