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.