File: CastleScript.TCasScriptExpression.html

package info (click to toggle)
castle-game-engine 5.2.0-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 185,428 kB
  • sloc: pascal: 260,781; cpp: 1,363; objc: 713; makefile: 537; xml: 496; sh: 480; php: 4
file content (178 lines) | stat: -rw-r--r-- 12,440 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>Castle Game Engine: CastleScript: Class TCasScriptExpression</title>
<meta name="generator" content="PasDoc 0.13.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>Castle Game Engine</h2><p><a href="introduction.html" class="navigation">Introduction</a></p><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<a name="TCasScriptExpression"></a><h1 class="cio">Class TCasScriptExpression</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td><a class="section" href="#PasDoc-Properties">Properties</a></td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a  href="CastleScript.html">CastleScript</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TCasScriptExpression = class(TObject)</code></p>
<h2 class="description">Description</h2>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TObject</li>
<li class="thisitem">TCasScriptExpression</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><code>function <b><a  href="CastleScript.TCasScriptExpression.html#CoreExecute">CoreExecute</a></b>: <a  href="CastleScript.TCasScriptValue.html">TCasScriptValue</a>; virtual; abstract;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a  href="CastleScript.TCasScriptExpression.html#Execute">Execute</a></b>: <a  href="CastleScript.TCasScriptValue.html">TCasScriptValue</a>;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a  href="CastleScript.TCasScriptExpression.html#TryExecuteMath">TryExecuteMath</a></b>: <a  href="CastleScript.TCasScriptValue.html">TCasScriptValue</a>;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a  href="CastleScript.TCasScriptExpression.html#AsFloat">AsFloat</a></b>(const ADefaultValue: <a  href="CastleUtils.html#Float">Float</a> = 0): <a  href="CastleUtils.html#Float">Float</a>;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a  href="CastleScript.TCasScriptExpression.html#FreeByParentExpression">FreeByParentExpression</a></b>;</code></td>
</tr>
</table>
<a name="PasDoc-Properties"></a><h3 class="summary">Properties</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a  href="CastleScript.TCasScriptExpression.html#Environment">Environment</a></b>: <a  href="CastleScript.TCasScriptEnvironment.html">TCasScriptEnvironment</a> read FEnvironment write FEnvironment;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="protected.gif" alt="Protected" title="Protected"></a></td>
<td class="itemcode"><a name="CoreExecute"></a><code>function <b>CoreExecute</b>: <a  href="CastleScript.TCasScriptValue.html">TCasScriptValue</a>; virtual; abstract;</code></td>
</tr>
<tr><td colspan="2">
<p>
More internal version of Execute.

<p>This doesn't necessarily check floating-point exceptions. Execute actually calls <code>CoreExecute</code> and then ClearExceptions.

<p>Also this doesn't try to convert EIntError and EMathError to <a class="normal" href="CastleScript.ECasScriptAnyMathError.html">ECasScriptAnyMathError</a>. This is done by Execute.

<p>When one <a class="normal" href="CastleScript.html">CastleScript</a> <code>CoreExecute</code> calls another function, it can use <code>CoreExecute</code> instead of Execute. This way only one ClearExceptions will be needed for whole expression execution, instead of doing ClearExceptions after each function handler.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Execute"></a><code>function <b>Execute</b>: <a  href="CastleScript.TCasScriptValue.html">TCasScriptValue</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Execute and calculate this expression.

<p>Returned value is owned by this object. Which should be comfortable for you usually, as you do not have to worry about freeing it. Also, it allows us to make various optimizations to avoid creating/destroying lots of temporary <a class="normal" href="CastleScript.TCasScriptExpression.html">TCasScriptExpression</a> instances during calculation of complex expression.

<p>The disadvantage of this is that returned object value is valid only until you executed this same expression again, or until you freed this expression. If you need to remember the execute result for longer, you have to copy it somewhere. For example you can do

<p></p>

<pre class="longcode">
  <span class="pascal_comment">{ This will always work, thanks to virtual TCasScriptValue.Create
    and AssignValue methods. }</span>
  Copy := TCasScriptValue(ReturnedValue.ClassType)<span class="pascal_float">.</span>Create;
  Copy.AssignValue(ReturnedValue);
</pre>

<p>

<p></p>
<h6 class="description_section">Exceptions raised</h6>
<dl class="exceptions_raised">
<dt><a class="normal" href="CastleScript.ECasScriptError.html">ECasScriptError</a></dt>
<dd><p>Execute is guaranteed to raise an <a class="normal" href="CastleScript.ECasScriptError.html">ECasScriptError</a> exception if some calculation fails because of invalid arguments.

<p>This means that when you run <a class="normal" href="CastleScript.html">CastleScript</a> expression provided by the user, you only have to catch <a class="normal" href="CastleScript.ECasScriptError.html">ECasScriptError</a> to be safe from errors produced by user. No need to catch something more general like Exception class.

<p>Also it's guaranteed that no hanging floating-point errors are left. Normally, there is no guarantee that floating-point errors are raised immediately, they may be raised at the next fp operation (this is needed for fp operations to proceed in parallel, and be much faster). For executing <a class="normal" href="CastleScript.html">CastleScript</a>, Execute calls Math.ClearExceptions(true) to make sure that all floating point errors are caught. This ensures that we can safely execute even invalid expressions (like 'ln(-3)') and get reliable exceptions.

<p>Floating-point errors of course also result in <a class="normal" href="CastleScript.ECasScriptError.html">ECasScriptError</a> descendants. More specifically, EIntError and EMathError result in <a class="normal" href="CastleScript.ECasScriptAnyMathError.html">ECasScriptAnyMathError</a>.</dd>
</dl>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="TryExecuteMath"></a><code>function <b>TryExecuteMath</b>: <a  href="CastleScript.TCasScriptValue.html">TCasScriptValue</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Try to execute expression, or return <code>Nil</code> if a mathematical error occurred within expression. &quot;Math error within expression&quot; means that a <a class="normal" href="CastleScript.ECasScriptAnyMathError.html">ECasScriptAnyMathError</a> exception occurred while calculating expression.

<p>This is useful to secure you against math arguments errors ('ln(-3)', 'sqrt(-3)') but still raises normal exception on other <a class="normal" href="CastleScript.ECasScriptError.html">ECasScriptError</a> errors (like invalid argument type for function).</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="AsFloat"></a><code>function <b>AsFloat</b>(const ADefaultValue: <a  href="CastleUtils.html#Float">Float</a> = 0): <a  href="CastleUtils.html#Float">Float</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Execute expression, return the result as a simple float value. It assumes that the expression is written to always return float. To easily create such expression, use <a class="normal" href="CastleScriptParser.html#ParseFloatExpression">ParseFloatExpression</a>.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="FreeByParentExpression"></a><code>procedure <b>FreeByParentExpression</b>;</code></td>
</tr>
<tr><td colspan="2">
<p>
Call Free, but only if this is not <a class="normal" href="CastleScript.TCasScriptValue.html">TCasScriptValue</a> with OwnedByParentExpression = false. (This cannot be implemented cleanly, as virtual procedure, since it must work when Self is <code>Nil</code>, and then virtual method table is not available of course.)</p>
</td></tr>
</table>
<h3 class="detail">Properties</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a  href="legend.html"><img  src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Environment"></a><code>property <b>Environment</b>: <a  href="CastleScript.TCasScriptEnvironment.html">TCasScriptEnvironment</a> read FEnvironment write FEnvironment;</code></td>
</tr>
<tr><td colspan="2">
<p>
Environment (outside information) for this expression. May be <code>Nil</code>. This object is not owned by <a class="normal" href="CastleScript.TCasScriptExpression.html">TCasScriptExpression</a>, will not be freed by <a class="normal" href="CastleScript.TCasScriptExpression.html">TCasScriptExpression</a> and such.</p>
</td></tr>
</table>
<!-- Piwik -->
<script type="text/javascript">
  var _paq = _paq || [];
  _paq.push(["trackPageView"]);
  _paq.push(["enableLinkTracking"]);

  (function() {
    var u=(("https:" == document.location.protocol) ? "https" : "http") + "://michalis.ii.uni.wroc.pl/piwik-castle-engine/";
    _paq.push(["setTrackerUrl", u+"piwik.php"]);
    _paq.push(["setSiteId", "1"]);
    var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0]; g.type="text/javascript";
    g.defer=true; g.async=true; g.src=u+"piwik.js"; s.parentNode.insertBefore(g,s);
  })();
</script>
<!-- End Piwik Code -->

<noscript>
<!-- Piwik Image Tracker -->
<img src="http://michalis.ii.uni.wroc.pl/piwik-castle-engine/piwik.php?idsite=1&amp;rec=1" style="border:0" alt="" />
<!-- End Piwik -->
</noscript>
<hr noshade size="1"><span class="appinfo"><em>Generated by <a  href="http://pasdoc.sourceforge.net/">PasDoc 0.13.0</a> on 2015-06-15 04:43:11</em>
</span>
</td></tr></table></body></html>