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. "Math error within expression" 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&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>
|