meta-programming & you · metaprogramming is the writing of computer programs that write or...
TRANSCRIPT
![Page 1: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/1.jpg)
Meta-programming & you
Robin Message
Cambridge Programming Research Group
10th May 2010
![Page 2: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/2.jpg)
What’s meta-programming about?
1 result=somedb . customers . select2 {first_name+” ”+last_name}3 where name LIKE search_query+”%”
→1 result=somedb . runQuery ( ”SELECT f i r s t n ame , l a s t name FROM customer s
WHERE name LIKE ?” , search_query+”%” )2 . map { | first_name , last_name |3 first_name+” ”+last_name
4 }
↔AWESOME!
Robin Message (CPRG) Meta-programming & you May 2010 3 / 41
![Page 3: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/3.jpg)
What’s meta-programming about?
1 result=somedb . customers . select2 {first_name+” ”+last_name}3 where name LIKE search_query+”%”
→1 result=somedb . runQuery ( ”SELECT f i r s t n ame , l a s t name FROM customer s
WHERE name LIKE ?” , search_query+”%” )2 . map { | first_name , last_name |3 first_name+” ”+last_name
4 }
↔AWESOME!
Robin Message (CPRG) Meta-programming & you May 2010 3 / 41
![Page 4: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/4.jpg)
What’s meta-programming about?
1 result=somedb . customers . select2 {first_name+” ”+last_name}3 where name LIKE search_query+”%”
→1 result=somedb . runQuery ( ”SELECT f i r s t n ame , l a s t name FROM customer s
WHERE name LIKE ?” , search_query+”%” )2 . map { | first_name , last_name |3 first_name+” ”+last_name
4 }
↔AWESOME!
Robin Message (CPRG) Meta-programming & you May 2010 3 / 41
![Page 5: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/5.jpg)
What is meta-programming?
Metaprogramming is the writing of computer programs that write ormanipulate other programs (or themselves) as their data, or that dopart of the work at compile time that would otherwise be done atruntime.
A metaprogram is a program that manipulates other programs (oritself) as its data. The canonical example is a compiler.
Meta-programming, by which is meant that one constructs aninterpreter for a language close to the problem and then writesproblem solutions using the primitives of this language.
“Code that creates, manipulates or influences other code.”
Robin Message (CPRG) Meta-programming & you May 2010 4 / 41
![Page 6: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/6.jpg)
Where are we going?
1 What is meta-programming?
2 Why do meta-programming?OptimisationAbstractionExpressiveness
3 What is a Domain Specific Language?
4 How can we implement a DSL in...JavaRubyLisp
Robin Message (CPRG) Meta-programming & you May 2010 5 / 41
![Page 7: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/7.jpg)
Why?
Q: Why do meta-programming?
Optimisation Specialise the interpretation of the language
Abstraction Improve the language
Expressiveness Create a new language
Robin Message (CPRG) Meta-programming & you May 2010 6 / 41
![Page 8: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/8.jpg)
Why?
Q: Why do meta-programming?
Optimisation Specialise the interpretation of the language
Abstraction Improve the language
Expressiveness Create a new language
Robin Message (CPRG) Meta-programming & you May 2010 6 / 41
![Page 9: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/9.jpg)
Optimisation
Examples
C++ templates
FFTW
Compiler plugins
Partial evaluation
Static typing
Robin Message (CPRG) Meta-programming & you May 2010 7 / 41
![Page 10: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/10.jpg)
Abstraction
Whatever abstraction mechanism your language provides, there will alwaysbe parts of your program that can’t be abstracted[citation needed].
Examples
Aspects Expressing cross-cutting concerns
Java 1.5 iterators
1 f o r ( Iterator i=collection . iterator ( ) ; i . hasNext ( ) ; ) {2 Element e=i . next ( ) ;
↔1 f o r ( Element e : collection ) {
Why can’t we describe new syntax and control structuresin some kind of meta-Java?
Robin Message (CPRG) Meta-programming & you May 2010 9 / 41
![Page 11: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/11.jpg)
Abstraction
Whatever abstraction mechanism your language provides, there will alwaysbe parts of your program that can’t be abstracted[citation needed].
Examples
Aspects Expressing cross-cutting concerns
Java 1.5 iterators
1 f o r ( Iterator i=collection . iterator ( ) ; i . hasNext ( ) ; ) {2 Element e=i . next ( ) ;
↔1 f o r ( Element e : collection ) {
Why can’t we describe new syntax and control structuresin some kind of meta-Java?
Robin Message (CPRG) Meta-programming & you May 2010 9 / 41
![Page 12: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/12.jpg)
Abstraction
Whatever abstraction mechanism your language provides, there will alwaysbe parts of your program that can’t be abstracted[citation needed].
Examples
Aspects Expressing cross-cutting concerns
Java 1.5 iterators
1 f o r ( Iterator i=collection . iterator ( ) ; i . hasNext ( ) ; ) {2 Element e=i . next ( ) ;
↔1 f o r ( Element e : collection ) {
Why can’t we describe new syntax and control structuresin some kind of meta-Java?
Robin Message (CPRG) Meta-programming & you May 2010 9 / 41
![Page 13: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/13.jpg)
Abstraction
Whatever abstraction mechanism your language provides, there will alwaysbe parts of your program that can’t be abstracted[citation needed].
Examples
Aspects Expressing cross-cutting concerns
Java 1.5 iterators
1 f o r ( Iterator i=collection . iterator ( ) ; i . hasNext ( ) ; ) {2 Element e=i . next ( ) ;
↔1 f o r ( Element e : collection ) {
Why can’t we describe new syntax and control structuresin some kind of meta-Java?
Robin Message (CPRG) Meta-programming & you May 2010 9 / 41
![Page 14: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/14.jpg)
Expressiveness
Express programs that cannot be represented in your language.
Examples
A Prolog interpreter Semantics unlike most other languages
Domain Specific Languages Semantics of a particular domain
Robin Message (CPRG) Meta-programming & you May 2010 10 / 41
![Page 15: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/15.jpg)
What is a Domain Specific Language?
Q: Give me some examples
We will discus shallow embedded DSLs.
embedded within the syntax of an existing language
shallow embedding using the data types of an existing language
domain area of interest
specific specialised to, designed for
Robin Message (CPRG) Meta-programming & you May 2010 11 / 41
![Page 16: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/16.jpg)
What is a Domain Specific Language?
Q: Give me some examples
We will discus shallow embedded DSLs.
embedded within the syntax of an existing language
shallow embedding using the data types of an existing language
domain area of interest
specific specialised to, designed for
Robin Message (CPRG) Meta-programming & you May 2010 11 / 41
![Page 17: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/17.jpg)
Where are we now?
1 What is meta-programming?
2 Why do meta-programming?OptimisationAbstractionExpressiveness
3 What is a Domain Specific Language?
4 How can we implement a DSL in...JavaRubyLisp
Robin Message (CPRG) Meta-programming & you May 2010 12 / 41
![Page 18: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/18.jpg)
How to implement a DSL
Or, let’s get on with the code!
Running example
Expressions made up of numbers, operators and variablesarea = (width + 8) ∗ (height + 4)
Robin Message (CPRG) Meta-programming & you May 2010 13 / 41
![Page 19: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/19.jpg)
Java
1 a b s t r a c t c l a s s Expression {2 a b s t r a c t doub l e calculate ( Map<String , double> env ) ;3 Expression add ( Expression b ) {4 r e t u r n new Add ( t h i s , b ) ;5 }6 Expression mul ( Expression b ) {7 r e t u r n new Mul ( t h i s , b ) ;8 }9 }
Method Chaining
Robin Message (CPRG) Meta-programming & you May 2010 15 / 41
![Page 20: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/20.jpg)
Add and Multiply classes
1 c l a s s Add ex t end s Expression {2 p r i v a t e Expression a , b ;3 Add ( Expression _a , Expression _b ) {4 a=_a ; b=_b ;5 }6 doub l e calculate ( Map<String , double> env ) {7 r e t u r n a . calculate ( env )+b . calculate ( env ) ;8 }9 }
10 c l a s s Mul ex t end s Expression {11 p r i v a t e Expression a , b ;12 Mul ( Expression _a , Expression _b ) {13 a=_a ; b=_b ;14 }15 doub l e calculate ( Map<String , double> env ) {16 r e t u r n a . calculate ( env ) *b . calculate ( env ) ;17 }18 }
Robin Message (CPRG) Meta-programming & you May 2010 17 / 41
![Page 21: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/21.jpg)
Variables and numbers
1 c l a s s Var ex t end s Expression {2 p r i v a t e String name ;3 Var ( String _n ) {4 name=_n ;5 }6 doub l e calculate ( Map<String , double> env ) {7 r e t u r n env . get ( name ) ;8 }9 }
10 c l a s s Num ex t end s Expression {11 p r i v a t e doub l e num ;12 Num ( doub l e _n ) {13 num=_n ;14 }15 doub l e calculate ( Map<String , double> env ) {16 r e t u r n num ;17 }18 }
Robin Message (CPRG) Meta-programming & you May 2010 19 / 41
![Page 22: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/22.jpg)
Is our new DSL pleasant to use?
1 s t a t i c Expression add ( Expression a , Expression b ) { r e t u r n new Add (a , b) ;}
2 s t a t i c Expression variable ( String name ) { r e t u r n new Var ( name ) ;}3 s t a t i c Expression number ( doub l e n ) { r e t u r n new Num ( n ) ;}4
5 Expression area=add ( variable ( ”width ” ) , number (8 ) ) . mul ( variable ( ”h e i g h t ” ) . add ( number (4 ) ) ) ;
6
7 area . calculate ( env ) ;
Robin Message (CPRG) Meta-programming & you May 2010 21 / 41
![Page 23: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/23.jpg)
Is Java any good for DSLs?
Q: Well, what do you think?
Method chaining
Static binary methods are repetitive
Wrapping names and numbers
Expression problem
Tree structure
Not really
Robin Message (CPRG) Meta-programming & you May 2010 23 / 41
![Page 24: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/24.jpg)
Is Java any good for DSLs?
Q: Well, what do you think?
Method chaining
Static binary methods are repetitive
Wrapping names and numbers
Expression problem
Tree structure
Not really
Robin Message (CPRG) Meta-programming & you May 2010 23 / 41
![Page 25: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/25.jpg)
Ruby
1 c l a s s Expression
2 de f initialize &b
3 @block=b
4 end5 de f calculate environment
6 @env=environment
7 instance_eval &@block
8 end9 de f method_missing name ,* args
10 i f args . length==011 @env [ name ]12 e l s e13 supe r name ,* args14 end15 end16 end
Robin Message (CPRG) Meta-programming & you May 2010 25 / 41
![Page 26: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/26.jpg)
Is Ruby good for DSLs?
1 area=Expression . new {2 ( width+8) * ( height+4)3 }4
5 area . calculate : width => 100 , : height => 5
Looks pretty good to me
Robin Message (CPRG) Meta-programming & you May 2010 27 / 41
![Page 27: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/27.jpg)
Why is Ruby good for DSLs?
Blocks
Symbols
method missing and other hooks
Always have eval (MAD)
Q: Any problems with this approach?
Robin Message (CPRG) Meta-programming & you May 2010 28 / 41
![Page 28: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/28.jpg)
Why is Ruby good for DSLs?
Blocks
Symbols
method missing and other hooks
Always have eval (MAD)
Q: Any problems with this approach?
Robin Message (CPRG) Meta-programming & you May 2010 28 / 41
![Page 29: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/29.jpg)
Dynamic evaluation and namespace pollution
1 whoops=Expression . new {2 t r u e + f a l s e3 }4 whoops . calculate : t r u e => 1 , : f a l s e => 0
Trade-off in shallow embedding of DSLs – it is easy toconfuse DSL features with language features.
Robin Message (CPRG) Meta-programming & you May 2010 30 / 41
![Page 30: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/30.jpg)
Introduction to Lisp
Scheme in one slide...
Datatypes Literals ("foo", 42), symbols (name, *,some-long-thing!), lists (a b c), pairs (a . b)
Evaluation A literal is a literal, a symbol has a value and a list is afunction call
Functions (function-name arguments...) evaluates the arguments,then evaluate the function-name and invoke what it returnswith the evaluated arguments
Macros Look like functions, but might evaluate differently
List operations list returns its arguments as a list, cons≡cons,car≡head, cdr≡tail, cadr≡head of tail, and so on
Quoting ’x≡(quote x), and quote is a macro that returns itsargument without evaluating it.‘(a ,b c) means (list ’a b ’c)
Built-ins define if cond equal? list? map eval
Robin Message (CPRG) Meta-programming & you May 2010 31 / 41
![Page 31: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/31.jpg)
Expressions in Lisp
1 ( define ( deinfix exp )2 ( cond3 ( ( and ( l i s t ? exp ) ( equa l ? 3 ( l e n g t h exp ) ) ) ( l i s t ( cadr exp ) (
deinfix ( car exp ) ) ( deinfix ( caddr exp ) ) ) )4 ( else exp )5 ) )6
7 ( define ( calculate exp env )8 (map ( lambda ( v ) ( e v a l `( define , ( car v ) , ( cdr v ) ) ) ) env )9 ( e v a l exp )
10 )11
12 ( define area ' ( ( width + 8) * ( height + 4) ) )13 ( calculate area ' ( ( width . 100) ( height . 50) ) )
“deinfix” turns (a ∗ b) into (* a b).“calculate” evaluates a Lisp expression in a specific environment
Bit ugly, only fully bracketed expressions
Robin Message (CPRG) Meta-programming & you May 2010 33 / 41
![Page 32: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/32.jpg)
Remember how we wanted meta for abstraction?
1 ( define ( prec op )2 ( ca s e op
3 ( '+ 1) ( '− 1) ( ' * 2) ( '/ 2) ( 'ˆ 3) ( else 0)4 ) )5 ( define ( r a s s o c op ) ( eq ? op 'ˆ) )6 ( define ( munge exp )7 . . .8 )9
10 ( define-syntax expression
11 ( syntax-rules ( )12 ( ( _ exp . . . )13 ( deinfix ( munge ' ( exp . . . ) ) )14 ) ) )15
16 ( calculate ( expression ( width + 8) * ( height + 4) ) ' ( ( width . 100)( height . 50) ) )
Competition: A working version of “munge” in Lisp.
Robin Message (CPRG) Meta-programming & you May 2010 35 / 41
![Page 33: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/33.jpg)
Differentiation
1 ( define ( diff exp var )2 ( cond3 ( ( symbol ? exp ) ( if ( eq ? exp var ) 1 0) )4 ( ( number ? exp ) 0)5 ( ( equa l ? 3 ( l e n g t h exp ) ) ( diff-binop ( car exp ) ( cadr exp ) (
caddr exp ) var ) )6 ( else ( raise ( string-append ”Not an e x p r e s s i o n ” exp ) ) )7 ) )8 ( define ( diff-binop op a b var )9 ( cond ( ( equa l ? '+ op ) `(+ , ( diff a var ) , ( diff b var ) ) )
10 ( ( equa l ? '− op ) `(− , ( diff a var ) , ( diff b var ) ) )11 ( ( equa l ? '* op ) `(+ (* , ( diff a var ) , b ) (* , a , ( diff b var
) ) ) )12 ( ( equa l ? 'ˆ op ) ( if ( number ? b )13 ( if ( eq ? b 0) 0 ( diff-binop '* a `(ˆ , a
,(− b 1) ) var ) )14 ( raise ”ˆ not a non−number” )15 ) )16 ( else ( raise ( string-append ``Can ' t differentiate ' ' (
symbol->s t r i n g op ) ) ) )17 ) )
Robin Message (CPRG) Meta-programming & you May 2010 37 / 41
![Page 34: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/34.jpg)
Simplification
1 ( define ( simplify exp )2 ( cond ( ( and ( l i s t ? exp ) ( equa l ? 3 ( l e n g t h exp ) ) ) ( simplify-binop
( car exp ) ( cadr exp ) ( caddr exp ) ) )3 ( else exp )4 ) )5 ( define ( simplify-binop op ina inb )6 ( define sima ( simplify ina ) )7 ( define simb ( simplify inb ) )8 ( match ( l i s t op sima simb )9 ( ( l i s t '+ a 0) a )
10 ( ( l i s t '− a 0) a )11 ( ( l i s t '+ 0 b ) b )12 ( ( l i s t '+ a a ) `(* 2 , a ) )13 ( ( l i s t '− a a ) 0)14 ( ( l i s t '* a 0) 0)15 ( ( l i s t '* 0 b ) 0)16 ( ( l i s t '* a 1) a )17 ( ( l i s t '* 1 b ) b )18 ( ( l i s t 'ˆ a 0) 1)19 ( ( l i s t 'ˆ a 1) a )20 ( else ( l i s t op sima simb ) )21 ) )22 ( simplify ( diff ( expression x ˆ 2 − 2 * x + 1) ' x ) )
Robin Message (CPRG) Meta-programming & you May 2010 39 / 41
![Page 35: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/35.jpg)
Is Lisp good for DSLs?
HELL YEAH!
Lightweight syntax
Symbols
Code as data
Macros
define-syntax
eval
Robin Message (CPRG) Meta-programming & you May 2010 40 / 41
![Page 36: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/36.jpg)
Is Lisp good for DSLs?
HELL YEAH!
Lightweight syntax
Symbols
Code as data
Macros
define-syntax
eval
Robin Message (CPRG) Meta-programming & you May 2010 40 / 41
![Page 37: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/37.jpg)
Conclusions
Meta-programming lets us optimise, improve abstraction and increaseexpressiveness
DSLs are a powerful and useful tool
Lisp is an awesome tool for meta-programming, because code is data
Thank you! Any questions?
Robin Message (CPRG) Meta-programming & you May 2010 41 / 41
![Page 38: Meta-programming & you · Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do ... Ruby 1 class Expression](https://reader030.vdocument.in/reader030/viewer/2022040306/5ebd48dda1055014233c2a46/html5/thumbnails/38.jpg)
Conclusions
Meta-programming lets us optimise, improve abstraction and increaseexpressiveness
DSLs are a powerful and useful tool
Lisp is an awesome tool for meta-programming, because code is data
Thank you! Any questions?
Robin Message (CPRG) Meta-programming & you May 2010 41 / 41