Metaprogramming

23

description

Metaprogramming with the Boo programming language.

Transcript of Metaprogramming

Page 1: Metaprogramming
Page 2: Metaprogramming

Page 3: Metaprogramming
Page 4: Metaprogramming

template<int n> struct Factorial

{

enum {

RET = n *

Factorial<n-1>::RET

}

};

template<> struct Factorial<0>

{

enum {

RET = 1

}

};

int n = Factorial<5>::RET; // 120

Page 5: Metaprogramming

Page 6: Metaprogramming

Page 7: Metaprogramming

– #define sqr(x) ((x)*(x))int n = sqr(2);// emits int n = ((2)*(2));

–pow(x,n)

–#define

Page 8: Metaprogramming
Page 9: Metaprogramming

class MyMacro(AbstractAstMacro)

{

override def Expand(macro as MacroStatement)

{

// macro.Argument[n]

// macro.Body

yield/return

}

}

• MyMacro

• MyMacro 1 2

• MyMacro:print “test”

Page 10: Metaprogramming

class MyMacro(AbstractAstMacro)

{

override def Expand(macro as MacroStatement)

{

// macro.Argument[0]

// macro.Body

yield/return

}

}

macro MyMacro (n as int):

// MyMacro.Argument[n]

// MyMacro.Body

yield/return

Page 11: Metaprogramming

k

– →

– →

Page 12: Metaprogramming
Page 13: Metaprogramming

macro dateNow:

now = DateTime.Now

return [|

print $(now.ToLocalTime().ToString())

|]

Page 14: Metaprogramming

macro RepeatCStyle(c as int):

return [|

for i in range($c):

$(RepeatCStyle.Body)

|]

macro RepeatInline(c as int):

body = RepeatInline.Body

yieldAll body for i in range(c)

RepeatXxx 3:print “Go”

Console.WriteLine("Go");Console.WriteLine("Go");Console.WriteLine("Go");

int ___temp14 = 0;while (___temp14 < 3){int i = ___temp14;___temp14++;Console.WriteLine("Go");

}

Page 15: Metaprogramming

Page 16: Metaprogramming

[meta] def assert(condition as Expression):

return [|

if not $condition:

raise AssertionFailedException( $(condition.ToCodeString()))

|]

Page 17: Metaprogramming

Page 18: Metaprogramming

public class TimestampAttribute(AbstractAstAttribute):

public override def Apply(node as Node):

c = node as ClassDefinition

now = DateTime.Now

m = [|

public def GetTimestamp():

return $(now.ToLocalTime().ToString())

|]

c.Members.Add(m) // a new member added to

// an existing class

Page 19: Metaprogramming

– [Timestamp]public class C:public def constructor():pass

– c = C()print c.GetTimestamp()

Page 20: Metaprogramming
Page 21: Metaprogramming

j

•–

Page 22: Metaprogramming

Page 23: Metaprogramming