<font face="Times New Roman"></font><div class="Ih2E3d">
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">Hi all,</font></p><p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><br></font></p><p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><br>
</font></p><p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">Built-in types such as float, string, or list are 
first-class citizens in Python sourcefiles, having syntactic support:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>myfloat = 1.0</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>mystring = "my string"</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>mylist = [1,2,4,8]</font></p></div>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>mydict = {1:"a", 2:"b", 3:"c"}</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>myset = {1,2,3}</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">User-defined classes are second-class citizens, requiring 
data to be manually converted from a type:</font></p><div class="Ih2E3d">
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>mydecimal = Decimal("1.00000000000000001")</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>myrope = Rope("my rope")</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>myblist = BList([1,2,4,8])</font></p></div>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>myordereddict = OrderedDict((1,"a"), (2, "b"), (3, "c"))</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>myfrozenset = frozenset([1,2,3])</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">If 
there's only one or two conversions needed in a file, then such conversion is 
not particularly burdensome, but if one wants to consistently use (say) decimals 
throughout a file then the ability to use a literal syntax makes for prettier 
source.</font></p><div class="Ih2E3d">
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">Some 
languages have open types, allowing the addition of methods to built-in 
types.<span>  </span>This is not considered 
desired behaviour for Python, since modifications made in one module can 
potentially affect code in other modules.</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p></div>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">A 
typedef is syntactic sugar to allow user-defined replacements to be treated as 
first-class citizens in code.<span>  </span>They 
affect only the module in which they appear and do not modify the original 
type.<span>  </span>To be typedeffable, something 
must be a builtin type, have a constant/syntactic representation, and be 
callable.<span>  </span>Hence, typedeffable types 
would be limited to complex, dict, float, int, ?object?, list, slice, set, 
string, and tuple. <span>  </span>No modification is made to __builtins__ 
or types, so conversion and/or reference to the original type is still 
possible.</font></p><div class="Ih2E3d">
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">The 
syntax for a typedef is:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>from MODULE typedef ADAPTOR as TYPE</font></p></div>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">OR</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>typedef BUILTINADAPTOR as TYPE</font></p><div class="Ih2E3d">
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">Syntactic constants of a given type are then wrapped with 
a call:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>ADAPTOR(SOURCELITERAL)</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">where SOURCELITERAL is the string that appears in the 
sourcecode</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">eg:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>from decimal typedef Decimal as float</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>i = 1.000000000000000000000000000001</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">translates as:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>from decimal import Decimal as float</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>i = Decimal("1.000000000000000000000000000001")</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p></div>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">Syntactic collections of a given type are always provided 
with a list of objects, eg:</font></p><div class="Ih2E3d">
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>from decimal typedef Decimal as float</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>from blist typedef BList as list</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>i = 1.000000000000000000000000000001</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>b = [1.1, 4.2]</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">translates as:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>from decimal import Decimal as float</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>from blist import BList as list</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>b = Blist([Decimal("1.1"), Decimal("4.2")])</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p></div>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">and</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>from collections typedef OrderedDict as dict</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>d = {1:"a", 2:"b", 3:"c"}</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">as:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>from collections import OrderedDict as dict</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>d = OrderedDict([(1,"a"), (2,"b"), (3,"c")])</font></p>
<p style="margin: 0cm 0cm 0pt;"><br></p><p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">A 
typedef appears at the start of a module immediately after any __future__ 
imports.<span>  </span>As no adaptors can be 
defined in a module before a typedef and typedefs are in no way a forward 
declaration, "typedef ADAPTOR as TYPE" only works for builtins, since to do 
otherwise would lead to one of two unpalatable options; either:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">a/ 
definition of adaptors would have to be allowed pre-typedef, which would allow 
them to be buried in code, making them far easier to miss; or</font></p><div class="Ih2E3d">
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">b/ 
adaptors would be defined after the typedef, which means that you'd have to 
handle: </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>typedef float as float</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>   </span>def 
float():</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>      </span>pass</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">or:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>typedef MyObject as object</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>   </span>class 
MyObject(object):</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>       
</span>pass</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">or:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>typedef myfloat as float</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>x = 1.1</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>def myfloat():</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>       
</span>pass</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p></div>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">It 
is true that if a valid typedef is made, the type can be redefined within the 
module; but the "consenting adults" rule applies -- it's possible to redefine 
str and float multiple times within a module as well, but that isn't recommended 
either (and the typedef at the top of the module at least indicates that 
non-standard behaviour is to be expected)</font></p><div class="Ih2E3d">
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">It 
is a SyntaxError to typedef the same type more than once:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>from decimal typedef Decimal as float</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>from types typedef FloatType as float<span>   </span>#SyntaxError("Type 'float' already 
redefined.")</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p></div>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">Spelling:<span>  
</span>"typedef" is prettier than "pragma", and less likely to be in use than 
"use" but its behaviour is somewhat different from C's typedef, so perhaps 
another term may be preferred.</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">Theoretical Performance Differences:<span>  </span>Since a typedef is purely syntactic 
sugar, and all tranformational work would be done at compilation, running code 
should be no slower (there should be no new opcodes necessary) and by default no 
faster that performing manual conversion (though they may assist an 
optimisation).<span>  </span>Unless optimisation 
magic is available, performance-critical code should be careful when typedeffing 
not to use typedeffed literals in inner loops.</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">I know it's considered polite to provide code, but any implementation would have to be in C, so please accept this extremely fake dummy implementation which in no way resembles the way things really work as a poor substitute:</font></p>
<div class="Ih2E3d">
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">typedefs = { FLOATTYPE: None,</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>                     
</span>INTTYPE: None,</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>                     
</span>LISTTYPE: None,</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>                     
</span>DICTTYPE: None, </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>                     
</span>... }</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">while True</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>line = lines.next()</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>type, module, adaptor = parsetypedef(line)</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>if type is None:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>        
</span>break</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>if typedefs[type] is not None:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>        
</span>raise SyntaxError("Typedef redef")</font></p></div>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>typedefs[type] = adaptor</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>if module is not None:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span><span>    </span>emit_bytecode_for_import_from(type, 
module, adaptor)</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>else:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span><span>    </span>emit_bytecode_for_assignment(type, 
adaptor)</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">parse([line] + lines)</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">...</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">def 
emit_float(...):</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>if typedefs[FLOATTYPE] is not None:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>        
</span>emit_constant(typedefs[FLOATTYPE][0], stringliteral)</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>else:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>        </span>... 
# standard behaviour</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">def 
emit_list(...):</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>if typedefs[LISTTYPE] is not None:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>        
</span>emit(LOADGLOBAL, typedefs[LISTTYPE])</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span># standard behaviour</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span>if typedefs[LISTTYPE] is not None:</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>        
</span>emit(CALL_FUNCTION)</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"><span>    
</span># standard behaviour</font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman"> </font></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman">All 
rights are assigned to the Python Software Foundation</font></p>