Namespaces
namespace {identifier}
namespace off
Namespaces are a feature which makes it easier to avoid name conflicts between different labels without having to give them long or cryptic names. They work similarly to C++ namespaces and accomplish this by automatically adding a prefix to all labels declared or accessed within them. This prefix consists of an identifier, followed by an underscore _ . Namespaces can be stacked if desired by enabling the namespace nested setting. When you try to access a label from within a namespace and Asar doesn't find it in there, it automatically looks in the upper namespaces (up to the global namespace).
Use namespace {identifier} to enter a namespace, where identifier can contain any of the following characters: a-z A-Z 0-9 _
Use namespace off to leave the current namespace (or immediately return to the global namespace when nested namespaces are not enabled).
; All of the below is valid
namespace nested on
Main: ; Main
Main2: ; Main2
namespace Deep
Main: ; Deep_Main
namespace Deeper
Main: ; Deep_Deeper_Main
Main3: ; Deep_Deeper_Main3
namespace Deepest
Main: ; Deep_Deeper_Deepest_Main
dl Main ; Deep_Deeper_Deepest_Main
dl Main2 ; Main2
dl Main3 ; Deep_Deeper_Main3
namespace off
dl Main ; Deep_Deeper_Main
namespace off
dl Main ; Deep_Main
namespace off
namespace nested off
namespace TheFirst
Main: ; TheFirst_Main
dl Main ; TheFirst_Main
namespace TheSecond
Main: ; TheSecond_Main
dl Main ; TheSecond_Main
namespace TheThird
Main: ; TheThird_Main
dl Main ; TheThird_Main
namespace off
dl Main ; Main
dl Deep_Main ; Deep_Main
dl Deep_Deeper_Main ; Deep_Deeper_Main
dl Deep_Deeper_Deepest_Main ; Deep_Deeper_Deepest_Main
dl TheFirst_Main ; TheFirst_Main
dl TheSecond_Main ; TheSecond_Main
dl TheThird_Main ; TheThird_Main
pushns / pullns
pushns saves the current namespace. pullns restores the last-pushed value of the namespace.
Global labels
While in a namespace, you can use the keyword global to define labels outside all namespaces. The syntax is global [#]{identifier}:. For example:
namespace NS
global GlobalLabel:
.Sub: ; this is a sublabel of GlobalLabel
LocalLabel:
global #AnotherGlobal: ; this global won't modify the sublabel hierarchy
.Sub: ; this is a sublabel of LocalLabel
namespace off
; these are all valid:
dl NS_LocalLabel
dl NS_LocalLabel_Sub
dl GlobalLabel
dl GlobalLabel_Sub
dl AnotherGlobal
Note that # acts the same way as it does for regular labels. Note that you cannot use the global command with sublabels or macro labels. Outside of a namespace, global acts just like a regular label definition.