Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
szabototo89 committed May 20, 2014
1 parent 2bb1799 commit 01aeac6
Show file tree
Hide file tree
Showing 5 changed files with 195 additions and 0 deletions.
15 changes: 15 additions & 0 deletions examples/MetaCode/example1.mc
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
macro DebugMacro(tree: { * > * }) do
var i : number = 1;
foreach (var child : any in convertToString(tree)) do
debug(i + '. child');
debug(child);
i = i + 1;
end;
end;

skip;

if (true)
skip;
end;

17 changes: 17 additions & 0 deletions examples/MetaCode/example2.mc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
macro AddValueMemberToPerson(person: { * > type[name=Person] }) do
// új adattagot (value: any) adunk a típushoz
appendTo([ formalParameter('value', 'any') ], person);
end;

// a Person típushoz konkatenáljuk
object Person
name: string;
age: number;
end;

// itt példányosítjuk a Person típust
var p : Person = new(Person);

p.name = 'Gipsz Jakab';

debug(p.name);
46 changes: 46 additions & 0 deletions examples/MetaCode/example3.mc
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// az objektumtípusok közötti öröklődést fogjuk szimulálni a makróval
macro ExtendsMacro(trees: { * > type > attribute[name=extends] }) do
foreach (var tree : any in trees) do
// mivel a szelektorral az attribútumot választottuk ki
// ezért vissza kell mennünk a szülő objektumhoz
var obj : any = parent(tree);

// lekérjük az attribútum nulladik helyen lévő
var param : string = getAttributeValue(tree, 0);

// mivel egy listával tér vissza a getAttributeValue,
// ezért végig kell rajta iterálnunk
foreach (var objectName : string in param) do
debug(objectName);
// kiválasztjuk az ősobjektumokat
var selectedObjects : any = find(root(), '{ * > type[name=' + objectName + ']}');

// hozzácsatoljuk az ősobjektum adattagjait az aktuálishoz
appendTo(members(selectedObjects), obj);
end;

debug(param);
end;
end;

// az 'ősosztályunk' lesz a Person
object Person
name: string;
age: number;
end;

// az Employee a Person adattagjait fogja örökölni
@extends('Person')
object Employee
job: string;
end;

// a Boss pedig az Employee adattagjait
@extends('Employee')
object Boss
type: string;
end;




78 changes: 78 additions & 0 deletions examples/MetaCode/example4.mc
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// ezzel a makróval készítünk egy új függvényt
macro CreateFunction(tree : { * }) do
var func: any = func(
'max', [ parameter('a', 'number'), parameter('b', 'number') ],
ast('if (a > b) result = a; else result = b; end;')
);

// a prependTo-val a kód elejére szúrjuk be az általunk
// összeállított függvényt
prependTo(func, tree);
end;

// A LogBranchesMacro kiválasztja a globális hatókörben lévő
// elágazosok igaz ágát választjuk ki
macro LogBranchesMacro(tree: { * > if[true-statement] }) do
// hozzácsatoljuk a debug függvényhívást a szekvencia végéhez
appendTo(
functionCall('debug', [str('Elágazás vége ...')]), tree
);
// hozzácsatoljuk a debug függvényhívást a szekvencia elejéhez
prependTo(
// a függvényhívást a functionCall függvénnyel állítjuk elő
// ez automatikusan visszatér annak a szintaxisfájával
// első paraméterként átadjuk neki a függvény nevét
// míg másodikként az aktuális paramétereket
functionCall('debug', [str('Elágazás kezdete ...')]), tree
);
end;

// A DetachBranchesInWhileBody makróval lekérdezzük a while ciklus törzsét
macro DetachBranchesInWhileBody(tree : { * > while[body] }) do
// töröljük a benne lévő elágazásokat
detach(find(tree, '{ * > if }'));

prependTo(
functionCall('debug', [str('Ciklus törzsének kezdete ...')]), tree
);

// és hozzácsatolunk egy függvényhívást
appendTo(
functionCall('debug', [str('Ciklus törzsének vége ...')]), tree
);
end;


if (true)
if (2 >= 0)
debug('Hello World');
end;
end;

var i : number = 1;

while (i < 4) do
if (true)
if (false)
skip;
end;
end;
debug(max(10, 13));
if (false)
skip;
end;
i = i + 1;
end;













39 changes: 39 additions & 0 deletions examples/MetaCode/example5.mc
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
macro ObjectType(person: { * > type[name=Person] }) do
// kiíratjuk a konzolra az adattagok nevét
// a name függvény az adattagok nevével tér vissza
// ebben az esetben name(members(person)) == [ 'name', 'age' ]-el egyenlő
foreach (var m: string in name(members(person))) do
debug(m);
end;

// a members a típus adattagjaival tér vissza
foreach (var member : any in members(person)) do
// a name adattag típusát megváltoztatjuk any-ra
// a change függvénnyel
if (equals(name(member), 'name'))
// az első paraméterrel mondjuk meg, hogy mit szeretnénk megváltoztatni
// a másodikkal, hogy mely objektumnak akarjuk megváltoztatni
// a harmadikkal pedig megmondjuk, hogy milyen típusú lesz
change('type', type(member), 'any');
end;
end;
debug(person);
end;

object Person
name: string;
age: number;
end;

@extends(Person)
object Employee
company: string;
end;








0 comments on commit 01aeac6

Please sign in to comment.