Writing a library

Sagittarius provides 2 styles to write a library, one is R6RS style and other one is R7RS style. Both styles are processed the same and users can use it without losing code portability.

Following example is written in R6RS style, for the detail of librarysyntax please see the R6RS document described in bellow sections.

(library (foo)
  (export bar)
  (import (rnrs))

 (define bar 'bar) )

The library named (foo) must be saved the file named foo.scm, foo.ss, foo.sls or foo.sld (I use .scm for all examples) and located on the loading path, the value is returned by calling add-load-path with 0 length string.

If you want to write portable code yet want to use Sagittarius specific functionality, then you can write implementation specific code separately using .sagittarius.scm, .sagittarius.ss, .sagittarius.sls or .sagittarius.sld extensions. This functionality is implemented almost all R6RS implementation. If you use R7RS style library syntax, then you can also use cond-expand to separate implementation specific functionalities.

If you don't want to share a library but only used in specific one, you can write both in one file and name the file you want to show. For example;

(library (not showing)
  ;; exports all internal use procedures
  (export ...)
  (import (rnrs))
;; write procedures
...
)

(library (shared)
  (export shared-procedure ...)
  (import (rnrs) (not showing))
;; write shared procedures here
)

Above script must be saved the file named shared.scm. The order of libraries are important. Top most dependency must be the first and next is second most, so on.

Note: This style can hide some private procedures however if you want to write portable code, some implementations do not allow you to write this style.