Namespaces in the Alexa Conversations Description Language (ACDL)

In Alexa Conversations Description Language (ACDL) files, you organize name declarations into namespaces. Each ACDL file corresponds to a module that consists of a single namespace declaration.

You can refer to names from other namespaces by using fully qualified names. Alternatively, you can use an import declaration so that you can reference a name without its namespace qualifier.

Declaring namespaces

To declare a namespace, you use the namespace keyword followed by a namespace name and a new line.

   : 'namespace' qualifiedName NEWLINE


Using namespaces

The fully qualified names of all the names declared within a namespace include the namespace as a prefix. For example, in the following ACDL file, the fully qualified name of myAction is org.example.mydialog.myAction.

// file: mydialog.acdl

namespace org.example.mydialog

action Nothing myAction()

Multiple ACDL files can have the same namespace. You don't need to use the namespace qualifier to refer to names declared in different ACDL files with the same namespace.

In the following example, both files (mydialog1.acdl and mydialog2.acdl) have the same namespace.

// file: mydialog1.acdl

namespace org.example.mydialog

nameA = "hello ACDL"

// file: mydialog2.acdl

namespace org.example.mydialog

nameB = nameA // nameA is declared in mydialog1.acdl and referenced without the namespace qualifier.

Importing namespaces

To reference a name without its namespace qualifier, you use an import declaration.

Without using an import declaration, the only way to refer to a name declared in another namespace is by using its fully qualified name.

There are two types of import declarations:

Single import declaration

You can import a single name by giving its fully qualified name. This way, you don't need to use the namespace qualifier within the ACDL file in which the import declaration appears.

The imported name must be the fully qualified name of an action declaration, a type declaration, a named expression, or dialog declarations. If the imported name doesn't exist, there is a compilation error.

If you import different declarations of the same name without their namespace qualifiers into the same ACDL file, you must reference the names with their fully qualified names.

The following is an example of single import declaration.

namespace org.example.mydialog


The following example shows a duplicate import declaration. Expression nameB = nameA causes a compilation error because the compiler can't uniquely resolve nameA.

// This example causes a compiler error.

// file: mydialog1.acdl
namespace org.example.mydialog1

nameA = "hello ACDL1"

// file: mydialog2.acdl
namespace org.example.mydialog2

nameA = "hello ACDL2"

// file: mydialog.acdl
namespace org.example.mydialog

import org.example.mydialog1.nameA
import org.example.mydialog2.nameA

nameB = nameA

Wildcard import declaration

You can import an entire namespace by using a wildcard import declaration. This way, you can reference all names declared in the namespace without the namespace qualifier in the ACDL file in which the import declaration appears.

The following is an example of a wildcard import declaration.

namespace org.example.mydialog


type Person {
  String firstName
  String lastName
  Number age

In the previous example, must be a valid namespace; otherwise, it causes a compilation error. The String and Number types are declared in the namespace, so you can refer to them without namespace qualifiers.

Apparent hierarchies of namespaces

Namespaces are not related to each other, even if the namespace names appear to be hierarchal.

In the following example, importing* imports all the names declared in the namespace, but it doesn't import names declared in the namespace. You must use separate import declarations to import names from both namespaces.

namespace org.example.mydialog