[Openmcl-devel] COMPILE-FILE maybe-bug

Gary Byers gb at clozure.com
Wed Sep 29 22:02:59 UTC 2010

I haven't paid careful attention to this and am operating with
dangerously low caffeine levels, but my first reaction is to think
that user-level code shouldn't be persistently modifying *FEATURES* at
all.  (In other words, if the act of loading the file "FOO" causes
:FOO to appear on *FEATURES* ... well, :FOO doesn't seem to be an
aspect of the implementation, and it's not an aspect of the
environment in anything like the sense that :LINUX is.  I'll try to
think about it again with more caffeine in my system,  but my model
is that the implementation decides what's on *FEATURES* and user
code doesn't use it as a means of advertising its presence.)  (And
of course conveniently forgetting dozens of counterexamples is one
of the symptoms of caffeine deprivation.)

It's somewhat common/useful for code to do things like:

(eval-when (:compile-toplevel)
   ;; Canonicalize some features to simplify conditionalization
   #+(or imp-a imp-b ...) (pushnew :native-threads *features*))


#+native-threads ...
#-native-threads ...

within a file, but I can't think of cases where that kind of 
change to *FEATURES* is intended to be a persistent, load-time

Limiting the extent of compile-time changes (by binding *FEATURES*
in COMPILE-FILE) is intended to minimize the possibility of conflicts
when compiling different systems in the same environment; it also
supports an extenstion to COMPILE-FILE:

(compile-file ... :features '(:native-threads))

which probably looked like it'd be more useful or widely-used than
it's been in practice.  That was done in MCL > 20 years ago, and 
I'm fairly sure that the case of someone doing:

(eval-when (compile)
   (require "file-which-modifies-features"))

would have been considered and dismissed ("user code shouldn't
modify *FEATURES* at load time.")

The fact that this is the first time that I remember user code
apparently trying to modify *FEATURES* at load time doesn't
mean much of anything, but coupled with the fact that doing
so seems like a bad idea my first reaction is to not want
to encourage user-level code to do that sort of thing.

On Wed, 29 Sep 2010, Tim Bradshaw wrote:

> On 29 Sep 2010, at 13:52, Tim Bradshaw wrote:
>>  I am not sure of the thread-safety issues of this: *features* will *globally* have a new value while COMPILE-FILE is running.
> Sorry, another followup to myself.  The above is not necessary at all, and the below patch deals with that.

More information about the Openmcl-devel mailing list