Guile compiler drives out part of initialization for autoloaded modules (typically,  statements in `side-effects only' form). Please find below an example. Interpreter produces expected result;  compiler works fine when `define-public’ form is used in autoloaded module for `f’ definition.    amaya@t460s:~/tmp/guile-test$ cat main.scm f.scm (define-module (guile-test main) #:autoload (guile-test f) (f)) (define (main) (f)) (main)   (define-module (guile-test f) #:export (f)) (format (current-error-port) "*** module f initialized\n") (define (f) (format #t "hello from f\n"))   amaya@t460s:~/tmp/guile-test$ guile -L .. main.scm hello from f   amaya@t460s:~/tmp/guile-test$ cat main.scm | guile -L .. GNU Guile 3.0.8 Copyright (C) 1995-2021 Free Software Foundation, Inc. [...] *** module f initialized $1 = # hello from f $2 = #t