1// empty lines are preserved
2
3// double-wrapped at-sigils work like single-wrapped
4@@STRING@@
5@${STRING}@
6
7// at-var lookup happens inside dollar-curly before dollar-curly lookup
8${@STRING_PROXY@}
9
10// expanded variables are treated as strings and can be re-substituted
11@STRING_AT@
12${STRING_AT}
13$@STRING_CURLY@
14$${STRING_CURLY}
15${STRING_VAR}
16@STRING_VAR@
17${DOLLAR}{${STRING}}
18@DOLLAR@{${STRING}}
19@DOLLAR@{@STRING@}
20
21// nested dollar-curly expansion from the inside out
22${STRING${UNDERSCORE}PROXY}
23${STRING@UNDERSCORE@PROXY}
24
25// nested dollar-curly — only completed brace blocks are expanded
26${NEST${UNDERSCORE}PROXY}
27${NEST${${NEST_UNDERSCORE${UNDERSCORE}PROXY}}PROXY}
28
29// backslash is invalid in at-var names — preserved as literal
30\@STRING\@
31
32// backslash does not affect dollar-curly expansion
33\${STRING}
34
35// backslash before opening brace breaks dollar-curly identification
36$\{STRING}
37
38// bare at-sigils pass through unchanged with no variable map
39#define AT @
40#define ATAT @@
41#define ATATAT @@@
42#define ATATATAT @@@@