SlideShare uma empresa Scribd logo
1 de 43
Baixar para ler offline
Generic Programming Galore Using D

                             Andrei Alexandrescu, PhD

                                 Research Scientist
                                     Facebook




c 2011 Andrei Alexandrescu                              1 / 33
37% off




c 2011 Andrei Alexandrescu   2 / 33
Generic Programming




c 2011 Andrei Alexandrescu                         3 / 33
What is Generic Programming?




c 2011 Andrei Alexandrescu      4 / 33
What is Generic Programming?


         • Find most general algorithm representation
             ◦ Narrowest requirements
             ◦ Widest guarantees
             ◦ Big-O() encapsulation should be a crime
             ◦ No need to regress to hand-written code




c 2011 Andrei Alexandrescu                               4 / 33
What is Generic Programming?


         • Find most general algorithm representation
             ◦ Narrowest requirements
             ◦ Widest guarantees
             ◦ Big-O() encapsulation should be a crime
             ◦ No need to regress to hand-written code
         • Define types to implement said requirements




c 2011 Andrei Alexandrescu                               4 / 33
What is Generic Programming?


         • Find most general algorithm representation
             ◦ Narrowest requirements
             ◦ Widest guarantees
             ◦ Big-O() encapsulation should be a crime
             ◦ No need to regress to hand-written code
         • Define types to implement said requirements
         • Leverage the algorithm for ultimate reuse




c 2011 Andrei Alexandrescu                               4 / 33
What is Generic Programming?


         • Find most general algorithm representation
             ◦ Narrowest requirements
             ◦ Widest guarantees
             ◦ Big-O() encapsulation should be a crime
             ◦ No need to regress to hand-written code
         • Define types to implement said requirements
         • Leverage the algorithm for ultimate reuse
         • ...
         • Profit!




c 2011 Andrei Alexandrescu                               4 / 33
What is Generic Programming?


         • Find most general algorithm representation
             ◦ Narrowest requirements
             ◦ Widest guarantees
             ◦ Big-O() encapsulation should be a crime
             ◦ No need to regress to hand-written code
         • Define types to implement said requirements
         • Leverage the algorithm for ultimate reuse
         • ...
         • Profit!

                                                         ´
         • Arguably one of the noblest endeavors of our metier


c 2011 Andrei Alexandrescu                                       4 / 33
Generic Programming


         • “Write once, instantiate anywhere”
             ◦ Specialized implementations welcome
         • Prefers static type information and static expansion
           (macro style)
         • Fosters strong mathematical underpinnings
             ◦ Minimizing assumptions common theme in math
         • Tenuous relationship with binary interfaces
         • Starts with algorithms, not interfaces or objects
         • “Premature encapsulation is the root of some
           derangement”



c 2011 Andrei Alexandrescu                                        5 / 33
Warmup: the “dream min”




         • Should work at efficiency comparable to hand-written
           code
         • Take variadic arguments: min(a, b, ...)
             ◦ Avoid nonsensical calls min() and min(a)
         • Work for all ordered types and conversions
         • Decline incompatible types, without prejudice




c 2011 Andrei Alexandrescu                                       6 / 33
First prototype




       auto min(L, R)(L lhs, R rhs) {
          return rhs < lhs ? rhs : lhs;
       }
       auto a = min(x, y);
         • This function is as efficient as any specialized,
           handwritten version (true genericity)
         • Deduction for argument types and result type




c 2011 Andrei Alexandrescu                                    7 / 33
Variadic arguments


       auto min(T...)(T x) {
         static if (x.length > 2)
           return min(min(x[0], x[1]), x[2 .. $]);
         else
           return x[0] > x[1] ? x[1] : x[0];
       }
       ...
       auto m = min(a + b, 100, c);
         • x is not an array
         • This is not classic recursion


c 2011 Andrei Alexandrescu                           8 / 33
Reject nonsensical calls



       auto min(T...)(T x) if (x.length > 1) {
         ...
       }
         • Rejects calls with 0 or 1 arguments
         • Allows other overloads to take over, e.g. min element
           over a collection
         • More work needed
             ◦ Only accept types with a valid intersection
             ◦ Only accept types comparable with ”<”



c 2011 Andrei Alexandrescu                                         9 / 33
Common type

         • Task: Given a list of types, find the common type of all
       template CommonType(T...)
       {
         static if (T.length == 1)
           alias T[0] CommonType;
         else
           static if (is(typeof(1 ? T[0].init : T[1].init) U))
              alias CommonType!(U, T[2 .. $]) CommonType;
         else
           alias void CommonType;
       }
       // Usage
       static assert(is(CommonType!(int, short, long) == long));


c 2011 Andrei Alexandrescu                                           10 / 33
Using CommonType



       auto min(T...)(T x)
       if (x.length > 1
         && is(typeof(CommonType!T.init < CommonType!T.init)
               == bool))
       {
         static if (x.length > 2)
           return min(min(x[0], x[1]), x[2 .. $]);
         else
           return x[0] > x[1] ? x[1] : x[0];
       }




c 2011 Andrei Alexandrescu                                 11 / 33
How about min over many elements?


       auto min(R)(R range)
       if (isInputRange!R &&
           is(typeof(range.front < range.front) == bool))
       {
         auto result = range.front;
         range.popFront();
         foreach (e; range) {
           if (e < result) result = e;
         }
         return result;
       }
       auto m = [ 1, 5, 2, 0, 7, 9 ].min();
         • Works over anything that can be iterated

c 2011 Andrei Alexandrescu                                  12 / 33
How about argmin now?

       auto argmin(alias fun, R)(R r)
       if (isInputRange!R &&
           is(typeof(fun(r.front) < fun(r.front)) == bool))
       {
         auto result = r.front;
         auto cache = fun(result);
         r.popFront();
         foreach (e; r) {
           auto cand = fun(e);
           if (cand > cache) continue;
           result = e;
           cache = cand;
         }
         return result;
       }

c 2011 Andrei Alexandrescu                                    13 / 33
argmin




       auto s = ["abc", "a", "xz"];
       auto m = s.argmin!((x) => x.length);
         • Works on anything iterable and any predicate
         • Predicate is passed by alias
         • No loss of efficiency




c 2011 Andrei Alexandrescu                                14 / 33
The Generative Connection




c 2011 Andrei Alexandrescu                           15 / 33
Generative programming




         • In brief: code that generates code
         • Generic programming often requires algorithm
           specialization
         • Specification often present in a DSL




c 2011 Andrei Alexandrescu                                16 / 33
Embedded DSLs




              Force into host language’s syntax?




c 2011 Andrei Alexandrescu                         17 / 33
Embedded DSLs



         •   Formatted printing?




c 2011 Andrei Alexandrescu         18 / 33
Embedded DSLs



         • Formatted printing?
         • Regular expressions?




c 2011 Andrei Alexandrescu        18 / 33
Embedded DSLs



         • Formatted printing?
         • Regular expressions?
         • EBNF?




c 2011 Andrei Alexandrescu        18 / 33
Embedded DSLs



         • Formatted printing?
         • Regular expressions?
         • EBNF?
         • PEG?




c 2011 Andrei Alexandrescu        18 / 33
Embedded DSLs



         •   Formatted printing?
         •   Regular expressions?
         •   EBNF?
         •   PEG?
         •   SQL?




c 2011 Andrei Alexandrescu          18 / 33
Embedded DSLs



         •   Formatted printing?
         •   Regular expressions?
         •   EBNF?
         •   PEG?
         •   SQL?


         •   . . . Pasta for everyone!


c 2011 Andrei Alexandrescu               18 / 33
Embedded DSLs



                    Here: use with native grammar


                             Process during compilation


                     Generate D code accordingly


c 2011 Andrei Alexandrescu                                19 / 33
Compile-Time Evaluation


         • A large subset of D available for compile-time evaluation
                 ulong factorial(uint n) {
                     ulong result = 1;
                     foreach (i; 2 .. n) result *= i;
                     return result;
                 }
                 ...
                 auto f1 = factorial(10); // run-time
                 static f2 = factorial(10); // compile-time



c 2011 Andrei Alexandrescu                                             20 / 33
Code injection with mixin



       mixin("writeln("hello, world");");
       mixin(generateSomeCode());
         • Not as glamorous as AST manipulation but darn
           effective
         • Easy to understand and debug



         • Now we have compile-time evaluation AND mixin. . .




c 2011 Andrei Alexandrescu                                      21 / 33
Wait a minute!



c 2011 Andrei Alexandrescu                    22 / 33
Example: bitfields in library


       struct A {
         int a;
         mixin(bitfields!(
           uint, "x",    2,
           int, "y",     3,
           uint, "z",    2,
           bool, "flag", 1));
       }
       A obj;
       obj.x = 2;
       obj.z = obj.x;

c 2011 Andrei Alexandrescu      23 / 33
Parser

       import pegged.grammar; // by Philippe Sigaud
       mixin(grammar("
         Expr     <    Factor AddExpr*
         AddExpr <     (’+’/’-’) Factor
         Factor   <    Primary MulExpr*
         MulExpr <     (’*’/’/’) Primary
         Primary <     Parens / Number / Variable
                       / ’-’ Primary
         Parens   <    ’(’ Expr ’)’
         Number   <~ [0-9]+
         Variable <- Identifier
       "));

c 2011 Andrei Alexandrescu                        24 / 33
Usage




       // Parsing at compile-time:
       static parseTree1 = Expr.parse(
         "1 + 2 - (3*x-5)*6");
       pragma(msg, parseTree1.capture);
       // Parsing at run-time:
       auto parseTree2 = Expr.parse(readln());
       writeln(parseTree2.capture);




c 2011 Andrei Alexandrescu                       25 / 33
Scaling up




       1000 lines of D grammar →
          3000 lines D parser



c 2011 Andrei Alexandrescu         26 / 33
Highly integrated lex+yacc



c 2011 Andrei Alexandrescu           27 / 33
What about regexen?



c 2011 Andrei Alexandrescu              28 / 33
Compile-time regular expressions



         • GSoC project by Dmitry Olshansky: FReD
         • Fully UTF capable, no special casing for ASCII
         • Two modes sharing the same backend:
                 auto r1 = regex("^.*/([^/]+)/?$");
                 static r2 = ctRegex!("^.*/([^/]+)/?$");
         • Run-time version uses intrinsics in a few places
         • Static version generates specialized automaton, then
           compiles it




c 2011 Andrei Alexandrescu                                        29 / 33
Summary




c 2011 Andrei Alexandrescu             31 / 33
Summary




         • Generic/generative programming—long unattained
           promise
         • D’s angle
             ◦ Powerful base language
             ◦ Type manipulation
             ◦ Compile-time evaluation
             ◦ Code generation




c 2011 Andrei Alexandrescu                                  32 / 33
Grill the Speaker!



   More about ranges? • Thought the talk was
   boring • Intriguing! • He lost me at mixin •
   Awesome • Went over my head • Meh • I wonder
   how I can implement binary search • What’s for
   dinner? • Accent is bothersome • Real
   programmers use C • Must. . . control. . . fist. . .
   of. . . death. . .



c 2011 Andrei Alexandrescu                               33 / 33

Mais conteúdo relacionado

Mais procurados

EdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for JavaEdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for Java
Lisa Hua
 

Mais procurados (8)

Symbolic Execution And KLEE
Symbolic Execution And KLEESymbolic Execution And KLEE
Symbolic Execution And KLEE
 
C language
C languageC language
C language
 
Introduction to HDLs
Introduction to HDLsIntroduction to HDLs
Introduction to HDLs
 
Dynamic Type Inference for Gradual Hindley–Milner Typing
Dynamic Type Inference for Gradual Hindley–Milner TypingDynamic Type Inference for Gradual Hindley–Milner Typing
Dynamic Type Inference for Gradual Hindley–Milner Typing
 
Temporal logic and functional reactive programming
Temporal logic and functional reactive programmingTemporal logic and functional reactive programming
Temporal logic and functional reactive programming
 
Being Expressive in Code
Being Expressive in CodeBeing Expressive in Code
Being Expressive in Code
 
EdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for JavaEdSketch: Execution-Driven Sketching for Java
EdSketch: Execution-Driven Sketching for Java
 
what engineers don't know (but probably mathematicians do)
what engineers don't know (but probably mathematicians do)what engineers don't know (but probably mathematicians do)
what engineers don't know (but probably mathematicians do)
 

Semelhante a Generic Programming Galore Using D

Logic Programming and ILP
Logic Programming and ILPLogic Programming and ILP
Logic Programming and ILP
Pierre de Lacaze
 
iterators-must-go
iterators-must-goiterators-must-go
iterators-must-go
Hiroshi Ono
 
Contest Tips and Tricks
Contest Tips and TricksContest Tips and Tricks
Contest Tips and Tricks
mbuzdalov
 
A Replay Approach to Software Validation
A Replay Approach to Software ValidationA Replay Approach to Software Validation
A Replay Approach to Software Validation
James Pascoe
 

Semelhante a Generic Programming Galore Using D (20)

Logic Programming and ILP
Logic Programming and ILPLogic Programming and ILP
Logic Programming and ILP
 
Interm codegen
Interm codegenInterm codegen
Interm codegen
 
iterators-must-go
iterators-must-goiterators-must-go
iterators-must-go
 
(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...
(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...
(chapter 1) A Concise and Practical Introduction to Programming Algorithms in...
 
Contest Tips and Tricks
Contest Tips and TricksContest Tips and Tricks
Contest Tips and Tricks
 
Introduction to Elixir
Introduction to ElixirIntroduction to Elixir
Introduction to Elixir
 
Global DSL workshop slides
Global DSL workshop slidesGlobal DSL workshop slides
Global DSL workshop slides
 
1 cc
1 cc1 cc
1 cc
 
IN4308 1
IN4308 1IN4308 1
IN4308 1
 
On being a professional software developer
On being a professional software developerOn being a professional software developer
On being a professional software developer
 
Crystal internals (part 1)
Crystal internals (part 1)Crystal internals (part 1)
Crystal internals (part 1)
 
Crystal internals (part 1)
Crystal internals (part 1)Crystal internals (part 1)
Crystal internals (part 1)
 
Crystal internals (part 1)
Crystal internals (part 1)Crystal internals (part 1)
Crystal internals (part 1)
 
A Replay Approach to Software Validation
A Replay Approach to Software ValidationA Replay Approach to Software Validation
A Replay Approach to Software Validation
 
Skiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in DSkiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in D
 
Clojure intro
Clojure introClojure intro
Clojure intro
 
Introduction to Prolog
Introduction to PrologIntroduction to Prolog
Introduction to Prolog
 
Антон Кириллов, ZeptoLab
Антон Кириллов, ZeptoLabАнтон Кириллов, ZeptoLab
Антон Кириллов, ZeptoLab
 
Parallel Optimization in Machine Learning
Parallel Optimization in Machine LearningParallel Optimization in Machine Learning
Parallel Optimization in Machine Learning
 
Introduction to Elixir
Introduction to ElixirIntroduction to Elixir
Introduction to Elixir
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Último (20)

Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 

Generic Programming Galore Using D

  • 1. Generic Programming Galore Using D Andrei Alexandrescu, PhD Research Scientist Facebook c 2011 Andrei Alexandrescu 1 / 33
  • 2. 37% off c 2011 Andrei Alexandrescu 2 / 33
  • 3. Generic Programming c 2011 Andrei Alexandrescu 3 / 33
  • 4. What is Generic Programming? c 2011 Andrei Alexandrescu 4 / 33
  • 5. What is Generic Programming? • Find most general algorithm representation ◦ Narrowest requirements ◦ Widest guarantees ◦ Big-O() encapsulation should be a crime ◦ No need to regress to hand-written code c 2011 Andrei Alexandrescu 4 / 33
  • 6. What is Generic Programming? • Find most general algorithm representation ◦ Narrowest requirements ◦ Widest guarantees ◦ Big-O() encapsulation should be a crime ◦ No need to regress to hand-written code • Define types to implement said requirements c 2011 Andrei Alexandrescu 4 / 33
  • 7. What is Generic Programming? • Find most general algorithm representation ◦ Narrowest requirements ◦ Widest guarantees ◦ Big-O() encapsulation should be a crime ◦ No need to regress to hand-written code • Define types to implement said requirements • Leverage the algorithm for ultimate reuse c 2011 Andrei Alexandrescu 4 / 33
  • 8. What is Generic Programming? • Find most general algorithm representation ◦ Narrowest requirements ◦ Widest guarantees ◦ Big-O() encapsulation should be a crime ◦ No need to regress to hand-written code • Define types to implement said requirements • Leverage the algorithm for ultimate reuse • ... • Profit! c 2011 Andrei Alexandrescu 4 / 33
  • 9. What is Generic Programming? • Find most general algorithm representation ◦ Narrowest requirements ◦ Widest guarantees ◦ Big-O() encapsulation should be a crime ◦ No need to regress to hand-written code • Define types to implement said requirements • Leverage the algorithm for ultimate reuse • ... • Profit! ´ • Arguably one of the noblest endeavors of our metier c 2011 Andrei Alexandrescu 4 / 33
  • 10. Generic Programming • “Write once, instantiate anywhere” ◦ Specialized implementations welcome • Prefers static type information and static expansion (macro style) • Fosters strong mathematical underpinnings ◦ Minimizing assumptions common theme in math • Tenuous relationship with binary interfaces • Starts with algorithms, not interfaces or objects • “Premature encapsulation is the root of some derangement” c 2011 Andrei Alexandrescu 5 / 33
  • 11. Warmup: the “dream min” • Should work at efficiency comparable to hand-written code • Take variadic arguments: min(a, b, ...) ◦ Avoid nonsensical calls min() and min(a) • Work for all ordered types and conversions • Decline incompatible types, without prejudice c 2011 Andrei Alexandrescu 6 / 33
  • 12. First prototype auto min(L, R)(L lhs, R rhs) { return rhs < lhs ? rhs : lhs; } auto a = min(x, y); • This function is as efficient as any specialized, handwritten version (true genericity) • Deduction for argument types and result type c 2011 Andrei Alexandrescu 7 / 33
  • 13. Variadic arguments auto min(T...)(T x) { static if (x.length > 2) return min(min(x[0], x[1]), x[2 .. $]); else return x[0] > x[1] ? x[1] : x[0]; } ... auto m = min(a + b, 100, c); • x is not an array • This is not classic recursion c 2011 Andrei Alexandrescu 8 / 33
  • 14. Reject nonsensical calls auto min(T...)(T x) if (x.length > 1) { ... } • Rejects calls with 0 or 1 arguments • Allows other overloads to take over, e.g. min element over a collection • More work needed ◦ Only accept types with a valid intersection ◦ Only accept types comparable with ”<” c 2011 Andrei Alexandrescu 9 / 33
  • 15. Common type • Task: Given a list of types, find the common type of all template CommonType(T...) { static if (T.length == 1) alias T[0] CommonType; else static if (is(typeof(1 ? T[0].init : T[1].init) U)) alias CommonType!(U, T[2 .. $]) CommonType; else alias void CommonType; } // Usage static assert(is(CommonType!(int, short, long) == long)); c 2011 Andrei Alexandrescu 10 / 33
  • 16. Using CommonType auto min(T...)(T x) if (x.length > 1 && is(typeof(CommonType!T.init < CommonType!T.init) == bool)) { static if (x.length > 2) return min(min(x[0], x[1]), x[2 .. $]); else return x[0] > x[1] ? x[1] : x[0]; } c 2011 Andrei Alexandrescu 11 / 33
  • 17. How about min over many elements? auto min(R)(R range) if (isInputRange!R && is(typeof(range.front < range.front) == bool)) { auto result = range.front; range.popFront(); foreach (e; range) { if (e < result) result = e; } return result; } auto m = [ 1, 5, 2, 0, 7, 9 ].min(); • Works over anything that can be iterated c 2011 Andrei Alexandrescu 12 / 33
  • 18. How about argmin now? auto argmin(alias fun, R)(R r) if (isInputRange!R && is(typeof(fun(r.front) < fun(r.front)) == bool)) { auto result = r.front; auto cache = fun(result); r.popFront(); foreach (e; r) { auto cand = fun(e); if (cand > cache) continue; result = e; cache = cand; } return result; } c 2011 Andrei Alexandrescu 13 / 33
  • 19. argmin auto s = ["abc", "a", "xz"]; auto m = s.argmin!((x) => x.length); • Works on anything iterable and any predicate • Predicate is passed by alias • No loss of efficiency c 2011 Andrei Alexandrescu 14 / 33
  • 20. The Generative Connection c 2011 Andrei Alexandrescu 15 / 33
  • 21. Generative programming • In brief: code that generates code • Generic programming often requires algorithm specialization • Specification often present in a DSL c 2011 Andrei Alexandrescu 16 / 33
  • 22. Embedded DSLs Force into host language’s syntax? c 2011 Andrei Alexandrescu 17 / 33
  • 23. Embedded DSLs • Formatted printing? c 2011 Andrei Alexandrescu 18 / 33
  • 24. Embedded DSLs • Formatted printing? • Regular expressions? c 2011 Andrei Alexandrescu 18 / 33
  • 25. Embedded DSLs • Formatted printing? • Regular expressions? • EBNF? c 2011 Andrei Alexandrescu 18 / 33
  • 26. Embedded DSLs • Formatted printing? • Regular expressions? • EBNF? • PEG? c 2011 Andrei Alexandrescu 18 / 33
  • 27. Embedded DSLs • Formatted printing? • Regular expressions? • EBNF? • PEG? • SQL? c 2011 Andrei Alexandrescu 18 / 33
  • 28. Embedded DSLs • Formatted printing? • Regular expressions? • EBNF? • PEG? • SQL? • . . . Pasta for everyone! c 2011 Andrei Alexandrescu 18 / 33
  • 29. Embedded DSLs Here: use with native grammar Process during compilation Generate D code accordingly c 2011 Andrei Alexandrescu 19 / 33
  • 30. Compile-Time Evaluation • A large subset of D available for compile-time evaluation ulong factorial(uint n) { ulong result = 1; foreach (i; 2 .. n) result *= i; return result; } ... auto f1 = factorial(10); // run-time static f2 = factorial(10); // compile-time c 2011 Andrei Alexandrescu 20 / 33
  • 31. Code injection with mixin mixin("writeln("hello, world");"); mixin(generateSomeCode()); • Not as glamorous as AST manipulation but darn effective • Easy to understand and debug • Now we have compile-time evaluation AND mixin. . . c 2011 Andrei Alexandrescu 21 / 33
  • 32. Wait a minute! c 2011 Andrei Alexandrescu 22 / 33
  • 33. Example: bitfields in library struct A { int a; mixin(bitfields!( uint, "x", 2, int, "y", 3, uint, "z", 2, bool, "flag", 1)); } A obj; obj.x = 2; obj.z = obj.x; c 2011 Andrei Alexandrescu 23 / 33
  • 34. Parser import pegged.grammar; // by Philippe Sigaud mixin(grammar(" Expr < Factor AddExpr* AddExpr < (’+’/’-’) Factor Factor < Primary MulExpr* MulExpr < (’*’/’/’) Primary Primary < Parens / Number / Variable / ’-’ Primary Parens < ’(’ Expr ’)’ Number <~ [0-9]+ Variable <- Identifier ")); c 2011 Andrei Alexandrescu 24 / 33
  • 35. Usage // Parsing at compile-time: static parseTree1 = Expr.parse( "1 + 2 - (3*x-5)*6"); pragma(msg, parseTree1.capture); // Parsing at run-time: auto parseTree2 = Expr.parse(readln()); writeln(parseTree2.capture); c 2011 Andrei Alexandrescu 25 / 33
  • 36. Scaling up 1000 lines of D grammar → 3000 lines D parser c 2011 Andrei Alexandrescu 26 / 33
  • 37. Highly integrated lex+yacc c 2011 Andrei Alexandrescu 27 / 33
  • 38. What about regexen? c 2011 Andrei Alexandrescu 28 / 33
  • 39. Compile-time regular expressions • GSoC project by Dmitry Olshansky: FReD • Fully UTF capable, no special casing for ASCII • Two modes sharing the same backend: auto r1 = regex("^.*/([^/]+)/?$"); static r2 = ctRegex!("^.*/([^/]+)/?$"); • Run-time version uses intrinsics in a few places • Static version generates specialized automaton, then compiles it c 2011 Andrei Alexandrescu 29 / 33
  • 40.
  • 41. Summary c 2011 Andrei Alexandrescu 31 / 33
  • 42. Summary • Generic/generative programming—long unattained promise • D’s angle ◦ Powerful base language ◦ Type manipulation ◦ Compile-time evaluation ◦ Code generation c 2011 Andrei Alexandrescu 32 / 33
  • 43. Grill the Speaker! More about ranges? • Thought the talk was boring • Intriguing! • He lost me at mixin • Awesome • Went over my head • Meh • I wonder how I can implement binary search • What’s for dinner? • Accent is bothersome • Real programmers use C • Must. . . control. . . fist. . . of. . . death. . . c 2011 Andrei Alexandrescu 33 / 33