Nicolas Goaziou <m...@nicolasgoaziou.fr> writes:

Hello, Nicolas.

> Do you mean `defstruct'? If so, it has been in cl.el for ages. I doubt
> this is related to the incompatibility you are experiencing.

Yes, that's `defstruct'. Its ABI changed between 24.5 and 25.0, The
older one had this in the end:

    (push `(setq ,tag-symbol (list ',tag)) forms)
    (push `(cl-eval-when (compile load eval)
             (put ',name 'cl-struct-slots ',descs)
             (put ',name 'cl-struct-type ',(list type (eq named t)))
             (put ',name 'cl-struct-include ',include)
             (put ',name 'cl-struct-print ,print-auto)
             ,@(mapcar (lambda (x)
                         `(put ',(car x) 'side-effect-free ',(cdr x)))
                       side-eff))
          forms)
    `(progn ,@(nreverse (cons `',name forms)))))

And the younger one looks like this:

    `(progn
       (defvar ,tag-symbol)
       ,@(nreverse forms)
       ;; Call cl-struct-define during compilation as well, so that
       ;; a subsequent cl-defstruct in the same file can correctly include this
       ;; struct as a parent.
       (eval-and-compile
         (cl-struct-define ',name ,docstring ',include-name
                           ',type ,(eq named t) ',descs ',tag-symbol ',tag
                           ',print-auto))
       ',name)))

So, if I compile Org against the CL library from Emacs 25.0, it's not
backwards compatible with Emacs 24.5.  I could put a different compiled
version elsewhere for the older Emacs and will experiment with it.

The reason I thought that compatibility is no longer needed is because
Linux distributions usually package the bytecompiled Emacs Lisp
code. So, if someone was to get a newer version of Org, compiled with
the younger CL, that wouldn't work for them either.

Best,

Oleg

Reply via email to