I meant to add that if you compile "b.scm" (as in "csc b.scm"), then the resulting executable will still search for "a.so" or "a.scm" in the same fashion, e.g.:
stat64("/usr/local/lib/chicken/1/a.so", 0xbfef8e10) = -1 ENOENT (No such file or directory)
stat64("/usr/local/lib/chicken/1/a.scm", 0xbfef8860) = -1 ENOENT (No such file or directory) stat64("/usr/local/share/chicken/a.so", 0xbfef7cb0) = -1 ENOENT (No such file or directory) stat64("/usr/local/share/chicken/a.scm", 0xbfef7700) = -1 ENOENT (No such file or directory)
stat64("./a.so", {st_mode=S_IFREG|0755, st_size=9570, ...}) = 0 stat64("./a", 0xbfef65a0) = -1 ENOENT (No such file or directory) stat64("./a.so", {st_mode=S_IFREG|0755, st_size=9570, ...}) = 0
hello from A!
So it's not just the interpreter that works that way.