Artifact e37c83f645af4d82b55a33bb252fdb0194ef1a77
1 /**
2 * Authors: k.inaba
3 * License: NYSL 0.9982 http://www.kmonos.net/nysl/
4 *
5 * Definition of constants related to the layers.
6 */
7 module polemy.layer;
8 import polemy._common;
9
10 /// Type for the layer ID
11
12 alias string Layer;
13
14 enum : Layer
15 {
16 LiftLayer = "(lift)", /// Predefined layer for storing lift functions
17 NoopLayer = "(noop)", /// Predefined layer for just allocating a slot for table
18 ValueLayer = "@value", /// Predefined layer for normal run
19 MacroLayer = "@macro", /// Predefined layer for macro run (@lay() changes layer)
20 RawMacroLayer = "(rawmacro)", /// Predefined layer for macro run (@lay() becomes AST)
21 }
22
23 /// True if it is a user-defined layer
24
25 bool isUserDefinedLayer( Layer lay )
26 {
27 return lay!=NoopLayer && lay!=LiftLayer && lay!=ValueLayer && lay!=MacroLayer && lay!=RawMacroLayer;
28 }
29
30 unittest
31 {
32 assert( !isUserDefinedLayer(NoopLayer) );
33 assert( !isUserDefinedLayer(LiftLayer) );
34 assert( !isUserDefinedLayer(ValueLayer) );
35 assert( !isUserDefinedLayer(MacroLayer) );
36 assert( !isUserDefinedLayer(RawMacroLayer) );
37 assert( isUserDefinedLayer("@foo") );
38 }
39
40 /// True if it is macro-like layer that basically generates syntax tree
41
42 bool isASTLayer( Layer lay )
43 {
44 return lay==MacroLayer || lay==RawMacroLayer;
45 }
46
47 unittest
48 {
49 assert( !isASTLayer(NoopLayer) );
50 assert( !isASTLayer(LiftLayer) );
51 assert( !isASTLayer(ValueLayer) );
52 assert( isASTLayer(MacroLayer) );
53 assert( isASTLayer(RawMacroLayer) );
54 }
55
56 /// True if in the specified layer @lay(...) has no effect and merely produces a syntax tree
57
58 bool isNoLayerChangeLayer( Layer lay )
59 {
60 return lay==RawMacroLayer;
61 }
62
63 unittest
64 {
65 assert( !isNoLayerChangeLayer(NoopLayer) );
66 assert( !isNoLayerChangeLayer(LiftLayer) );
67 assert( !isNoLayerChangeLayer(ValueLayer) );
68 assert( !isNoLayerChangeLayer(MacroLayer) );
69 assert( isNoLayerChangeLayer(RawMacroLayer) );
70 }
71
72 /// True if do macro expanstion
73
74 bool isMacroLayer( Layer lay )
75 {
76 return lay==MacroLayer || lay==RawMacroLayer;
77 }
78
79 unittest
80 {
81 assert( !isMacroLayer(NoopLayer) );
82 assert( !isMacroLayer(LiftLayer) );
83 assert( !isMacroLayer(ValueLayer) );
84 assert( isMacroLayer(MacroLayer) );
85 assert( isMacroLayer(RawMacroLayer) );
86 }