Next: iklib modules examples named, Up: iklib modules examples [Index]
The following example defines an anonymous module, without expressions, and invokes its functions from the enclosing region (which is a top–level program):
(import (vicare)) (module (one two three) (define (one) 'one) (define (two) 'two) (define (three) (cons 'three (hidden))) (define (hidden) 'hidden)) (fprintf (current-error-port) "calling anonymous: ~s ~s ~s\n" (one) (two) (three))
the output of the program is:
calling anonymous: one two (three . hidden)
notice that the hidden function is visible inside the module but
not in the enclosing region.
The following example defines a module, with expressions, and invokes its functions from the enclosing region (which is a top–level program):
(import (vicare))
(module (one two three)
  (define (one)       'one)
  (define (two)       'two)
  (define (three)     (cons 'three (hidden)))
  (define (hidden)    'hidden)
  (fprintf (current-error-port)
    "defining an anonymous module\n"))
(fprintf (current-error-port)
  "calling anonymous: ~s ~s ~s\n" (one) (two) (three))
the output of the program is:
defining an anonymous module calling anonymous: one two (three . hidden)
notice how the expressions at the end of a module are evaluated before the expressions at the end of the top–level program.
When a module definition is present at the top–level of a program: trailing expressions at the end of the module definitions are handled like top–level expressions mixed between top–level definitions. We can verify this with the following program:
(import (vicare))
(define a
  (begin
    (fprintf (current-error-port) "before\n")
    (void)))
(module ()
  (fprintf (current-error-port) "module\n"))
(define b
  (begin
    (fprintf (current-error-port) "after\n")
    (void)))
whose output is:
before module after
Let’s see, instead, what happens when the module definition is at the
top–level of a library, which does not allow mixed definitions and
expressions.  The following program defines a library using the
library syntax:
(import (vicare))
(library (the-demo)
  (export a)
  (import (vicare))
  (define a
    (begin
      (fprintf (current-error-port) "before\n")
      123))
  (module ()
    (fprintf (current-error-port) "module\n"))
  (define b
    (begin
      (fprintf (current-error-port) "after\n")
      (void)))
  (fprintf (current-error-port) "library: ~a\n" a)
  #| end of library |# )
(import (the-demo))
(fprintf (current-error-port) "program: ~a\n" a)
the output is:
before module after library: 123 program: 123
here the module’s trailing expressions are evaluated after all the module’s definitions and before the following library’s definitions and expressions.
Next: iklib modules examples named, Up: iklib modules examples [Index]