[rust-dev] RFC: "extern" reform

Patrick Walton pwalton at mozilla.com
Sat Aug 25 12:36:55 PDT 2012

Hi everyone,

Currently, the keyword "extern" is highly overloaded. "extern" has the 
following meanings:

1. "extern fn" in a type means "a function that closes over nothing" (at 
least at one point; if this has already changed then disregard.)

2. "extern fn" in a declaration means "a function callable as a callback 
from C to Rust". In this case the type is actually *u8, not "extern fn". 
The latter means something completely different -- namely, (1) above -- 
a fact that causes numerous problems, including the inability to write 
generic callbacks.

3. "extern mod foo { ... }" means "a module of C functions in a native 
library called foo".

4. "extern mod foo;" means "link to the Rust crate named foo".

These multiple meanings of the keyword "extern" seem highly confusing. 
To fix this, I propose the following changes:

(a) Fix #1 above by making the type of a Rust function that closes over 
nothing simply "&static/fn(...) -> ...".

(b) Fix #2 above by making the type of such callbacks "extern fn(...) -> 

(c) Fix #4 by changing the syntax to link against a crate to something 
else. I don't really have any opinions as to what the exact syntax 
should be; the proposed "link" keyword seems like a fine choice, or 
maybe something like "use lib".



More information about the Rust-dev mailing list