-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2bb1799
commit 01aeac6
Showing
5 changed files
with
195 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|