Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
VariableReference.cs
1using System;
2using System.Collections.Generic;
8
9namespace Waher.Script.Model
10{
15 {
16 private readonly bool onlyVariables;
17
27 {
28 this.onlyVariables = false;
29 }
30
42 {
43 this.onlyVariables = OnlyVariables;
44 }
45
50 public bool OnlyVariables => this.onlyVariables;
51
58 {
59 if (Variables.TryGetVariable(this.variableName, out Variable v))
60 return v.ValueElement;
61
62 if (!this.onlyVariables)
63 {
64 if (Expression.TryGetConstant(this.variableName, Variables, out IElement ValueElement))
65 return ValueElement;
66
67 if (Types.IsRootNamespace(this.variableName))
68 return new Namespace(this.variableName);
69
70 ValueElement = Expression.GetFunctionLambdaDefinition(this.variableName, this.Start, this.Length, this.Expression);
71 if (!(ValueElement is null))
72 return ValueElement;
73
74 if (Types.TryGetQualifiedNames(this.variableName, out string[] QualifiedNames))
75 {
76 if (QualifiedNames.Length == 1)
77 {
78 Type T = Types.GetType(QualifiedNames[0]);
79
80 if (!(T is null))
81 return new TypeValue(T);
82 else
83 return new Namespace(QualifiedNames[0]);
84 }
85 else
86 {
87 int i, c = QualifiedNames.Length;
88 IElement[] Elements = new IElement[c];
89
90 for (i = 0; i < c; i++)
91 Elements[i] = new StringValue(QualifiedNames[i]);
92
93 return new ObjectVector(Elements);
94 }
95 }
96
97 if (Variables.TryGetVariable("Global", out v) &&
98 v.ValueObject is Variables GlobalVariables &&
99 GlobalVariables.TryGetVariable(this.variableName, out v))
100 {
101 return v.ValueElement;
102 }
103 }
104
105 throw new ScriptRuntimeException("Variable not found: " + this.variableName, this);
106 }
107
114 public override PatternMatchResult PatternMatch(IElement CheckAgainst, Dictionary<string, IElement> AlreadyFound)
115 {
116 if (AlreadyFound.TryGetValue(this.variableName, out IElement E) && !E.Equals(CheckAgainst))
117 return PatternMatchResult.NoMatch;
118
119 AlreadyFound[this.variableName] = CheckAgainst;
120
121 return PatternMatchResult.Match;
122 }
123
131 {
132 if (VariableName == this.variableName)
133 return new ConstantElement(DoubleNumber.OneElement, this.Start, this.Length, this.Expression);
134 else
135 return new ConstantElement(DoubleNumber.ZeroElement, this.Start, this.Length, this.Expression);
136 }
137
141 public string DefaultVariableName => this.variableName;
142
144 public override bool Equals(object obj)
145 {
146 return obj is VariableReference O &&
147 this.onlyVariables.Equals(O.onlyVariables) &&
148 base.Equals(obj);
149 }
150
152 public override int GetHashCode()
153 {
154 int Result = base.GetHashCode();
155 Result ^= Result << 5 ^ this.onlyVariables.GetHashCode();
156 return Result;
157 }
158
159 }
160}
Static class that dynamically manages types and interfaces available in the runtime environment.
Definition: Types.cs:14
static Type GetType(string FullName)
Gets a type, given its full name.
Definition: Types.cs:41
static bool TryGetQualifiedNames(string UnqualifiedName, out string[] QualifiedNames)
Gets an array (possibly null) of qualified names relating to an unqualified name.
Definition: Types.cs:243
static bool IsRootNamespace(string Name)
Checks if a name is a root namespace.
Definition: Types.cs:184
Class managing a script expression.
Definition: Expression.cs:39
static bool TryGetConstant(string Name, Variables Variables, out IElement ValueElement)
Tries to get a constant value, given its name.
Definition: Expression.cs:3307
Represents a constant element value.
readonly string variableName
Name of variable being referenced by the node.
Base class for all nodes in a parsed script tree.
Definition: ScriptNode.cs:69
int Length
Length of expression covered by node.
Definition: ScriptNode.cs:101
int Start
Start position in script expression.
Definition: ScriptNode.cs:92
Represents a variable reference.
bool OnlyVariables
If only values of variables should be returned (true), or if constants and namespaces should also be ...
override IElement Evaluate(Variables Variables)
Evaluates the node, using the variables provided in the Variables collection.
ScriptNode Differentiate(string VariableName, Variables Variables)
Differentiates a script node, if possible.
VariableReference(string VariableName, bool OnlyVariables, int Start, int Length, Expression Expression)
Represents a variable reference.
override PatternMatchResult PatternMatch(IElement CheckAgainst, Dictionary< string, IElement > AlreadyFound)
Performs a pattern match operation.
VariableReference(string VariableName, int Start, int Length, Expression Expression)
Represents a variable reference.
string DefaultVariableName
Default variable name, if any, null otherwise.
static readonly DoubleNumber ZeroElement
0
Definition: DoubleNumber.cs:16
static readonly DoubleNumber OneElement
1
Definition: DoubleNumber.cs:21
Contains information about a variable.
Definition: Variable.cs:10
Collection of variables.
Definition: Variables.cs:25
virtual bool TryGetVariable(string Name, out Variable Variable)
Tries to get a variable object, given its name.
Definition: Variables.cs:52
Basic interface for all types of elements.
Definition: IElement.cs:20
Base interface for lambda expressions.
PatternMatchResult
Status result of a pattern matching operation.
Definition: ScriptNode.cs:17