Skip to content

defstruct is eagerly evaluated during file compilation

When we invoke compile-file on a file which has a defstruct statement this definition is available in runtime after compilation. This shouldn't be the case.

; /tmp/foo.lisp file
(in-package cl-user)
(defstruct foo a b c)
CL-USER> (find-class 'foo nil)
NIL
CL-USER> (compile-file "/tmp/foo.lisp")
;;;
;;; Compiling /tmp/foo.lisp.
;;; OPTIMIZE levels: Safety=2, Space=0, Speed=3, Debug=3
;;;
;;; End of Pass 1.
;;; Finished compiling /tmp/foo.lisp.
;;;
#P"/tmp/foo.fas"
NIL
NIL
CL-USER> (find-class 'foo nil)
#<The STRUCTURE-CLASS COMMON-LISP-USER::FOO>
CL-USER> 

Expected: both find-class should return NIL.

CL-USER> (list (lisp-implementation-version)
               (ext:lisp-implementation-vcs-id)
               (software-type)
               (software-version)
               (machine-type)
               *features*)
("16.1.3" "21909743128417ee2cc14eef5397afa920f6a9ac" "Linux"
 "4.15.0-44-generic" "x86_64"
 (:SWANK :SERVE-EVENT :QUICKLISP :ASDF-PACKAGE-SYSTEM :ASDF3.1 :ASDF3 :ASDF2
  :ASDF :OS-UNIX :NON-BASE-CHARS-EXIST-P :ASDF-UNICODE :WALKER :CDR-1 :CDR-5
  :LINUX :FORMATTER :CDR-7 :ECL-WEAK-HASH :LITTLE-ENDIAN :ECL-READ-WRITE-LOCK
  :LONG-LONG :UINT64-T :UINT32-T :UINT16-T :LONG-FLOAT :UNICODE :DFFI
  :CLOS-STREAMS :CMU-FORMAT :UNIX :ECL-PDE :DLOPEN :CLOS :THREADS :BOEHM-GC
  :ANSI-CL :COMMON-LISP :IEEE-FLOATING-POINT :PACKAGE-LOCAL-NICKNAMES :CDR-14
  :PREFIXED-API :FFI :X86_64 :COMMON :ECL))

I haven't verified yet what happens if file is compiled with a bytecmp.