57

Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

1 / 57

The Future of D

Walter Bright Andrei Alexandres u

Page 2: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Overview2 / 57

Introdu tionFeatures for Modular DevelopmentObje t Model ImprovementsSimplifying CodeGeneri ProgrammingStandard LibraryCon lusion

Page 3: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Introdu tion

Introdu tionDesign Obje tivesPrin ipled Approa hThe Rule of LeastAstonishmentFeatures for ModularDevelopmentObje t ModelImprovementsSimplifying CodeGeneri ProgrammingStandard LibraryCon lusion3 / 57

Page 4: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Design Obje tives4 / 57

n Make writing generi ode easiern Improve robustness and auditability of oden Add support for more programming paradigmsn Fa ilitate large-s ale developmentn Lay groundwork for supporting parallel programming

n All of this is work in progress and subje t to hange

Page 5: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Prin ipled Approa h5 / 57

n \No issue left behind"n Leave as few dark orners as possiblen Have good engineering rationale for those that doexist (e.g. asts, onstru tor restri tions,non-hygiene in ma ros)n Avoid the \onion in the varnish" syndromeu Entails breaking with some past mistakesn Avoid the \what the f. . . he k were we thinking???"question

Page 6: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

The Rule of Least Astonishment6 / 57

n Fun tion parameter de�nitions same as datade�nitionsn Enum lookup rules same as fun tion pointer lookuprulesn Reading polysemous values same as fun tion pointerlookup rulesn Ma ro argument pattern mat hing rules same astemplate argument pattern mat hing rulesn User-de�ned onversion rules same as built-in onversion rules

Page 7: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Features for ModularDevelopment

Introdu tionFeatures for ModularDevelopmentFun tions &TemplatesOverloadingUniform Fun tionCall SyntaxUniform Fun tionCall Syntax (2)Uniform Fun tionCall Syntax (3)Fun tion OverloadSetsFun tion OverloadSets (2)Fun tion OverloadSets (3)Fun tion OverloadSets (4)nothrowPure Fun tionsAdvantages of PureFun tionsObje t ModelImprovementsSimplifying CodeGeneri ProgrammingStandard LibraryCon lusion7 / 57

Page 8: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Fun tions & Templates Overloading8 / 57

The fun tions:void foo(int i);void foo(T)(T* t);should overload against ea h other.n Rationale: Seamless o-operation between generi and spe ialized oden Unlike C++, the fun tion is not preferred over thetemplate.n Fun tions will not be overloadable against ma ros.

Page 9: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Uniform Fun tion Call Syntax9 / 57

a.foo(args...)foo(a, args...)will now be inter hangeable.n Rationale: diÆ ulty of adding member fun tions toa library lass.n Some people onsider member alls superior to, oraestheti ally ni er than, free allsn ) 'kit hen sink' syndrome of the lass designerbloating up a lass with every member fun tion she an think of.n For a lass like a matrix lass, this an be a lot

Page 10: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Uniform Fun tion Call Syntax (2)10 / 57

n Instead, a lass designer an just implement theminimally useful set of member fun tions.n Then, other people an de�ne modules that, usingfree fun tions, add spe i� sets of fun tionality.import matrix; // ore fun tionalityimport eigens; // add eigenve tor pa kage...n To the user the eigenve tor 'member' fun tions willa t as if they were part of the original matrix lassn The add-on free fun tions an't be polymorphi anddon't enjoy spe ial a ess privileges.

Page 11: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Uniform Fun tion Call Syntax (3)11 / 57

n Another ni e bene�t: things like ints, et ., whi hnormally have no member fun tions, an be used asif they did have member fun tions, whi h helps inwriting generi ode.n S ott Meyers has eloquently elaborated on the ideaof minimizing the number of member fun tions inhis arti le \How Non-Member Fun tions ImproveEn apsulation," DDJ Feb 2000(http://www.ddj. om/ pp/184401197)

Page 12: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Fun tion Overload Sets12 / 57

n An overload set is a group of fun tions that areoverloaded against ea h other.// module Avoid foo(int);void foo(long);n Suppose there is a module B, that has foo() too,but for entirely unrelated parameters:// module B lass X { ... };void foo(X);

Page 13: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Fun tion Overload Sets (2)13 / 57

And we import A and B in a third module:// module Cimport A;import B; lass X x { ... };...foo(x);foo(3);

Page 14: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Fun tion Overload Sets (3)14 / 57

n Two distin t overload sets of foo(), one set frommodule A, and one from module Bn Currently, it is an error to all them without expli itdisambiguation (A.foo or B.foo)n Change: allow overloading a ross overload sets, aslong as (and this is riti al) there is no overlapbetween the setsn This applies to other ases where more than oneoverload set is possible, su h as with templatemixins

Page 15: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Fun tion Overload Sets (4)15 / 57

n If there's a mat h in A and any, even a worse, mat hin B, it will be an errorn A all to a fun tion an only mat h in one of theoverload setsn In other words, the overload sets must be disjoint

n Rationale: Never allow a module hija k alls tofun tions of another module when imported

Page 16: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

nothrow16 / 57

n Ex eption spe i� ations: bad idean Good ase for allowing nothrow to mean that afun tion never throws an ex eptionn This means it neither generates an ex eption, norpropagates one from a fun tion it alls (stati ally he ked)n A nothrow fun tion is useful for those making their ode ex eption safe by establishing an enfor eable ontra tn Additionally, enables ex eption frame optimizationsu Opportunity forwent by C++ be ause it doesnot stati ally he k throw() spe i� ations

Page 17: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Pure Fun tions17 / 57

n Do not read any non- onst global datan Do not write any global datan Do not modify anything rea hable through theirargumentsn May modify their arguments and own sta k variables

n Fun tion result depends only on its arguments'values

Page 18: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Advantages of Pure Fun tions18 / 57

n This means that pure fun tions:u Can undergo ommon subexpression eliminationu Can be memoizedu Can be tabulatedu Can be reordered and 's heduled' by the ompileru Can be automati ally parallelized

Page 19: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Obje t ModelImprovements

Introdu tionFeatures for ModularDevelopmentObje t ModelImprovementsStru t tor/dtor/opCopy/opAssignopImpli itCastToopImpli itCastFromPolysemous ValuesPolysemous Values(2)Polysemous Values(3)Arrays and Sli esstru t\inheritan e"stru t\inheritan e"ImmutabilitySimplifying CodeGeneri ProgrammingStandard LibraryCon lusion19 / 57

Page 20: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Stru t tor/dtor/opCopy/opAssign20 / 57

n Rationale: enable the reation of referen e ountingtemplate wrappers for obje ts.n Copying value obje ts:1. member-wise opy2. Call the opCopy method (if supplied)n The opCopy an e.g. in rement a referen e ount.n The twist to opCopy is it won't be alled if the opybeing made is a transfer (last read of the sour e)

Page 21: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

opImpli itCastTo21 / 57

stru t S {int opImpli itCastTo() { ... }float opImpli itCastTo() { ... }}allows instan es of S to be impli itly ast to ints orfloats.n Su h asts obey the same exa t rules as the built-in onversionsn Avoid di hotomy between built-in magi anduser-de�ned abra adabran Helps expression templates

Page 22: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

opImpli itCastFrom22 / 57

stru t F { ... }stru t S {S opImpli itCastFrom(F f) { ... }}n The two asts allow implementing typesindistinguishable from built-in typesn Useful for adjusting alling onvention:void Fun(int[℄ s); // by referen evoid Gun(Value!(int[℄) s); // by value

Page 23: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Polysemous Values23 / 57

n Quiz: What's the type of x?int i;uint u;auto x = i + u;n Currently, it is uint (following C's pre edent)n Choi e of type is fundamentally arbitrary

Page 24: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Polysemous Values (2)24 / 57

n Idea: have su h expressions be typed as (u)int,meaning either int or uintn It's like overloaded fun tion pointersn If a (u)int is used in a ontext where sign doesn'tmatter, it ompiles without error.n If it is used in a ontext where sign does matter,su h as omparisons, then an error is issued.

Page 25: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Polysemous Values (3)25 / 57

n Generalization to all types de�ning > 1opImpli itCastTo fun tionsn Hash lookup resultu Is it a value?u Is it a referen e?n Other sparse arraysn Fun tion results (polysemous: result type or errortype)n String literals ("ab " is really polysemous)n Sound solution to a nasty problem

Page 26: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Arrays and Sli es26 / 57

n Problem: not known whether a sli e is a \genuine"array or a window into another arrayn Separate array type from sli e typeu T[℄ is a sli eu T[new℄ is an arrayn Sli es are supertypes of arrays, so most existing ode still worksn Arrays are extensible, sli es are notn Clari�es what fun tions/interfa es expe t and o�er

Page 27: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

stru t \inheritan e"27 / 57

n stru ts don't inherit from interfa esn Or an they?n An interfa e is a list of fun tions and fun tionsignaturesn If a stru t an 'inherit' from an interfa e, itmust provide an implementation of those fun tionsn This an be handy in writing templatespe ializations|sort of like C++ on epts.

Page 28: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

stru t \inheritan e"28 / 57

interfa e Addable { void opAdd(int i); }stru t S : Addable {void opAdd(int i) { }}n However, it's not true subtyping|you an't ast Sto Addable

Page 29: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Immutability29 / 57

n Needed for modular development and parallelismn Three basi avors:u Shallow onstant a la C++: finalu \Tail" is onstant: onstu \Tail" is world-immutable: invariantn final an be ombined with onst or invariantn Hard to type he k onstru tors for invariant obje tsu Might need to re ourse to a notion of purevaluesn Area of very a tive design

Page 30: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Simplifying Code

Introdu tionFeatures for ModularDevelopmentObje t ModelImprovementsSimplifying CodeStati Fun tionParametersOrder of fun tionargument evaluationOverload OnCompile-TimeValuesEnum MemberLookup RulesString LiteralsString LiteralsString Literalsreturn StorageClassreturn StorageClassAnalyze this. . . no,better alias itswit h: The finalFrontierswit h: The finalFrontier (2)Generi ProgrammingStandard LibraryCon lusion30 / 57

Page 31: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Stati Fun tion Parameters31 / 57

n A stati fun tion parameter:void foo(stati int i, int j) { ... }is equivalent to reating a fun tion template with avalue parameter:void foo(int i)(int j) { ... }n Rationale: This is synta ti sugar to make templateseven easier for mortals to write and use

Page 32: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Order of fun tion argument evaluation32 / 57

n Fun tion arguments should be evaluated left toright, regardless of the order in whi h they arepushed on the sta k.n Payo�: improved sour e portabilityn Cost: o asional reation of temporaries; minimal

n Put an end to a long debate over an ana hroni feature

Page 33: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Overload On Compile-Time Values33 / 57

n Stati parameters are preferred when overloading:int foo(int x, int y) { ... } // (1)int foo(stati int x, int y) { ... } // (2)foo(get har(), y); // alls (1)foo(3, y); // alls (2)n This enables:u optimizations based on onstant foldingu avoiding passing the 3, as it would be like atemplate spe ialized on the 3:int foo(int x)(int y) { ... }

Page 34: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Enum Member Lookup Rules34 / 57

n Now: Compulsively require the enum's name beforethe value: File.READn Planned: Treat standalone enum names likeoverloaded fun tion names onstrained by their typeenum OpenMode { READ, WRITE, READ_WRITE } lass File {this(string name, OpenMode mode = READ) {...}}final f = new File("/bin/laden", WRITE);

Page 35: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

String Literals35 / 57

n The urrent methods for reating string literalsturns out to be too restri tiven 3 new syntaxes of string literals are proposedn Delimited Strings:q"(foo(xxx))" // "foo(xxx)"q"[foo(℄" // "foo("q"/foo℄/" // "foo℄"

Page 36: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

String Literals36 / 57

n D Code Strings:q{foo} // "foo"q{/*}*/ } // "/*?*/ "q{ foo(q{hello}); } // " foo(q{hello}); "q{ 67QQ } // error, not a valid D token

Page 37: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

String Literals37 / 57

n Heredo Strings:writefln(q"EOSThisis a multi-lineheredo stringEOS);

Page 38: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

return Storage Class38 / 57

n In C++, a fun tion that returns its argument isoften written twi e, on e for onst and on e fornon- onstn The bodies of the fun tion are identi al, just thereturn types hange.n The return storage lass enables just one fun tionto be written (and one in the obje t ode): onst( har[℄) apitalize(return onst( har[℄) s) {...}

Page 39: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

return Storage Class39 / 57

n The return type's onstness depends on the onstness of the argument to s (not the parameter)n The onst har[℄ return type is for stati type he king inside the fun tionn The astute observer would say, why not do this witha template fun tion?n You an, but template fun tions annot be virtualu Nyuk-nyuk-nyuk. . .

Page 40: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Analyze this. . . no, better alias it40 / 57

alias this allows 'importing' the �elds of a memberinto the name spa e of a stru t:stru t M { int a; }stru t S {M m;alias m this;int b;}S s;s.a; // refers to s.m.as.b; // refers to s.b

Page 41: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

swit h: The final Frontier41 / 57

n final swit h ensures at ompile time that there isa ase statement for every possible value of theswit h expressionenum E { A, B, C }E e;...final swit h (e) { ase A: ... ase B: ...} // error, no ase Cn This helps a lot when adding members to an enum

Page 42: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

swit h: The final Frontier (2)42 / 57

n It will also help with things like:final swit h (x & 3) { ase 0: ... ase 1: ... ase 3: ...} // error, no ase 2n A default label automati ally makes a finalswit h va uously orre t

Page 43: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Generi ProgrammingIntrodu tionFeatures for ModularDevelopmentObje t ModelImprovementsSimplifying CodeGeneri ProgrammingCompile-TimeRe e tionAST Ma rosAST Ma ros (2)Pattern Mat hing inMa rosMa ro OverloadingHygieneDirtDirtstati forea hStandard LibraryCon lusion

43 / 57

Page 44: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Compile-Time Re e tion44 / 57

n Will be expanded as needed.n Run-time re e tion an then be done in a librarybased on ompile-time re e tion.n Appli able to a variety of situations:u Marshaling/unmarshaling obje tsu Automated interfa e implementationu Parallel hierar hies

Page 45: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

AST Ma ros45 / 57

n AST ma ros manipulate abstra t syntax trees in ananalogous way that text ma ros manipulate text.n They look like this:ma ro foo(e) { e = 3; }

Page 46: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

AST Ma ros (2)46 / 57

n Invoking with:foo(*q);will repla e foo(*q) with:*q = 3;n Ma ro parameters an have default values:ma ro foo(e = 3) {...}

Page 47: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Pattern Mat hing in Ma ros47 / 57

Ma ro arguments an be pattern mat hed analogouslyto template type parameters:ma ro foo(e) { } // (1)ma ro foo(e : e+1) { } // (2)foo(3); // mat hes (1)foo(3+1); // mat hes (2), e aliased to 3foo(x+y+1); // mat hes (2)// e gets aliased to (x+y)foo(1+x); // mat hes (1)// (mat hing predates semanti analysis)foo(x+(3-2)); // mat hes (1)// (mat hing predates onstant folding)

Page 48: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Ma ro Overloading48 / 57

n Templates are pattern-mat hed on the shape oftheir argument typesn Ma ros are pattern-mat hed on the shape of theirargument syntax

Page 49: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Hygiene49 / 57

n Hygieni behavior:u Names after expansion are looked up in the ontext of the ma ro de�nitionu Names de�ned by the ma ro invisible outside

n Too mu h hygiene not funu Expressions pre eded by a $ are looked up in the ontext of the ma ro invo ation.

Page 50: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Dirt50 / 57

int x = 3;ma ro foo(e) {writeln(e, x, $x, $(x + x));}void test() {int x = 4;foo(7); // prints "7348"}

Page 51: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Dirt51 / 57

n \Dirt" very useful for things like interpolated strings:

ma ro say(s) { ... }auto a = 3, b = "Pi", = 3.14;say("$a musketeers omputed $b to be $ \n");n say must be able to see its aller's symbol tablen (Do not get onfused by the use of $ in the formatstring as well)

Page 52: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

stati forea h52 / 57

n Make unrolled loops easy to writestati final bran hes = 4;double temp[bran hes℄, result = 0;for (size_t i = 0; i != n; i += bran hes) {stati forea h (j ; 0 .. bran hes) {temp[j℄ = a[i + j℄ * b[i + j℄;}stati forea h (j ; 0 .. bran hes) {result += temp[j℄;}}

Page 53: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Standard Library

Introdu tionFeatures for ModularDevelopmentObje t ModelImprovementsSimplifying CodeGeneri ProgrammingStandard LibraryDTLCon lusion53 / 57

Page 54: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

DTL54 / 57

n Plans to build a basi ontainers and algorithmslibraryn Serve higher-level librariesn Modeled after STL, probably with referen esemanti su On-demand value semanti s withstd.Value!(T)n Containers & algos ompatible with built-in arraysn Implementation ontingent on implementation ofproper overloading rules

Page 55: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Con lusion

Introdu tionFeatures for ModularDevelopmentObje t ModelImprovementsSimplifying CodeGeneri ProgrammingStandard LibraryCon lusionA knowledgmentsCon lusion55 / 57

Page 56: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

A knowledgments56 / 57

The following people have ontributed ideas, text, odeexamples, perspe tive, et ., to this:Andrei Alexandres uDavid HeldBartosz MilewskiEri NieblerBrad Roberts. . . and most of all, the D ommunity!

Page 57: Alexandrescu - Amazon S3s3.amazonaws.com/dconf2007/WalterAndrei.pdf · 2007-08-26 · Design Objectives 4 / 57 n Mak e writing generic co de easier n Imp rove robustness and auditabilit

Con lusion57 / 57

The Future of D Is Bright