Libraries and Modules

35.1 R7RS Libraries

Library declarations: export, import, begin, include (load source from a file), include-ci, include-library-declarations, and cond-expand (feature-based conditional code).

Running with library paths: chibi-scheme -I . main.scm, guile -L . main.scm, csi -I . (with csc for libraries), scheme --libdirs . --script main.scm (Chez, R6RS).

;; file: geometry/shapes.sld (file naming conventions vary: .sld, .scm, directory = library name)
(define-library (geometry shapes)
  (export make-circle circle? circle-area
          (rename circle-radius radius))      ; export under a different name
  (import (scheme base) (scheme inexact))
  (begin
    (define-record-type circle
      (make-circle radius)
      circle?
      (radius circle-radius))
    (define pi 3.141592653589793)             ; not exported: private
    (define (circle-area c) (* pi (square (circle-radius c))))))
;; main.scm
(import (scheme base) (scheme write)
        (geometry shapes)
        (only (srfi 1) fold iota)             ; import only these
        (prefix (srfi 69) ht:)                ; ht:make-hash-table ...
        (rename (scheme base) (car head)))    ; rename on import
(display (circle-area (make-circle 2)))
(newline)
(cond-expand
  (chibi (import (chibi string)))
  (guile (import (ice-9 string-fun)))
  (else (begin (define (string-join lst sep) ...))))
(features)                                    ; list of supported features

35.2 R6RS Libraries

(library (geometry shapes)
  (export make-circle circle-area)
  (import (rnrs))
  (define-record-type circle (fields radius))
  (define (circle-area c) (* 3.14159 (circle-radius c) (circle-radius c))))

35.3 Implementation Module Systems

;; Guile
(define-module (myapp utils)
  #:use-module (srfi srfi-1)
  #:export (double))
(define (double x) (* 2 x))
;; elsewhere: (use-modules (myapp utils))

;; CHICKEN
(module utils (double)
  (import scheme)
  (define (double x) (* 2 x)))