Details
Description
Nested macros (BOO-1120) are very nice, however having to declare them 'inline' in the macro block can quickly become a mess (all nested macros defined in the same file) and does not permit extending an existing macro from an external assembly.
The following syntax would allow defining nested macros within parent macro block as well as outside (or even an external assembly) :
""" base nested nestedNestedExtension extensionNested < base nestedExtension nestedExtensionExtension < base """ macro base: macro nested: yield [| print "nested" |] yield yield [| print "base" |] yield macro base.nestedExtension: yield [| print "nestedExtension" |] yield macro base.nested.nestedNestedExtension: assert base.Name == "base" assert nested.Name == "nested" macro extensionNested: assert base.Name == "base" assert nested.Name == "nested" assert nestedNestedExtension.Name == "nestedNestedExtension" yield [| print "extensionNested ${$(base.Arguments[0])}" |] yield [| print "nestedNestedExtension" |] yield macro base.nestedExtension.nestedExtensionExtension: assert base.Name == "base" assert nestedExtension.Name == "nestedExtension" yield [| print "nestedExtensionExtension ${$(base.Arguments[0])}" |] base "< base": nested: nestedNestedExtension: extensionNested nestedExtension: nestedExtensionExtension
Activity
Cedric Vivier
made changes -
| Field | Original Value | New Value |
|---|---|---|
| Description |
Nested macros ( The following syntax would allow defining nested macros within parent macro block as well as outside (or even an external assembly) : {code} """ nested nestedExtension """ macro base: macro nested: yield [| print "nested" |] yield macro base.nestedExtension: #can also be defined in another assembly yield [| print "nestedExtension" |] base: nested nestedExtension {code} |
Nested macros ( The following syntax would allow defining nested macros within parent macro block as well as outside (or even an external assembly) : {code} """ nested nestedNestedExtension nestedExtension nestedExtensionExtension """ macro base: macro nested: yield [| print "nested" |] yield macro base.nestedExtension: #can also be defined in another assembly yield [| print "nestedExtension" |] macro base.nestedNestedExtension: yield [| print "nestedNestedExtension" |] macro base.nestedExtension.nestedExtensionExtension: yield [| print "nestedNestedExtensionExtension" |] base: nested nestedNestedExtension nestedExtension nestedExtensionExtension {code} |
Cedric Vivier
made changes -
| Status | Open [ 1 ] | In Progress [ 3 ] |
Cedric Vivier
made changes -
| Description |
Nested macros ( The following syntax would allow defining nested macros within parent macro block as well as outside (or even an external assembly) : {code} """ nested nestedNestedExtension nestedExtension nestedExtensionExtension """ macro base: macro nested: yield [| print "nested" |] yield macro base.nestedExtension: #can also be defined in another assembly yield [| print "nestedExtension" |] macro base.nestedNestedExtension: yield [| print "nestedNestedExtension" |] macro base.nestedExtension.nestedExtensionExtension: yield [| print "nestedNestedExtensionExtension" |] base: nested nestedNestedExtension nestedExtension nestedExtensionExtension {code} |
Nested macros ( The following syntax would allow defining nested macros within parent macro block as well as outside (or even an external assembly) : {code} """ base nested nestedNestedExtension extensionNested < base nestedExtension nestedExtensionExtension < base """ macro base: macro nested: yield [| print "nested" |] yield yield [| print "base" |] yield macro base.nestedExtension: yield [| print "nestedExtension" |] yield macro base.nested.nestedNestedExtension: assert base.Name == "base" assert nested.Name == "nested" macro extensionNested: assert base.Name == "base" assert nested.Name == "nested" assert nestedNestedExtension.Name == "nestedNestedExtension" yield [| print "extensionNested ${$(base.Arguments[0])}" |] yield [| print "nestedNestedExtension" |] yield macro base.nestedExtension.nestedExtensionExtension: assert base.Name == "base" assert nestedExtension.Name == "nestedExtension" yield [| print "nestedExtensionExtension ${$(base.Arguments[0])}" |] base "< base": nested: nestedNestedExtension: extensionNested nestedExtension: nestedExtensionExtension {code} |
Cedric Vivier
made changes -
| Status | In Progress [ 3 ] | Resolved [ 5 ] |
| Resolution | Fixed [ 1 ] |
Initial support landed in rev. 3208 (extending internal macros with "macro grandParent.parent.me:" syntax works)