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 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>10.2. Variables And Functions</title>
<link rel="stylesheet" href="gimp-help-plain.css" type="text/css" />
<link rel="stylesheet" href="gimp-help-screen.css" type="text/css" />
<meta name="generator" content="DocBook XSL Stylesheets V1.66.1" />
<link rel="start" href="index.html" title=" " />
<link rel="up" href="ch02s10.html" title="10. A Script-Fu Tutorial" />
<link rel="prev" href="ch02s10.html" title="10. A Script-Fu Tutorial" />
<link rel="next" href="ch02s10s03.html" title="10.3. Lists, Lists And More Lists" />
</head>
<body>
<div xmlns="" class="navheader">
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center" id="chaptername">10.2. Variables And Functions</th>
</tr>
<tr>
<td width="20%" align="left"><a accesskey="p" href="ch02s10.html">Prev</a> </td>
<th width="60%" align="center" id="sectionname">10.2. Variables And Functions</th>
<td width="20%" align="right"> <a accesskey="n" href="ch02s10s03.html">Next</a></td>
</tr>
</table>
<hr />
</div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="id3316621"></a>10.2. Variables And Functions</h3>
</div>
</div>
</div>
<p>
Now that we know that every Scheme statement is enclosed in
parentheses, and that the function name/operator is listed first,
we need to know how to create and use variables, and how to create
and use functions. We'll start with the variables.
</p>
<div class="simplesect" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a id="id3314026"></a>Declaring Variables</h4>
</div>
</div>
</div>
<p>
Although there are a couple of different methods for declaring
variables, the preferred method is to use the let*
construct. If you're familiar with other programming
languages, this construct is equivalent to defining a list of
local variables and a scope in which they're active. As an
example, to declare two variables, a and b, initialized to 1
and 2, respectively, you'd write:
</p>
<pre class="programlisting">
(let* (
(a 1)
(b 2)
)
(+ a b)
)
</pre>
<p>
or, as one line:
</p>
<pre class="programlisting">
(let* ( (a 1) (b 2) ) (+ a b) )
</pre>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
<table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25">
<img alt="[Note]" src="../images/note.png" />
</td>
<th align="left">Note</th>
</tr>
<tr>
<td colspan="2" align="left" valign="top">
<p>
You'll have to put all of this on one line if you're using the
console window. In general, however, you'll want to adopt a
similar practice of indentation to help make your scripts more
readable. We'll talk a bit more about this in the section on
White Space.
</p>
</td>
</tr>
</table>
</div>
<p>
This declares two local variables, a and b, initializes them,
then prints the sum of the two variables.
</p>
</div>
<div class="simplesect" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a id="id3316712"></a>What Is A Local Variable?</h4>
</div>
</div>
</div>
<p>
You'll notice that we wrote the summation <tt class="code">(+ a b)</tt>
within the parens of the <tt class="code">let*</tt> expression, not after it.
</p>
<p>
This is because the <tt class="code">let*</tt> statement defines an
area in your script in which the declared variables are
usable; if you type the (+ a b) statement after the (let* ...)
statement, you'll get an error, because the declared variables
are only valid within the context of the <tt class="code">let*</tt> statement; they
are what programmers call local variables.
</p>
</div>
<div class="simplesect" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a id="id3316713"></a>The General Syntax Of <tt class="code">let*</tt></h4>
</div>
</div>
</div>
<p>
The general form of a <tt class="code">let*</tt> statement is:
</p>
<pre class="programlisting">
(let* ( <i class="replaceable"><tt>variables</tt></i> ) <i class="replaceable"><tt>expressions</tt></i> )
</pre>
<p>
where variables are declared within parens, e.g., (a 2), and
expressions are any valid Scheme expressions. Remember that
the variables declared here are only valid within the
<tt class="code">let*</tt> statement -- they're local variables.
</p>
</div>
<div class="simplesect" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a id="id3314719"></a>White Space</h4>
</div>
</div>
</div>
<p>
Previously, we mentioned the fact that you'll probably want to
use indentation to help clarify and organize your
scripts. This is a good policy to adopt, and is not a problem
in Scheme -- white space is ignored by the Scheme interpreter,
and can thus be liberally applied to help clarify and organize
the code within a script. However, if you're working in
Script-Fu's Console window, you'll have to enter an entire
expression on one line; that is, everything between the
opening and closing parens of an expression must come on one
line in the Script-Fu Console window.
</p>
</div>
<div class="simplesect" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a id="id3317056"></a>Assigning A New Value To A Variable</h4>
</div>
</div>
</div>
<p>
Once you've initialized a variable, you might need to change
its value later on in the script. Use the set! statement to
change the variable's value:
</p>
<pre class="programlisting">
(let* ( (theNum 10) ) (set! theNum (+ theNum \ theNum)) )
</pre>
<p>
Try to guess what the above statement will do, then go ahead
and enter it in the Script-Fu Console window.
</p>
<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
<table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25">
<img alt="[Note]" src="../images/note.png" />
</td>
<th align="left">Note</th>
</tr>
<tr>
<td colspan="2" align="left" valign="top">
<p>
The "\" indicates that there is no line break. Ignore it (don't
type it in your Script-Fu console and don't hit Enter), just
continue with the next line.
</p>
</td>
</tr>
</table>
</div>
</div>
<div class="simplesect" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a id="id3316869"></a>Functions</h4>
</div>
</div>
</div>
<p>
Now that you've got the hang of variables, let's get to work
with some functions. You declare a function with the following
syntax:
</p>
<pre class="programlisting">
(define (<i class="replaceable"><tt>name</tt></i> <i class="replaceable"><tt>param-list</tt></i>) <i class="replaceable"><tt>expressions</tt></i>)
</pre>
<p>
where <i class="replaceable"><tt>name</tt></i> is the name assigned to
this function, <i class="replaceable"><tt>param-list</tt></i> is a
space-delimited list of parameter names, and
<i class="replaceable"><tt>expressions</tt></i> is a series of
expressions that the function executes when it's called. For
example:
</p>
<pre class="programlisting">
(define (AddXY inX inY) (+ inX inY) )
</pre>
<p>
<tt class="varname">AddXY</tt> is the function's name and
<tt class="varname">inX</tt> and <tt class="varname">inY</tt> are the
variables. This function takes its two parameters and adds
them together.
</p>
<p>
If you've programmed in other imperative languages (like
C/C++, Java, Pascal, etc.), you might notice that a couple of
things are absent in this function definition when compared to
other programming languages.
</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>
First, notice that the parameters don't have any "types"
(that is, we didn't declare them as strings, or integers,
etc.). Scheme is a type-less language. This is handy and
allows for quicker script writing.
</p>
</li>
<li>
<p>
Second, notice that we don't need to worry about how to
"return" the result of our function -- the last statement is
the value "returned" when calling this function. Type the
function into the console, then try something like:
</p>
<pre class="programlisting">
(AddXY (AddXY 5 6) 4)
</pre>
</li>
</ul>
</div>
</div>
</div>
<div class="navfooter">
<hr />
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left"><a accesskey="p" href="ch02s10.html">Prev</a> </td>
<td width="20%" align="center">
<a accesskey="u" href="ch02s10.html">Up</a>
</td>
<td width="40%" align="right"> <a accesskey="n" href="ch02s10s03.html">Next</a></td>
</tr>
<tr>
<td width="40%" align="left" valign="top">10. A Script-Fu Tutorial </td>
<td width="20%" align="center">
<a accesskey="h" href="index.html">Home</a>
</td>
<td width="40%" align="right" valign="top"> 10.3. Lists, Lists And More Lists</td>
</tr>
</table>
</div>
</body>
</html>
|