Some test case added by CaptainRant on Tue Dec 9 14:01:56 2014

;;; MAKEFILE.
all: loader plugins/plugin.so plugins/unit-plugin.so
run: all
	./loader

loader: loader.scm
	csc -O3 -J $< -o $@
	csc -O3 -dynamic loader.import.scm

plugins/%.so: %.scm | loader
	mkdir -p plugins/
	csc -O3 -dynamic -unit $(<:%.scm=%) $< -o $@

clean:
	rm loader loader.import.scm loader.import.so
	rm -rf plugins/
;;; MAKEFILE END.

;;; LOADER.
(module loader (register-function)
  (import chicken scheme)
  (use posix files srfi-69)

  (define functions (make-hash-table))

  (define (register-function name function)
    (hash-table-set! functions name function))

  (for-each
    (lambda (name)
      (print ">>> loading '" name "'")
      (time
        (load-library
          (string->symbol (pathname-file name))
          (string-append "plugins/" (pathname-file name) ".so"))))
    (directory "plugins/")))
;;; LOADER END.

;;; PLUGIN WITH MODULE.
(module plugin ()
  (import chicken scheme loader)

  (define (greet1 name)
    (print "Hello1 " name))
  (register-function "greet1" greet1)

  (define (greet2 name)
    (print "Hello2 " name))
  (register-function "greet2" greet2)

  (define (greet3 name)
    (print "Hello3 " name))
  (register-function "greet3" greet3)

  (define (greet4 name)
    (print "Hello4 " name))
  (register-function "greet4" greet4)

  (define (greet5 name)
    (print "Hello5 " name))
  (register-function "greet5" greet5)

  (define (greet6 name)
    (print "Hello6 " name))
  (register-function "greet6" greet6)

  (define (greet7 name)
    (print "Hello7 " name))
  (register-function "greet7" greet7)

  (define (greet8 name)
    (print "Hello8 " name))
  (register-function "greet8" greet8)

  (define (greet9 name)
    (print "Hello9 " name))
  (register-function "greet9" greet9)

  (define (greet10 name)
    (print "Hello10 " name))
  (register-function "greet10" greet10)

  (define (greet11 name)
    (print "Hello11 " name))
  (register-function "greet11" greet11)

  (define (greet12 name)
    (print "Hello12 " name))
  (register-function "greet12" greet12)

  (define (greet13 name)
    (print "Hello13 " name))
  (register-function "greet13" greet13)

  (define (greet14 name)
    (print "Hello14 " name))
  (register-function "greet14" greet14)

  (define (greet15 name)
    (print "Hello15 " name))
  (register-function "greet15" greet15)

  (define (greet16 name)
    (print "Hello16 " name))
  (register-function "greet16" greet16)

  (define (greet17 name)
    (print "Hello17 " name))
  (register-function "greet17" greet17)

  (define (greet18 name)
    (print "Hello18 " name))
  (register-function "greet18" greet18)

  (define (greet19 name)
;;; PLUGIN WITH MODULE END.

;;; PLUGIN WITHOUT MODULE.
(import loader)

(let ()
  (define (greet1 name)
    (print "Hello1 " name))
  (register-function "greet1" greet1)

  (define (greet2 name)
    (print "Hello2 " name))
  (register-function "greet2" greet2)

  (define (greet3 name)
    (print "Hello3 " name))
  (register-function "greet3" greet3)

  (define (greet4 name)
    (print "Hello4 " name))
  (register-function "greet4" greet4)

  (define (greet5 name)
    (print "Hello5 " name))
  (register-function "greet5" greet5)

  (define (greet6 name)
    (print "Hello6 " name))
  (register-function "greet6" greet6)

  (define (greet7 name)
    (print "Hello7 " name))
  (register-function "greet7" greet7)

  (define (greet8 name)
    (print "Hello8 " name))
  (register-function "greet8" greet8)

  (define (greet9 name)
    (print "Hello9 " name))
  (register-function "greet9" greet9)

  (define (greet10 name)
    (print "Hello10 " name))
  (register-function "greet10" greet10)

  (define (greet11 name)
    (print "Hello11 " name))
  (register-function "greet11" greet11)

  (define (greet12 name)
    (print "Hello12 " name))
  (register-function "greet12" greet12)

  (define (greet13 name)
    (print "Hello13 " name))
  (register-function "greet13" greet13)

  (define (greet14 name)
    (print "Hello14 " name))
  (register-function "greet14" greet14)

  (define (greet15 name)
    (print "Hello15 " name))
  (register-function "greet15" greet15)

  (define (greet16 name)
    (print "Hello16 " name))
  (register-function "greet16" greet16)

  (define (greet17 name)
    (print "Hello17 " name))
  (register-function "greet17" greet17)

  (define (greet18 name)
    (print "Hello18 " name))
  (register-function "greet18" greet18)

  (define (greet19 name)
    (print "Hello19 " name))
  (register-function "greet19" greet19)

  (define (greet20 name)
    (print "Hello20 " name))
  (register-function "greet20" greet20))
;;; PLUGIN WITHOUT MODULE END.