Re: Common Lisp solved this problem 20 years ago
Per Bothner 26 Oct 2005 07:38 UTC
Alan Watson wrote:
> Per Bothner wrote:
>
>> Common Lisp allows a compiler to *assume* / is defined to the standard
>> / operation, unless there is a visible re-definition.
>> Kawa makes more-or-less the same assumpions.
>> I think that is a reasonable default mode for a compiler.
>
>
> Unless the compiler has the ability to see into the future, this
> assumption can be rather dangerous in an interactive system.
Not very, I believe: Redefining a standard function is not a wise thing
to do, and not very common.
Moreso: redefining a standard function (or even a non-standard builtin
function) in a *different* separately-compiled compilation unit (module)
is even more foolish and rare.
(I compile most of Kawa's Scheme code with --warn-undefined-variable
which is very nice for catching errors, and which encourages proper
module imports. It doesn't preclude a typo or otehr error which
accidentally matches a predefined function, I concede.)
> Can you tell me where in the HyperSpec this behaviour is sanctioned? I
> had a quick look before posting my last message, but couldn't find it.
I can't find it either. I may have been thinking of:
3.2.2.3 Semantic Constraints
A call within a file to a named function that is defined in the same
file refers to that function, unless that function has been declared
notinline.
But I'm sure Common Lisp allows inlining standard function like (+ ...).
Otherwise how could you possibly generate good code?
> If I recall correctly, one of the advances of Dylan over Common Lisp was
> that that Dylan modules export names and *values* not whereas Common
> Lisp packages export names. This helps the compiler reason about the
> value of imported procedures. Bigloo is able to do this too, I think.
Kawa is similar, I think: A module exports a set of bindings.
require-ing the module imports the bindings into the current
(lexical) scope.
--
--Per Bothner
xxxxxx@bothner.com http://per.bothner.com/