Annotation of OpenXM/src/asir-doc/parts/asir.texi, Revision 1.12
1.12 ! ohara 1: @comment $OpenXM: OpenXM/src/asir-doc/parts/asir.texi,v 1.11 2003/12/01 02:13:38 takayama Exp $
1.3 noro 2: \BJP
1.1 noro 3: @node $B%f!<%68@8l(B Asir,,, Top
4: @chapter $B%f!<%68@8l(B Asir
1.3 noro 5: \E
6: \BEG
7: @node User language Asir,,, Top
8: @chapter User language @b{Asir}
9: \E
1.1 noro 10:
11: @noindent
1.3 noro 12: \BJP
1.1 noro 13: @b{Asir} $B$NAH$_9~$_H!?t$O(B, $B0x?tJ,2r(B, GCD $B$J$I$N7W;;$r9T$&$b$N(B, $B%U%!(B
14: $B%$%kF~=PNO$r9T$&$b$N(B, $B$"$k$$$O?t<0$N0lIt$r<h$j=P$9$b$N$J$I$5$^$6$^$J$b$N(B
15: $B$,MQ0U$5$l$F$$$k$,(B, $B%f!<%6$,<B:]$K9T$$$?$$$3$H$r<B9T$5$;$k$?$a$K$O0l(B
16: $BHL$K$O%f!<%68@8l$K$h$k%W%m%0%i%`$r=q$/I,MW$,$"$k(B. $B%f!<%68@8l$b(B
17: @b{Asir} $B$H8F$P$l$k(B. $B0J2<$G$O(B, $B%f!<%68@8l$NJ8K!5,B'$*$h$S<B:]$N%f!<(B
18: $B%68@8l%W%m%0%i%`$rNc$H$7$?%W%m%0%i%`$N=q$-J}$K$D$$$F=R$Y$k(B.
1.3 noro 19: \E
20: \BEG
21: @b{Asir} provides many built-in functions, which perform algebraic
22: computations, e.g., factorization and GCD computation, file I/O,
23: extract a part of an algebraic expression, etc.
24: In practice, you will often encounter a specific problem for which
25: @b{Asir} does not provide a direct solution. For such cases, you have
26: to write a program in a certain user language. The user language for
27: @b{Asir} is also called @b{Asir}. In the following, we describe the
28: Syntax and then show how to write a user program by several examples.
29: \E
1.1 noro 30:
31: @menu
1.3 noro 32: \BJP
1.1 noro 33: * $BJ8K!(B (C $B8@8l$H$N0c$$(B)::
34: * $B%f!<%6Dj5AH!?t$N=q$-J}(B::
1.3 noro 35: \E
36: \BEG
37: * Syntax (Difference from C language)::
38: * Writing user defined functions::
39: \E
1.1 noro 40: @end menu
41:
42:
1.3 noro 43: \BJP
1.1 noro 44: @node $BJ8K!(B (C $B8@8l$H$N0c$$(B),,, $B%f!<%68@8l(B Asir
45: @section $BJ8K!(B (C $B8@8l$H$N0c$$(B)
1.3 noro 46: \E
47: \BEG
48: @node Syntax (Difference from C language),,, User language Asir
49: @section Syntax --- Difference from C language
50: \E
1.1 noro 51:
52: @noindent
1.3 noro 53: \BJP
1.1 noro 54: @b{Asir} $B$NJ8K!$O(B C $B8@8l$K=`5r$7$F$$$k(B.
55: $B$*$b$JAj0cE@$O<!$NDL$j$G$"$k(B. $B0J2<$G(B, $BJQ?t$H$O(B @b{Asir} $B$K$*$1$k(B
56: $B%W%m%0%i%`MQ$NJQ?t(B, $B$9$J$o$ABgJ8;z$G;O$^$kJ8;zNs$r0UL#$9$k$3$H$H$9$k(B.
1.3 noro 57: \E
58: \BEG
59: The syntax of @b{Asir} is based on C language.
60: Main differences are as follows.
61: In this section, a variable does not mean an indeterminate, but
62: a program variable which is written by a string which begins with a
63: capital alphabetical letter in @b{Asir}.
64: \E
1.1 noro 65:
66: @itemize @bullet
67: @item
1.3 noro 68: \JP $BJQ?t$N7?$,$J$$(B.
69: \EG No types for variables.
1.4 noro 70: @*
1.3 noro 71: \BJP
1.1 noro 72: $B4{$K@bL@$7$?$H$*$j(B, @b{Asir} $B$G07$o$l$kBP>]<+?H$OA4$F2?$i$+$N7?(B
73: $B$r;}$C$F$$$k(B. $B$7$+$7(B, $B%W%m%0%i%`JQ?t<+BN$O(B, $B$I$N$h$&$JBP>]$G$b(B
74: $BBeF~$G$-$k$H$$$&0UL#$G7?$,$J$$$N$G$"$k(B.
1.3 noro 75: \E
76: \BEG
77: As is already mentioned, any object in @b{Asir} has their respective
78: types. A program variable, however, is type-less, that is, any typed
79: object can be assigned to it.
80: \E
1.1 noro 81:
82: @example
83: [0] A = 1;
84: 1
85: [1] type(A);
86: 1
87: [2] A = [1,2,3];
88: [1,2,3]
89: [3] type(A);
90: 4
91: @end example
92:
93: @item
1.3 noro 94: \BJP
1.1 noro 95: $BH!?tFb$NJQ?t$O(B, $B%G%U%)%k%H$G$O2>0z?t$r$3$a$F$9$Y$F6I=jJQ?t(B.
1.4 noro 96: @*
1.1 noro 97: $B$?$@$7(B, @code{extern} $B@k8@$5$l$?JQ?t$O(B, $B%H%C%W%l%Y%k$K$*$1$kBg0hJQ?t$H$J$k(B.
98: $B$9$J$o$A(B, $BJQ?t$N%9%3!<%W$OBg0hJQ?t$H6I=jJQ?t$N(B 2 $B<oN`$KC1=c2=$5$l$F$$$k(B.
99: $B%H%C%W%l%Y%k(B, $B$9$J$o$A%W%m%s%W%H$KBP$7$FF~NO$5$l$?JQ?t$OA4$FBg0hJQ?t(B
100: $B$H$7$FEPO?$5$l$k(B. $B$^$?H!?tFb$G$O<!$N$$$:$l$+$H$J$k(B.
1.3 noro 101: \E
102: \BEG
103: Variables, together with formal parameters, in a function (procedure)
104: are all local to the function by default.
1.4 noro 105: @*
1.3 noro 106: Variables can be global at the top level,
107: if they are declared with the key word @code{extern}.
108: Thus, the scope rule of @b{Asir} is very simple.
109: There are only two types of variables: global variables and local
110: variables.
111: A name that is input to the @b{Asir}'s prompt at the top level
112: is denotes a global variable commonly accessed at the top level.
113: In a function (procedure) the following rules are applied.
114: \E
1.1 noro 115:
116: @enumerate
117: @item
1.3 noro 118: \BJP
1.1 noro 119: $BH!?t$,Dj5A$5$l$k%U%!%$%k$K$*$$$F(B, $B$=$NH!?tDj5A0JA0$K(B, $B$"$k(B
120: $BJQ?t$,(B @code{extern} $B@k8@$5$l$F$$$k>l9g(B, $BH!?tFb$N$=$NJQ?t$bBg0hJQ?t(B
121: $B$H$7$F07$o$l$k(B.
1.3 noro 122: \E
123: \BEG
124: If a variable is declared as global by an @code{extern} statement in
125: a function, the variable used in that function denotes a global variable
126: at the top level.
127: Furthermore, if a variable in a function is preceded by an @code{extern}
128: declaration outside the function but in a file where the function is
129: defined, all the appearance of that variable in the same file denote
130: commonly a global variable at the top level.
131: \E
132:
133: @item
134: \JP @code{extern} $B@k8@$5$l$F$$$J$$JQ?t$O$=$NH!?t$K6I=jE*$H$J$k(B.
135: \BEG
136: A variable in a function is local to that function, if it is not declared
137: as global by an @code{extern} declaration.
138: \E
1.1 noro 139: @end enumerate
140:
141: @example
142: % cat afo
143: def afo() @{ return A;@}
144: extern A$
145: def bfo() @{ return A;@}
146: end$
147: % asir
148: [0] load("afo")$
149: [5] A = 1;
150: 1
151: [6] afo();
152: 0
153: [7] bfo();
154: 1
155: @end example
156:
157: @item
1.3 noro 158: \JP $B%W%m%0%i%`JQ?t$OBgJ8;z$G;O$^$j(B, $BITDj85(B, $BH!?t$O>.J8;z$G;O$^$k(B.
159: \EG Program variables and algebraic indeterminates are distinguished in @b{Asir}.
1.4 noro 160: @*
1.3 noro 161: \BJP
1.1 noro 162: $B$3$NE@$O(B, $B4{B8$N?t<0=hM}%7%9%F%`$N$[$H$s$I$H0[$J$kE@$G$"$k(B. @b{Asir}
163: $B$,$3$N;EMM$r:NMQ$7$?$N$O(B, $B%f!<%6$,ITDj85$N$D$b$j$G;HMQ$7$?JQ?t$K(B
164: $B$J$s$i$+$NCM$,BeF~$5$l$F$$$?>l9g$K:.Mp$r>7$/(B, $B$H$$$&(B, $B4{B8$N(B
165: $B%7%9%F%`$K$"$j$,$A$J>u67$rHr$1$k$?$a$G$"$k(B.
1.3 noro 166: \E
167: \BEG
168: The names of program variables must begin with a capital letter;
169: while the names of indeterminates and functions must begin with
170: a small letter.
171:
172: This is an unique point that differs from almost all other existing
173: computer algebra systems. The distinction between program variables
174: and indeterminates is adopted to avoid the possible and usual confusion
175: that may arise in a situation where a name is used as an indeterminate
176: but, as it was, the name has been already assigned some value.
177: To use different type of letters, capital and small, was a matter of
178: syntactical convention like Prolog, but it is convenient to distinguish
179: variables and indeterminates in a program.
180: \E
181:
182: @item
183: \JP @code{switch} $BJ8(B, @code{goto} $B$,$J$$(B.
184: \EG No @code{switch} statements, and @code{goto} statements.
1.4 noro 185: @*
1.3 noro 186: \JP @code{goto} $B$,$J$$$?$a(B, $BB?=E%k!<%W$r0lEY$KH4$1$k$N$,$d$dJ#;($K$J$k>l9g$,$"$k(B.
187: \EG Lack of @code{goto} statement makes it rather bothering to exit from within multiple loops.
188:
189: @item
190: \BJP
191: $B%3%s%^<0$O(B, @code{for (A;B;C)} $B$^$?$O(B, @code{while(A)} $B$N(B @code{A},
192: @code{B}, @code{C} $B$K$N$_;H$&$3$H$,$G$-$k(B.
193: \E
194: \BEG
195: Comma expressions are allowed only in @code{A}, @code{B} and @code{C}
196: of the constructs @code{for (A;B;C)} or @code{while(A)}.
197: \E
1.4 noro 198: @*
1.3 noro 199: \JP $B$3$l$O(B, $B%j%9%H$r@5<0$J%*%V%8%'%/%H$H$7$F2C$($?$3$H$K$h$k(B.
200: \EG This limitation came from adopting lists as legal data objects for @b{Asir}.
1.1 noro 201:
202: @end itemize
203:
204: @noindent
1.3 noro 205: \JP $B0J>e$O@)8B$G$"$k$,(B, $B3HD%$H$7$F$O<!$NE@$,5s$2$i$l$k(B.
206: \EG The above are limitations; extensions are listed as follows.
1.1 noro 207:
208: @itemize @bullet
209: @item
1.3 noro 210: \JP $BM-M}<0$KBP$9$k7W;;$r(B, $BDL>o$N(B C $B$K$*$1$k7W;;$HF1MM$K$G$-$k(B.
211: \BEG
212: Arithmetic for rational expressions can be done in the
213: same manner as is done for numbers in C language.
214: \E
1.1 noro 215:
216: @item
1.3 noro 217: \JP $B%j%9%H$,07$($k(B.
218: \EG Lists are available for data objects.
1.1 noro 219:
1.3 noro 220: \BJP
1.1 noro 221: $B9=B$BN$rMQ$$$k$^$G$b$J$$MWAG$N=89gBN$r(B, $B%j%9%H$GI=$9$3$H$,$G$-(B,
222: C $B$GD>@\=q$/>l9g$KHf3S$7$F%W%m%0%i%`$,C;$/(B, $BFI$_$d$9$/=q$1$k(B.
1.3 noro 223: \E
224: \BEG
225: Lists are conveniently used to represent a certain collection of objects.
226: Use of lists enables to write programs more easily, shorter and more
227: comprehensible than use of structure like C programs.
228: \E
1.2 noro 229:
230: @item
1.3 noro 231: \JP $B%f!<%6Dj5AH!?t$K$*$1$k%*%W%7%g%s;XDj(B.
232: \EG Options can be specified in calling user defined functions.
1.2 noro 233:
1.3 noro 234: \JP $B$3$l$K4X$7$F$O(B, @xref{$B%*%W%7%g%s;XDj(B}.
235: \EG @xref{option}.
1.1 noro 236: @end itemize
237:
1.3 noro 238: \BJP
1.1 noro 239: @node $B%f!<%6Dj5AH!?t$N=q$-J}(B,,, $B%f!<%68@8l(B Asir
240: @section $B%f!<%6Dj5AH!?t$N=q$-J}(B
1.3 noro 241: \E
242: \BEG
243: @node Writing user defined functions,,, User language Asir
244: @section Writing user defined functions
245: \E
1.1 noro 246:
247: @menu
1.3 noro 248: \BJP
1.1 noro 249: * $B%f!<%6Dj5AH!?t(B::
250: * $BJQ?t$*$h$SITDj85(B::
251: * $B0z?t(B::
252: * $B%3%a%s%H(B::
253: * $BJ8(B::
254: * return $BJ8(B::
255: * if $BJ8(B::
256: * $B%k!<%W(B break return continue::
1.5 noro 257: * $B9=B$BNDj5A(B::
1.1 noro 258: * $B$5$^$6$^$J<0(B::
259: * $B%W%j%W%m%;%C%5(B::
1.2 noro 260: * $B%*%W%7%g%s;XDj(B::
1.8 takayama 261: * $B%b%8%e!<%k(B::
1.3 noro 262: \E
263: \BEG
264: * User defined functions::
265: * variables and indeterminates::
266: * parameters and arguments::
267: * comments::
268: * statements::
269: * return statement::
270: * if statement::
271: * loop break return continue::
1.5 noro 272: * structure definition::
1.3 noro 273: * various expressions::
274: * preprocessor::
275: * option::
1.8 takayama 276: * module::
1.3 noro 277: \E
1.1 noro 278: @end menu
279:
1.3 noro 280: \BJP
1.1 noro 281: @node $B%f!<%6Dj5AH!?t(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
282: @subsection $B%f!<%6Dj5AH!?t(B
1.3 noro 283: \E
284: \BEG
285: @node User defined functions,,, Writing user defined functions
286: @subsection User defined functions
287: \E
1.1 noro 288:
289: @noindent
1.3 noro 290: \BJP
1.1 noro 291: $B%f!<%6$K$h$kH!?t$NDj5A$O(B @samp{def} $BJ8$G9T$&(B. $BJ8K!%(%i!<$OFI$_9~$_;~$K(B
292: $B$"$kDxEY%A%'%C%/$5$l(B, $B$*$*$h$=$N>l=j$,I=<($5$l$k(B.
293: $B4{$K(B($B0z?t$N8D?t$K4X78$J$/(B)$BF1L>$NH!?t$,Dj5A$5$l$F$$$k>l9g$K$O(B,
294: $B$=$NH!?t$O:FDj5A$5$l$k(B. @code{ctrl()} $BH!?t$K$h$j(B @code{verbose} $B%U%i%0(B
295: $B$,(B on $B$K$J$C$F$$$k>l9g(B,
1.3 noro 296: \E
297: \BEG
298: To define functions by an user himself, @samp{def} statement must be used.
299: Syntactical errors are detected in the parsing phase
300: of @b{Asir}, and notified with an indication of where @b{Asir} found the error.
301: If a function with the same name is already defined (regardless to
302: its arity,) the new definition will override the old one, and the user
303: will be told by a message,
304: \E
1.1 noro 305:
306: @example
307: afo() redefined.
308: @end example
309:
310: @noindent
1.3 noro 311: \BJP
1.1 noro 312: $B$H$$$&%a%C%;!<%8$,I=<($5$l$k(B. $B$"$kH!?t$NDj5A$K$*$$$F(B, $B$^$@L$Dj5A$NH!?t(B
313: $B$r8F$S=P$7$F$$$F$b(B, $BDj5A;~$K$O%(%i!<$K$J$i$J$$(B. $B<B9T;~$KL$Dj5A$NH!?t(B
314: $B$r8F$S=P$=$&$H$7$?>l9g$K%(%i!<$H$J$k(B.
1.3 noro 315: \E
316: \BEG
317: on the screen when a flag @code{verbose} is set to a non-zero value by
318: @code{ctrl()}.
319: Recursive definition, and of course, recursive use of functions are
320: available.
321: A call for an yet undefined function in a function definition is not
322: detected as an error. An error will be detected at execution of the
323: call of that yet undefined function.
324: \E
1.1 noro 325: @example
326: @tex
327: /* $X!$ */
328: @end tex
329:
330: def f(X) @{
331: if ( !X )
332: return 1;
333: else
334: return X * f(X-1);
335: @}
336:
337: @tex
1.3 noro 338: \JP /* ${_i}C_j ( 0 \le i \le N, 0 \le j \le i )$ */
339: \EG /* ${_i}C_j ( 0 \le i \le N, 0 \le j \le i )$ */
1.1 noro 340: @end tex
341:
342: def c(N)
343: @{
344: A = newvect(N+1); A[0] = B = newvect(1); B[0] = 1;
345: for ( K = 1; K <= N; K++ ) @{
346: A[K] = B = newvect(K+1); B[0] = B[K] = 1;
347: for ( P = A[K-1], J = 1; J < K; J++ )
348: B[J] = P[J-1]+P[J];
349: @}
350: return A;
351: @}
1.9 ohara 352:
353: @tex
354: /* $A+B$ */
355: @end tex
356:
357: def add(A,B)
358: "add two numbers."
359: @{
360: return A+B;
361: @}
1.1 noro 362: @end example
363:
364: @noindent
1.3 noro 365: \BJP
1.1 noro 366: 2 $B$DL\$NNc$G$O(B, $BD9$5(B @code{N+1} $B$N%Y%/%H%k(B (@code{A}$B$H$9$k(B) $B$,JV$5$l$k(B.
367: @code{A[I]} $B$OD9$5(B @code{I+1} $B$NG[Ns$G$"$j(B, $B$=$N$=$l$>$l$NMWAG$,(B
1.3 noro 368: \E
369: \BEG
370: In the second example, @code{c(N)} returns a vector, say @code{A}, of length
371: @code{N+1}. @code{A[I]} is a vector of length @code{I+1}, and
372: each element is again a vector which contains
373: \E
1.10 ohara 374: @iftex
375: @tex
376: ${_I}C_J$
377: @end tex
378: @end iftex
379: @ifinfo
380: ICJ
381: @end ifinfo
382: \JP $B$rMWAG$H$9$kG[Ns$G$"$k(B.
383: \EG as its elements.
1.9 ohara 384:
385: @noindent
386: \BJP
387: 3 $B$DL\$NNc$G$O(B, $B0z?tJB$S$N$"$H$KJ8;zNs$,CV$+$l$F$$$k$,!"$3$l$O(B
388: Emacs-Lisp $B$N4X?tDj5A$KN`;w$N5!G=$G!"%X%k%WMQ$NJ8;zNs$G$"$k!#(B
389: $B$3$NNc$N>l9g!"(B@code{help(add)} $B$K$h$C$F$3$NJ8;zNs$,=PNO$5$l$k!#(B
390: \E
391: @table @t
392: \JP @item $B;2>H(B
393: \EG @item References
394: @fref{help}.
395: @end table
1.1 noro 396:
397: @noindent
1.3 noro 398: \BJP
1.1 noro 399: $B0J2<$G$O(B, C $B$K$h$k%W%m%0%i%_%s%0$N7P83$,$J$$?M$N$?$a$K(B, @b{Asir} $B8@8l(B
400: $B$K$h$k%W%m%0%i%`$N=q$-J}$r2r@b$9$k(B.
1.3 noro 401: \E
402: \BEG
403: In the following, the manner of writing @b{Asir} programs is exhibited
404: for those who have no experience in writing C programs.
405: \E
1.1 noro 406:
1.3 noro 407: \BJP
1.1 noro 408: @node $BJQ?t$*$h$SITDj85(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
409: @subsection $BJQ?t$*$h$SITDj85(B
1.3 noro 410: \E
1.1 noro 411:
412: @noindent
1.3 noro 413: \BJP
1.1 noro 414: $B4{$K=R$Y$?DL$j(B, @b{Asir} $B$K$*$$$F$O%W%m%0%i%`JQ?t$HITDj85$rL@3N$K(B
415: $B6hJL$7$F$$$k(B.
1.3 noro 416: \E
417: \BEG
418: @node variables and indeterminates,,, Writing user defined functions
419: @subsection variables and indeterminates
420: \E
1.1 noro 421:
422: @table @b
1.3 noro 423: \BJP
1.1 noro 424: @item $BJQ?t(B
425: $BBgJ8;z$G;O$^$j(B, $B%"%k%U%!%Y%C%H(B, $B?t;z(B, @samp{_} $B$+$i$J$kJ8;zNs(B
1.3 noro 426: \E
427: \BEG
428: @item variables (program variables)
429: A program variable is a string that begins with a capital
430: alphabetical letter followed by any numbers of alphabetical letters,
431: digits and @samp{_}.
432: \E
1.1 noro 433:
1.3 noro 434: \BJP
1.1 noro 435: $BJQ?t$"$k$$$O%W%m%0%i%`JQ?t$H$O(B, @b{Asir} $B$N$5$^$6$^$J7?$NFbIt7A<0$r(B
436: $B3JG<$9$k$?$a$NH"$G$"$j(B, $B3JG<$5$l$?FbIt7A<0$,(B, $B$3$NJQ?t$NCM$G$"$k(B. $BJQ(B
437: $B?t$,<0$NMWAG$H$7$FI>2A$5$l$k;~$O(B, $B$=$3$K<}$a$i$l$?CM$KCV$-49$($i$l$k(B.
438: $B$9$J$o$A(B, $BFbIt7A<0$NCf$K$O%W%m%0%i%`JQ?t$O8=$l$J$$(B. $BJQ?t$OA4$F(B 0 $B$G(B
439: $B=i4|2=$5$l$F$$$k(B.
1.3 noro 440: \E
441: \BEG
442: A program variable is thought of a box (a carrier) which can contain
443: @b{Asir} objects of various types. The content is called the `value'
444: of that variable. When an expression in a program is to be evaluated,
445: the variable appearing in the expression is first replaced by its value
446: and then the expression is evaluated to some value and stored in
447: the memory. Thus, no program variable appears in objects in the
448: internal form.
449: All the program variables are initialized to the value 0.
450: \E
1.1 noro 451:
452: @example
453: [0] X^2+X+1;
454: 1
455: [1] X=2;
456: 2
457: [2] X^2+X+1;
458: 7
459: @end example
460:
1.3 noro 461: \BJP
1.1 noro 462: @item $BITDj85(B
1.12 ! ohara 463: $B>.J8;z$G;O$^$j(B, $B%"%k%U%!%Y%C%H(B, $B?t;z(B, @samp{_} $B$+$i$J$kJ8;zNs(B,
! 464: $B$^$?$O%7%s%0%k%/%*!<%H$G0O$^$l$?J8;zNs(B.
1.1 noro 465:
466: $BITDj85$H$O(B, $BB?9`<04D$r9=@.$9$k:]$KE:2C$5$l$kJQ?t$r$$$&(B. @b{Asir} $B$K(B
467: $B$*$$$F$O(B, $BITDj85$OCM$r$b$?$J$$D61[E*$J85$G$"$j(B, $BITDj85$X$NCM$NBeF~$O(B
468: $B5v$5$l$J$$(B.
1.3 noro 469: \E
470: \BEG
471: @item indeterminates
472: An indeterminate is a string that begins with a small alphabetical letter
473: followed by any numbers of alphabetical letters, digits and @samp{_}.
474:
475: An indeterminate is a transcendental element, so-called variable,
476: which is used to construct polynomial rings.
477: An indeterminate cannot have any value. No assignment is allowed to it.
478: \E
1.1 noro 479:
480: @example
481: [3] X=x;
482: x
483: [4] X^2+X+1;
484: x^2+x+1
1.12 ! ohara 485: [5] A='Dx'*(x-1)+x*y-y;
! 486: (y+Dx)*x-y-Dx
1.1 noro 487: @end example
488: @end table
489:
1.3 noro 490: \BJP
1.1 noro 491: @node $B0z?t(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
492: @subsection $B0z?t(B
1.3 noro 493: \E
494: \BEG
495: @node parameters and arguments,,, Writing user defined functions
496: @subsection parameters and arguments
497: \E
1.1 noro 498:
499: @example
500: def sum(N) @{
501: for ( I = 1, S = 0; I <= N; I++ )
502: S += I;
503: return S;
504: @}
505: @end example
506:
507: @noindent
1.3 noro 508: \BJP
1.1 noro 509: $B$3$l$O(B, 1 $B$+$i(B @code{N} $B$^$G$N<+A3?t$NOB$r5a$a$kH!?t(B @code{sum()} $B$N(B
510: $BDj5A$G$"$k(B. $B$3$NNc$K$*$1$k(B @code{sum(N)} $B$N(B @code{N} $B$,0z?t$G$"$k(B.
511: $B$3$NNc$O(B, 1 $B0z?tH!?t$NNc$G$"$k$,(B, $B0lHL$K0z?t$N8D?t$OG$0U$G$"$j(B,
512: $BI,MW$J$@$1$N8D?t$r(B @samp{,} $B$G6h@Z$C$F;XDj$9$k$3$H$,$G$-$k(B. $B0z?t$O(B
513: $BCM$,EO$5$l$k(B. $B$9$J$o$A(B, $B0z?t$r<u$1$H$C$?B&$,(B, $B$=$N0z?t$NCM$rJQ99$7$F(B
514: $B$b(B, $BEO$7$?B&$NJQ?t$OJQ2=$7$J$$(B. $B$?$@$7(B, $BNc30$,$"$k(B. $B$=$l$O(B, $B%Y%/%H%k(B,
515: $B9TNs$r0z?t$KEO$7$?>l9g$G$"$k(B. $B$3$N>l9g$b(B, $BEO$5$l$?JQ?t$=$N$b$N$r=q$-(B
516: $BBX$($k$3$H$O(B, $B$=$NH!?t$K6I=jE*$JA`:n$G$"$k$,(B, $BMWAG$r=q$-49$($?>l9g(B,
517: $B$=$l$O(B, $B8F$S=P$7B&$N%Y%/%H%k(B, $B9TNs$NMWAG$r=q$-49$($k$3$H$K$J$k(B.
1.3 noro 518: \E
519: \BEG
520: This is an example definition of a function that sums up integers
521: from 1 to @code{N}. The @code{N} in @code{sum(N)} is called the
522: (formal) parameter of @code{sum(N)}.
523: The example shows a function of the single argument.
524: In general, any number of parameters can be specified by separating
525: by commas (@samp{,}).
526: A (formal) parameter accepts a value given as an argument (or an actual
527: parameter) at a function call of the function.
528: Since the value of the argument is given to the formal parameter,
529: any modification to the parameter does not usually affect the argument
530: (or actual parameter). However, there are a few exceptions: vector
531: arguments and matrix arguments.
532:
533: Let @code{A} be a program variable and assigned to a vector value
534: @code{[ a, b ]}.
535: If A is given as an actual parameter to a formal parameter, say @code{V},
536: of a function, then an assignment in the function to the vector element
537: designator @code{V[1]}, say @code{V[1]=c;}, causes modification of the
538: actual parameter @code{A} resulting @code{A} to have an altered value
539: @code{[ a c ]}. Thus, if a vector is given to a formal parameter of
540: a function, then its element (and subsequently the vector itself) in
541: the calling side is modified through modification of the formal parameter
542: by a vector element designator in the called function.
543: The same applies to a matrix argument.
544: Note that, even in such case where a vector (or a matrix) is given to
545: a formal parameter, the assignment to the whole parameter itself has
546: only a local effect within the function.
547: \E
1.1 noro 548:
549: @example
550: def clear_vector(M) @{
551: /* M is expected to be a vector */
552: L = size(M)[0];
553: for ( I = 0; I < L; I++ )
554: M[I] = 0;
555: @}
556: @end example
557:
558: @noindent
1.3 noro 559: \BJP
1.1 noro 560: $B$3$NH!?t$O(B, $B0z?t$N%Y%/%H%k$r(B 0 $B%Y%/%H%k$K=i4|2=$9$k$?$a$NH!?t$G$"$k(B.
561: $B$^$?(B, $B%Y%/%H%k$r0z?t$KEO$9$3$H$K$h$j(B, $BJ#?t$N7k2L$r0z?t$N%Y%/%H%k$K(B
562: $B<}G<$7$FJV$9$3$H$,$G$-$k(B. $B<B:]$K$O(B, $B$3$N$h$&$J>l9g$K$O(B, $B7k2L$r%j%9%H(B
563: $B$K$7$FJV$9$3$H$b$G$-$k(B. $B>u67$K1~$8$F;H$$$o$1$9$k$3$H$,K>$^$7$$(B.
1.3 noro 564: \E
565: \BEG
566: This function will clear off the vector given as its argument to the
567: formal parameter @code{M} and return a 0 vector.
568:
569: Passing a vector as an argument to a function enables returning
570: multiple results by packing each result in a vector element.
571: Another alternative to return multiple results is to use a list.
572: Which to use depends on cases.
573: \E
1.1 noro 574:
1.3 noro 575: \BJP
1.1 noro 576: @node $B%3%a%s%H(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
577: @subsection $B%3%a%s%H(B
1.3 noro 578: \E
579: \BEG
580: @node comments,,, Writing user defined functions
581: @subsection comments
582: \E
1.1 noro 583:
584: @noindent
1.3 noro 585: \JP C $B$HF1MM(B @samp{/*} $B$H(B @samp{*/} $B$G0O$^$l$?ItJ,$O%3%a%s%H$H$7$F07$o$l$k(B.
586: \BEG
587: The text enclosed by @samp{/*} and @samp{*/} (containing @samp{/*} and
588: @samp{*/}) is treated as a comment and has no effect to the program
589: execution as in C programs.
590: \E
1.1 noro 591:
592: @example
593: /*
594: * This is a comment.
595: */
596:
597: def afo(X) @{
598: @end example
599:
600: @noindent
1.3 noro 601: \BJP
1.1 noro 602: $B%3%a%s%H$OJ#?t9T$KEO$C$F$b9=$o$J$$$,(B, $BF~$l;R$K$9$k$3$H$O$G$-$J$$(B.
603: @samp{/*} $B$,$$$/$D$"$C$F$b:G=i$N$b$N$N$_$,M-8z$H$J$j(B, $B:G=i$K8=$l$?(B
604: @samp{*/} $B$G%3%a%s%H$O=*N;$7$?$H8+$J$5$l$k(B. $B%W%m%0%i%`$J$I$G(B, $B%3%a%s%H(B
605: $B$r4^$`2DG=@-$,$"$kItJ,$r%3%a%s%H%"%&%H$7$?>l9g$K$O(B, @code{#if 0},
1.6 noro 606: @code{#endif}$B$r;H$($P$h$$(B. (@xref{$B%W%j%W%m%;%C%5(B}.)
1.3 noro 607: \E
608: \BEG
609: A comment can span to several lines, but it cannot be nested.
610: Only the first @samp{/*} is effective no matter how many @samp{/*}'s
611: in the subsequent text exist, and the comment terminates at the first
612: @samp{*/}.
613:
614: In order to comment out a program part that may contain comments in it,
1.6 noro 615: use the pair, @code{#if 0} and @code{#endif}. (@xref{preprocessor}.)
1.3 noro 616: \E
1.1 noro 617:
618: @example
619: #if 0
620: def bfo(X) @{
621: /* empty */
622: @}
623: #endif
624: @end example
625:
1.3 noro 626: \BJP
1.1 noro 627: @node $BJ8(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
628: @subsection $BJ8(B
1.3 noro 629: \E
630: \BEG
631: @node statements,,, Writing user defined functions
632: @subsection statements
633: \E
1.1 noro 634:
635: @noindent
1.3 noro 636: \BJP
1.1 noro 637: @b{Asir} $B$N%f!<%6H!?t$O(B,
638:
639: @example
640: def $BL>A0(B($B0z?t(B,$B0z?t(B,...,$B0z?t(B) @{
641: $BJ8(B
642: $BJ8(B
643: ...
644: $BJ8(B
645: @}
1.3 noro 646: \E
647: \BEG
648: An user function of @b{Asir} is defined in the following form.
649:
650: @example
651: def name(parameter, parameter,...,parameter) @{
652: statement
653: statement
654: ...
655: statement
656: @}
657: \E
1.1 noro 658: @end example
659:
660: @noindent
1.3 noro 661: \BJP
1.1 noro 662: $B$H$$$&7A$GDj5A$5$l$k(B. $B$3$N$h$&$K(B, $BJ8$OH!?t$N4pK\E*9=@.MWAG$G$"$j(B, $B%W%m(B
663: $B%0%i%`$r=q$/$?$a$K$O(B, $BJ8$,$I$N$h$&$J$b$N$G$"$k$+CN$i$J$1$l$P$J$i$J$$(B.
664: $B:G$bC1=c$JJ8$H$7$F(B, $BC1J8$,$"$k(B. $B$3$l$O(B,
1.3 noro 665: \E
666: \BEG
667: As you can see, the statement is a fundamental element of the
668: function.
669: Therefore, in order to write a program, you have to learn what
670: the statement is. The simplest statement is the simple statement.
671: One example is an expression with a terminator (@samp{;} or @samp{$}.)
672: \E
1.1 noro 673:
674: @example
675: S = sum(N);
676: @end example
677:
678: @noindent
1.3 noro 679: \BJP
1.1 noro 680: $B$N$h$&$K(B, $B<0$K=*C<5-9f(B (@samp{;} $B$^$?$O(B @samp{$}) $B$r$D$1$?$b$N$G$"$k(B.
681: $B$3$NC1J85Z$SN`;w$N(B @code{return} $BJ8(B, @code{break} $BJ8$J$I$,J8$N:G>.9=@.(B
1.6 noro 682: $BC10L$H$J$k(B. @code{if} $BJ8$d(B @code{for} $BJ8$NDj5A(B (@ref{$BJ8K!$N>\:Y(B}) $B$r8+$l(B
1.1 noro 683: $B$P$o$+$kDL$j(B, $B$=$l$i$NK\BN$O(B, $BC1$J$k0l$D$NJ8$H$7$FDj5A$5$l$F$$$k(B. $BDL>o(B
684: $B$O(B, $BK\BN$K$OJ#?t$NJ8$,=q$1$k$3$H$,I,MW$H$J$k(B. $B$3$N$h$&$J>l9g(B,
685: @samp{@{} $B$H(B @samp{@}} $B$GJ8$NJB$S$r3g$C$F(B, $B0l$D$NJ8$H$7$F07$&$3$H$,$G(B
686: $B$-$k(B. $B$3$l$rJ#J8$H8F$V(B.
1.3 noro 687: \E
688: \BEG
689: A `@code{return} statement' and `@code{break} statement' are also
690: primitives to construct `statements.'
691: As you can see the syntactic definition of `@code{if} statement' and
692: `@code{for} statement', each of their bodies consists of a single
693: `statement.' Usually, you need several statements in such a body.
694: To solve this contradictory requirement, you may use the `compound
695: statement.' A `compound statement' is a sequence of `statement's
696: enclosed by a left brace @samp{@{} and a right brace @samp{@}}.
697: Thus, you can use multiple statement as if it were a single statement.
698: \E
1.1 noro 699:
700: @example
701: if ( I == 0 ) @{
702: J = 1;
703: K = 2;
704: L = 3;
705: @}
706: @end example
707:
708: @noindent
1.3 noro 709: \BJP
1.1 noro 710: @samp{@}} $B$N8e$m$K$O=*C<5-9f$OI,MW$J$$(B. $B$J$<$J$i(B, @samp{@{} $BJ8JB$S(B
711: @samp{@}}$B$,4{$KJ8$H$J$C$F$$$F(B, @code{if} $BJ8$NMW@A$rK~$?$7$F$$$k$+$i$G(B
712: $B$"$k(B.
1.3 noro 713: \E
714: \BEG
715: No terminator symbol is necessary after @samp{@}},
716: because @samp{@{} statement sequence @samp{@}} already forms a statement,
717: and it satisfies the syntactical requirement of the
718: `@code{if} statement.'
719: \E
1.1 noro 720:
1.3 noro 721: \BJP
1.1 noro 722: @node return $BJ8(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
723: @subsection @code{return} $BJ8(B
1.3 noro 724: \E
725: \BEG
726: @node return statement,,, Writing user defined functions
727: @subsection @code{return} statement
728: \E
1.1 noro 729:
730: @noindent
1.3 noro 731: \JP @code{return} $BJ8$O(B,
732: \EG There are two forms of @code{return} statement.
1.1 noro 733:
734: @example
1.3 noro 735: \JP return $B<0(B;
736: \EG return expression;
1.1 noro 737:
738: return;
739: @end example
740:
741: @noindent
1.3 noro 742: \BJP
1.1 noro 743: $B$N(B 2 $B$D$N7A<0$,$"$k(B. $B$$$:$l$bH!?t$+$iH4$1$k$?$a$NJ8$G$"$k(B. $BA0<T$O(B
744: $BH!?t$NCM$H$7$F(B $B<0(B $B$rJV$9(B. $B8e<T$G$O(B, $BH!?t$NCM$H$7$F2?$,JV$5$l$k$+(B
745: $B$O$o$+$i$J$$(B.
1.3 noro 746: \E
747: \BEG
748: Both forms are used for exiting from a function.
749: The former returns the value of the expression as a function value.
750: The function value of the latter is not defined.
751: \E
1.1 noro 752:
1.3 noro 753: \BJP
1.1 noro 754: @node if $BJ8(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
755: @subsection @code{if} $BJ8(B
1.3 noro 756: \E
757: \BEG
758: @node if statement,,, Writing user defined functions
759: @subsection @code{if} statement
760: \E
1.1 noro 761:
762: @noindent
1.3 noro 763: \JP @code{if} $BJ8$K$O(B
764: \EG There are two forms of @code{if} statement.
1.1 noro 765:
766: @example
1.3 noro 767: \BJP
1.1 noro 768: if ( $B<0(B ) if ( $B<0(B )
769: $BJ8(B $B5Z$S(B $BJ8(B
770: else
771: $BJ8(B
1.3 noro 772: \E
773: \BEG
774: if ( expression ) if ( expression )
775: statement and statement
776: else
777: statement
778: \E
1.1 noro 779: @end example
780:
781: @noindent
1.3 noro 782: \BJP
1.1 noro 783: $B$N(B 2 $B<oN`$,$"$k(B. $B$3$l$i$NF0:n$OL@$i$+$G$"$k$,(B, $BJ8$N0LCV$K(B @code{if} $BJ8(B
784: $B$,Mh$?>l9g$KCm0U$rMW$9$k(B. $B<!$NNc$r9M$($F$_$h$&(B.
1.3 noro 785: \E
786: \BEG
787: The interpretation of these forms are obvious. However, be careful
788: when another @code{if} statement comes at the place for `statement'.
789: Let us examine the following example.
790: \E
1.1 noro 791:
792: @example
1.3 noro 793: \BJP
1.1 noro 794: if ( $B<0(B )
795: if ( $B<0(B ) $BJ8(B
796: else
797: $BJ8(B
1.3 noro 798: \E
799: \BEG
800: if ( expression1 )
801: if ( expression2 ) statement1
802: else
803: statement2
804: \E
1.1 noro 805: @end example
806:
807: @noindent
1.3 noro 808: \BJP
1.1 noro 809: $B$3$N>l9g(B, $B;z2<$2$+$i$O(B, @code{else} $B0J2<$O(B, $B:G=i$N(B @code{if} $B$KBP1~$9$k(B
810: $B$h$&$K8+$($k$,(B, $B%Q!<%6$O(B, $B<+F0E*$K(B 2 $BHVL\$N(B @code{if} $B$KBP1~$9$k$HH=CG$9$k(B.
811: $B$9$J$o$A(B, 2 $B<oN`$N(B @code{if} $BJ8$r5v$7$?$?$a$K(B, $BJ8K!$K[#Kf@-$,8=$l(B, $B$=$l$r(B
812: $B2r>C$9$k$?$a$K(B, @code{else} $B0J2<$O(B, $B:G$b6a$$(B @code{if} $B$KBP1~$9$k$H(B
813: $B$$$&5,B'$,E,MQ$5$l$k$N$G$"$k(B. $B=>$C$F(B, $B$3$NNc$O(B,
1.3 noro 814: \E
815: \BEG
816: One might guess @code{statement2} after @code{else} corresponds with the
817: first @code{if ( expression1 )} by its appearance of indentation.
818: But, as a matter of fact, the @code{Asir} parser decides that it
819: correspond with the second @code{if ( expression2 )}.
820: Ambiguity due to such two kinds of forms of @code{if} statement is
821: thus solved by introducing a rule that a statement preceded by an
822: @code{else} matches to the nearest preceding @code{if}.
823:
824: Therefore, rearrangement of the above example for improving readability
825: according to the actual interpretation gives the following.
826: \E
1.1 noro 827:
828: @example
1.3 noro 829: \BJP
1.1 noro 830: if ( $B<0(B ) @{
831: if ( $B<0(B ) $BJ8(B else $BJ8(B
832: @}
1.3 noro 833: \E
834: \BEG
835: if ( expression1 ) @{
836: if ( expression2 ) statement1 else statement2
837: @}
838: \E
1.1 noro 839: @end example
840:
841: @noindent
1.3 noro 842: \JP $B$H$$$&0UL#$H$J$k(B. $B;z2<$2$KBP1~$5$;$k$?$a$K$O(B,
843: \BEG
844: On the other hand, in order to reflect the indentation, it must be
845: written as the following.
846: \E
1.1 noro 847:
848: @example
1.3 noro 849: \BJP
1.1 noro 850: if ( $B<0(B ) @{
851: if ( $B<0(B ) $BJ8(B
852: @} else
853: $BJ8(B
1.3 noro 854: \E
855: \BEG
856: if ( expression1 ) @{
857: if ( expression2 ) statement1
858: @} else
859: statement2
860: \E
1.1 noro 861: @end example
862:
863: @noindent
1.3 noro 864: \JP $B$H$7$J$1$l$P$J$i$J$$(B.
1.1 noro 865:
1.11 takayama 866: \BJP
867: @noindent
868: $B4X?t$NCf$G$J$/(B, top level $B$G(B @code{if} $BJ8$rMQ$$$k$H$-$O(B @code{$} $B$^$?$O(B @code{;}
869: $B$G=*N;$9$kI,MW$,$"$k(B.
870: $B$3$l$i$,$J$$$H<!$NJ8$,$h$_$H$P$5$l$k(B.
871: \E
872: \BEG
873: @noindent
874: When @code{if} is used in the top level, the @code{if} expression should be
875: terminated with @code{$} or @code{;}.
876: If there is no terminator, the next expression will be skipped to be evaluated.
877: \E
878:
1.3 noro 879: \BJP
1.1 noro 880: @node $B%k!<%W(B break return continue,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
881: @subsection $B%k!<%W(B, @code{break}, @code{return}, @code{continue}
1.3 noro 882: \E
883: \BEG
884: @node loop break return continue,,, Writing user defined functions
885: @subsection @code{loop}, @code{break}, @code{return}, @code{continue}
886: \E
1.1 noro 887:
888: @noindent
1.3 noro 889: \BJP
1.1 noro 890: $B%k!<%W$r9=@.$9$kJ8$O(B, @code{while} $BJ8(B, @code{for} $BJ8(B, @code{do} $BJ8(B
891: $B$N(B 3 $B<oN`$,$"$k(B.
1.3 noro 892: \E
893: \BEG
894: There are three kinds of statements for loops (repetitions):
895: the @code{while} statement, the @code{for} statement, and the
896: @code{do} statement.
897: \E
1.1 noro 898:
899: @itemize @bullet
900: @item
1.3 noro 901: \JP @code{while} $BJ8(B
902: \EG @code{while} statement
1.4 noro 903: @*
1.3 noro 904: \JP $B7A<0$O(B,
905: \EG It has the following form.
1.1 noro 906:
907: @example
1.3 noro 908: \JP while ( $B<0(B ) $BJ8(B
909: \EG while ( expression ) statement
1.1 noro 910: @end example
911:
912: @noindent
1.3 noro 913: \BJP
1.1 noro 914: $B$G(B, $B$3$l$O(B, $B<0(B $B$rI>2A$7$F(B, $B$=$NCM$,(B 0 $B$G$J$$8B$j(B $BJ8(B $B$r<B9T$9$k$H$$$&(B
915: $B0UL#$H$J$k(B. $B$?$H$($P(B $B<0(B $B$,(B 1 $B$J$i$P(B, $BC1=c$JL58B%k!<%W$H$J$k(B.
1.3 noro 916: \E
917: \BEG
918: This statement specifies that @code{statement} is repeatedly evaluated
919: as far as the @code{expression} evaluates to a non-zero value.
920: If the expression 1 is given to the @code{expression}, it forms an
921: infinite loop.
922: \E
1.1 noro 923:
924: @item
1.3 noro 925: \JP @code{for} $BJ8(B
926: \EG @code{for} statement
1.4 noro 927: @*
1.3 noro 928: \JP $B7A<0$O(B,
929: \EG It has the following form.
1.1 noro 930:
931: @example
1.3 noro 932: \JP for ( $B<0JB$S(B-1; $B<0(B; $B<0JB$S(B-2 ) $BJ8(B
1.7 noro 933: \EG for ( expr list-1; expr; expr list-2 ) statement
1.1 noro 934: @end example
935:
1.3 noro 936: \JP $B$G(B, $B$3$l$O(B
937: \EG This is equivalent to the program
1.1 noro 938:
939: @example
1.3 noro 940: \BJP
1.1 noro 941: $B<0JB$S(B-1 ($B$rC1J8JB$S$K$7$?$b$N(B)
942: while ( $B<0(B ) @{
943: $BJ8(B
944: $B<0JB$S(B-2 ($B$rC1J8JB$S$K$7$?$b$N(B)
945: @}
1.3 noro 946: \E
947: \BEG
1.7 noro 948: expr list-1 (transformed into a sequence of simple statement)
949: while ( expr ) @{
1.3 noro 950: statement
1.7 noro 951: expr list-2 (transformed into a sequence of simple statement)
1.3 noro 952: @}
953: \E
1.1 noro 954: @end example
955:
1.3 noro 956: \JP $B$HEy2A$G$"$k(B.
1.1 noro 957:
958: @item
1.3 noro 959: \JP @code{do} $BJ8(B
960: \EG @code{do} statement
1.4 noro 961: @*
1.1 noro 962: @example
1.3 noro 963: \BJP
1.1 noro 964: do @{
965: $BJ8(B
966: @} while ( $B<0(B )
1.3 noro 967: \E
968: \BEG
969: do @{
970: statement
971: @} while ( expression )
972: \E
1.1 noro 973: @end example
974:
1.3 noro 975: \BJP
1.1 noro 976: $B$O(B, $B@h$K(B $BJ8$r<B9T$7$F$+$i>r7o<0$K$h$kH=Dj$r9T$&=j$,(B @code{while} $BJ8(B
977: $B$H0[$J$C$F$$$k(B.
1.3 noro 978: \E
979: \BEG
980: This statement differs from @code{while} statement by the location of
981: the termination condition: This statement first execute the
982: @code{statement} and then check the condition, whereas @code{while}
983: statement does it in the reverse order.
984: \E
1.1 noro 985: @end itemize
986:
987: @noindent
1.3 noro 988: \BJP
1.1 noro 989: $B%k!<%W$rH4$1=P$9<jCJ$H$7$F(B,
990: @code{break} $BJ85Z$S(B @code{return} $BJ8$,$"$k(B. $B$^$?(B, $B%k!<%W$N@)8f$r(B
991: $B$"$k0LCV$K0\$9<jCJ$H$7$F(B @code{continue} $BJ8$,$"$k(B.
1.3 noro 992: \E
993: \BEG
994: As means for exiting from loops, there are @code{break} statement and
995: @code{return} statement. The @code{continue} statement allows to move
996: the control to a certain point of the loop.
997: \E
1.1 noro 998: @itemize @bullet
999:
1000: @item
1001: @code{break}
1.4 noro 1002: @*
1.3 noro 1003: \JP @code{break} $BJ8$O(B, $B$=$l$r0O$`%k!<%W$r0l$D$@$1H4$1$k(B.
1004: \EG The @code{break} statement is used to exit the inner most loop.
1.1 noro 1005: @item
1006: @code{return}
1.4 noro 1007: @*
1.3 noro 1008: \BJP
1.1 noro 1009: @code{return} $BJ8$O(B, $B0lHL$KH!?t$+$iH4$1$k$?$a$NJ8$G$"$j(B,
1010: $B%k!<%W$NCf$+$i$G$bM-8z$G$"$k(B.
1.3 noro 1011: \E
1012: \BEG
1013: The @code{return} statement is usually used to exit from a function call
1014: and it is also effective in a loop.
1015: \E
1.1 noro 1016:
1017: @item
1018: @code{continue}
1.4 noro 1019: @*
1.3 noro 1020: \BJP
1.1 noro 1021: @code{continue} $BJ8$O(B, $B%k!<%W$NK\BN$NJ8$NKvC<$K@)8f$r0\$9(B.
1022: $BNc$($P(B @code{for} $BJ8$G$O(B, $B:G8e$N<0JB$S$N<B9T$r9T$$(B, @code{while}
1023: $BJ8$G$O>r7o<0$NH=Dj$K0\$k(B.
1.3 noro 1024: \E
1025: \BEG
1026: The @code{continue} statement is used to move the control to the end
1027: point of the loop body.
1028: For example, the last expression list will be evaluated in a @code{for}
1029: statement, and the termination condition will be evaluated in a
1030: @code{while} statement.
1031: \E
1.1 noro 1032: @end itemize
1.5 noro 1033:
1034: \BJP
1035: @node $B9=B$BNDj5A(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
1036: @subsection $B9=B$BNDj5A(B
1037: \E
1038: \BEG
1039: @node structure definition,,, Writing user defined functions
1040: @subsection structure definition
1041: \E
1042:
1043: \BJP
1044: $B9=B$BN$H$O(B, $B3F@.J,$NMWAG$,L>A0$G%"%/%;%9$G$-$k8GDjD9G[Ns$H;W$C$F$h$$(B.
1045: $B3F9=B$BN$OL>A0$G6hJL$5$l$k(B. $B9=B$BN$O(B, @code{struct} $BJ8$K$h$j@k8@$5$l$k(B.
1.12 ! ohara 1046: $B9=B$BN$,@k8@$5$l$k$H$-(B, asir $B$OFbIt$G9=B$BN$N$=$l$>$l$N7?$K8GM-$N<1JL(B
! 1047: $BHV9f$r$D$1$k(B. $B$3$NHV9f$O(B, $BAH$_9~$_4X?t(B @code{struct_type} $B$K$h$j<hF@(B
! 1048: $B$G$-$k(B.
1.5 noro 1049: $B$"$k7?$N9=B$BN$O(B, $BAH$_9~$_4X?t(B @code{newstruct} $B$K$h$j@8@.$5$l$k(B.
1050: $B9=B$BN$N3F%a%s%P$O(B, $B1i;;;R(B @code{->} $B$K$h$j%"%/%;%9$9$k(B.
1051: $B%a%s%P$,9=B$BN$N>l9g(B, @code{->} $B$K$h$k;XDj$OF~$l;R$K$G$-$k(B.
1052: \E
1053:
1054: \BEG
1055: A structure data type is a fixed length array and each component of the array
1056: is accessed by its name. Each type of structure is distinguished by its name.
1057: A structure data type is declared by @code{struct} statement.
1058: A structure object is generated by a builtin function @code{newstruct}.
1059: Each member of a structure is accessed by an operatator @code{->}.
1060: If a member of a structure is again a structure, then the specification
1061: by @code{->} can be nested.
1062: \E
1063:
1064: @example
1065: [1] struct rat @{num,denom@};
1066: 0
1067: [2] A = newstruct(rat);
1068: @{0,0@}
1069: [3] A->num = 1;
1070: 1
1071: [4] A->den = 2;
1072: 2
1073: [5] A;
1074: @{1,2@}
1.12 ! ohara 1075: [6] struct_type(A);
! 1076: 1
1.5 noro 1077: @end example
1.1 noro 1078:
1.12 ! ohara 1079: @table @t
! 1080: \JP @item $B;2>H(B
! 1081: \EG @item References
! 1082: @fref{newstruct}, @fref{struct_type}
! 1083: @end table
! 1084:
1.3 noro 1085: \BJP
1.1 noro 1086: @node $B$5$^$6$^$J<0(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
1087: @subsection $B$5$^$6$^$J<0(B
1.3 noro 1088: \E
1089: \BEG
1090: @node various expressions,,, Writing user defined functions
1091: @subsection various expressions
1092: \E
1.1 noro 1093:
1094: @noindent
1.3 noro 1095: \JP $B<g$J<0$N9=@.MWAG$H$7$F$O(B, $B<!$N$h$&$J$b$N$,$"$k(B.
1096: \EG Major elements to construct expressions are the following:
1.1 noro 1097:
1098: @itemize @bullet
1099: @item
1.3 noro 1100: \JP $B2C8:>h=|(B, $BQQ(B
1101: \EG addition, subtraction, multiplication, division, exponentiation
1.4 noro 1102: @*
1.3 noro 1103: \BJP
1.1 noro 1104: $BQQ$O(B, @samp{^} $B$K$h$jI=$9(B. $B=|;;(B @samp{/} $B$O(B, $BBN$H$7$F$N1i;;$KMQ$$$k(B.
1105: $BNc$($P(B, @code{2/3} $B$OM-M}?t$N(B @code{2/3} $B$rI=$9(B.
1106: $B@0?t=|;;(B, $BB?9`<0=|;;(B ($B>jM>$r4^$`1i;;(B) $B$K$OJLESAH$_9~$_H!?t$,MQ0U$5$l$F$$$k(B.
1.3 noro 1107: \E
1108: \BEG
1109: The exponentiation is denoted by @samp{^}. (This differs from C language.)
1110: Division denoted by @samp{/} is used to operate in a field, for example,
1111: @code{2/3} results in a rational number @code{2/3}.
1112: For integer division and polynomial division, both including remainder
1113: operation, built-in functions are provided.
1114: \E
1.1 noro 1115:
1116: @example
1117: x+1 A^2*B*afo X/3
1118: @end example
1119:
1120: @item
1.3 noro 1121: \JP $B%$%s%G%C%/%9$D$-$NJQ?t(B
1122: \EG programming variables with indices
1.4 noro 1123: @*
1.3 noro 1124: \BJP
1.1 noro 1125: $B%Y%/%H%k(B, $B9TNs(B, $B%j%9%H$NMWAG$O%$%s%G%C%/%9$rMQ$$$k$3$H$K$h$j<h$j=P$;$k(B.
1126: $B%$%s%G%C%/%9$O(B 0 $B$+$i;O$^$k$3$H$KCm0U$9$k(B. $B<h$j=P$7$?MWAG$,%Y%/%H%k(B,
1127: $B9TNs(B, $B%j%9%H$J$i(B, $B$5$i$K%$%s%G%C%/%9$r$D$1$k$3$H$bM-8z$G$"$k(B.
1.3 noro 1128: \E
1129: \BEG
1130: An element of a vector, a matrix or a list can be referred to by
1131: indexing.
1132: Note that the indices begin with number 0. When the referred element
1133: is again a vector, a matrix or a list, repeated indexing is also
1134: effective.
1135: \E
1.1 noro 1136:
1137: @example
1138: V[0] M[1][2]
1139: @end example
1140:
1141: @item
1.3 noro 1142: \JP $BHf3S1i;;(B
1143: \EG comparison operation
1.4 noro 1144: @*
1.3 noro 1145: \BJP
1.1 noro 1146: $BEy$7$$(B (@samp{==}), $BEy$7$/$J$$(B (@samp{!=}), $BBg>.(B (@samp{>}, @samp{<},
1147: @samp{>=}, @samp{<=}) $B$N(B 2 $B9`1i;;$,$"$k(B. $B??$J$i$PM-M}?t$N(B 1, $B56$J$i$P(B
1148: 0 $B$rCM$K;}$D(B.
1.3 noro 1149: \E
1150: \BEG
1151: There are comparison operations
1152: @samp{==} for equivalence, @samp{!=} for non-equivalence,
1153: @samp{>}, @samp{<},@samp{>=}, and @samp{<=} for larger or smaller.
1154: The results of these operations are either value 1 for the truth,
1155: or 0 for the false.
1156: \E
1.1 noro 1157:
1158: @item
1.3 noro 1159: \JP $BO@M}<0(B
1160: \EG logical expression
1.4 noro 1161: @*
1.3 noro 1162: \BJP
1.1 noro 1163: $BO@M}@Q(B (@samp{&&}), $BO@M}OB(B (@samp{||}) $B$N(B 2 $B9`1i;;$H(B, $BH]Dj(B (@samp{!})
1164: $B$,MQ0U$5$l$F$$$k(B. $BCM$O$d$O$j(B 1, 0 $B$G$"$k(B.
1.3 noro 1165: \E
1166: \BEG
1167: There are two binary logical operations
1168: @samp{&&} for logical @samp{conjunction}(and),
1169: @samp{||} for logical @samp{disjunction}(or),
1170: and one unary logical operation @samp{!} for logical @samp{negation}(not).
1171: The results of these operations are either value 1 for the truth,
1172: and 0 for the false.
1173: \E
1.1 noro 1174:
1175: @item
1.3 noro 1176: \JP $BBeF~(B
1177: \EG assignment
1.4 noro 1178: @*
1.3 noro 1179: \BJP
1.1 noro 1180: $BDL>o$NBeF~$O(B @samp{=} $B$G9T$&(B. $B$3$N$[$+(B, $B;;=Q1i;;;R$HAH$_9g$o$;$F(B
1181: $BFC<l$JBeF~$r9T$&$3$H$b$G$-$k(B.
1.3 noro 1182: \E
1183: \BEG
1184: Value assignment of a program variable is usually done by @samp{=}.
1185: There are special assignments combined with arithmetic operations.
1186: \E
1.1 noro 1187: (@samp{+=}, @samp{-=}, @samp{*=}, @samp{/=}, @samp{^=})
1188:
1189: @example
1.3 noro 1190: \JP A = 2 A *= 3 ($B$3$l$O(B A = A*3 $B$HF1$8(B; $B$=$NB>$N1i;;;R$bF1MM(B)
1.7 noro 1191: \EG A = 2 A *= 3 (the same as A = A*3; The others are alike.)
1.1 noro 1192: @end example
1193: @item
1.3 noro 1194: \JP $BH!?t8F$S=P$7(B
1195: \EG function call
1.4 noro 1196: @*
1.3 noro 1197: \JP $BH!?t8F$S=P$7$b<0$N0l<o$G$"$k(B.
1198: \EG A function call is also an expression.
1.1 noro 1199: @item
1200: @samp{++}, @samp{--}
1.4 noro 1201: @*
1.3 noro 1202: \JP $B$3$l$i$O(B, $BJQ?t$NA08e$K$D$$$F(B, $B$=$l$>$l<!$N$h$&$JA`:n(B, $BCM$rI=$9(B.
1203: \BEG
1204: These operators are attached to or before a program variable,
1205: and denote special operations and values.
1206: \E
1.1 noro 1207: @example
1.3 noro 1208: \BJP
1.1 noro 1209: A++ $BCM$O85$N(B A $B$NCM(B, A = A+1
1210: A-- $BCM$O85$N(B A $B$NCM(B, A = A-1
1211: ++A A = A+1, $BCM$OJQ2=8e$NCM(B
1212: --A A = A-1, $BCM$OJQ2=8e$NCM(B
1.3 noro 1213: \E
1214: \BEG
1215: A++ the expression value is the previous value of A, and A = A+1
1216: A-- the expression value is the previous value of A, and A = A-1
1.7 noro 1217: ++A A = A+1, and the value is the one after increment of A
1218: --A A = A-1, and the value is the one after decrement of A
1.3 noro 1219: \E
1.1 noro 1220: @end example
1221:
1222: @end itemize
1223:
1.3 noro 1224: \BJP
1.1 noro 1225: @node $B%W%j%W%m%;%C%5(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
1226: @subsection $B%W%j%W%m%;%C%5(B
1.3 noro 1227: \E
1228: \BEG
1229: @node preprocessor,,, Writing user defined functions
1230: @subsection preprocessor
1231: \E
1.1 noro 1232:
1233: @noindent
1.3 noro 1234: \BJP
1.1 noro 1235: @b{Asir} $B$N%f!<%68@8l$O(B C $B8@8l$rLO$7$?$b$N$G$"$k(B. C $B$NFCD'$H$7$F(B,
1236: $B%W%j%W%m%;%C%5(B @code{cpp} $B$K$h$k%^%/%mE83+(B, $B%U%!%$%k$N%$%s%/%k!<%I(B
1237: $B$,$"$k$,(B, @b{Asir} $B$K$*$$$F$b%f!<%68@8l%U%!%$%k$NFI$_9~$_$N:](B
1238: @code{cpp} $B$rDL$7$F$+$iFI$_9~$`$3$H$H$7$?(B. $B$3$l$K$h$j%f!<%68@8l(B
1239: $B%U%!%$%kCf$G(B @code{#include}, @code{#define}, @code{#if} $B$J$I$,;H$($k(B.
1.3 noro 1240: \E
1241: \BEG
1242: he @b{Asir} user language imitates C language. A typical features of
1243: C language include macro expansion and file inclusion by the
1244: preprocessor @code{cpp}. Also, @b{Asir} read in user program files
1245: through @code{cpp}. This enables @b{Asir} user to use
1246: @code{#include}, @code{#define}, @code{#if} etc. in his programs.
1247: \E
1.1 noro 1248:
1249: @itemize @bullet
1250: @item
1251: @code{#include}
1.4 noro 1252: @*
1.3 noro 1253: \BJP
1.1 noro 1254: @code{cpp} $B$KFC$K0z?t$rEO$5$J$$$?$a(B, $B%$%s%/%k!<%I%U%!%$%k$O(B,
1255: @code{#include} $B$,=q$+$l$F$$$k%U%!%$%k$HF1$8%G%#%l%/%H%j$G%5!<%A$5$l$k(B.
1.3 noro 1256: \E
1257: \BEG
1258: Include files are searched within the same directory as the file
1259: containing @code{#include} so that no arguments are passed to @code{cpp}.
1260: \E
1.1 noro 1261:
1262: @item
1263: @code{#define}
1.4 noro 1264: @*
1.3 noro 1265: \JP $B$3$l$O(B, C $B$K$*$1$k$N$HA4$/F1MM$KMQ$$$k$3$H$,$G$-$k(B.
1266: \EG This can be used just as in C language.
1.1 noro 1267:
1268: @item
1269: @code{#if}
1.4 noro 1270: @*
1.3 noro 1271: \BJP
1.1 noro 1272: @code{/*}, @code{*/} $B$K$h$k%3%a%s%H$OF~$l;R$K$G$-$J$$$N$G(B, $B%W%m%0%i%`(B
1273: $B$NBg$-$JItJ,$r%3%a%s%H%"%&%H$9$k:]$K(B, @code{#if 0}, @code{#endif}
1274: $B$r;H$&$HJXMx$G$"$k(B.
1.3 noro 1275: \E
1276: \BEG
1277: This is conveniently used to comment out a large part of a user program
1278: that may contain comments by @code{/*} and @code{*/},
1279: because such comments cannot be nested.
1280: \E
1.1 noro 1281: @end itemize
1282:
1283: @noindent
1.3 noro 1284: \JP $B<!$NNc$O(B, @samp{defs.h} $B$K$"$k%^%/%mDj5A$G$"$k(B.
1285: \EG the following are the macro definitions in @samp{defs.h}.
1.1 noro 1286:
1287: @example
1288: #define ZERO 0
1289: #define NUM 1
1290: #define POLY 2
1291: #define RAT 3
1292: #define LIST 4
1293: #define VECT 5
1294: #define MAT 6
1295: #define STR 7
1296: #define N_Q 0
1297: #define N_R 1
1298: #define N_A 2
1299: #define N_B 3
1300: #define N_C 4
1301: #define V_IND 0
1302: #define V_UC 1
1303: #define V_PF 2
1304: #define V_SR 3
1305: #define isnum(a) (type(a)==NUM)
1306: #define ispoly(a) (type(a)==POLY)
1307: #define israt(a) (type(a)==RAT)
1308: #define islist(a) (type(a)==LIST)
1309: #define isvect(a) (type(a)==VECT)
1310: #define ismat(a) (type(a)==MAT)
1311: #define isstr(a) (type(a)==STR)
1312: #define FIRST(L) (car(L))
1313: #define SECOND(L) (car(cdr(L)))
1314: #define THIRD(L) (car(cdr(cdr(L))))
1315: #define FOURTH(L) (car(cdr(cdr(cdr(L)))))
1316: #define DEG(a) deg(a,var(a))
1317: #define LCOEF(a) coef(a,deg(a,var(a)))
1318: #define LTERM(a) coef(a,deg(a,var(a)))*var(a)^deg(a,var(a))
1319: #define TT(a) car(car(a))
1320: #define TS(a) car(cdr(car(a)))
1321: #define MAX(a,b) ((a)>(b)?(a):(b))
1322: @end example
1.2 noro 1323:
1.11 takayama 1324: \BJP
1325: @noindent
1326: C $B$N%W%j%W%m%;%C%5$rN.MQ$7$F$$$k$?$a(B, $B%W%j%W%m%;%C%5$O(B @code{$} $B$r@5$7$/=hM}$G$-$J$$(B.
1327: $B$?$H$($P(B @code{LIST} $B$,Dj5A$5$l$F$$$F$b(B
1328: @code{LIST$}$B$OCV49$5$l$J$$(B. @code{$} $B$NA0$K6uGr$r$*$$$F(B
1329: @code{LIST $} $B$H=q$+$J$$$H$$$1$J$$(B.
1330: \E
1331: \BEG
1332: @noindent
1333: Since we are utilizing the C preprocessor, it cannot properly preprocess expressions
1334: with @code{$}.
1335: For example, even if @code{LIST} is defined, @code{LIST} in the expression
1336: @code{LIST$} is not replaced. Add a blank before @code{$}, i.e.,
1337: write as @code{LIST $} to make the proprocessor replace it properly.
1338: \E
1.2 noro 1339:
1.3 noro 1340: \BJP
1.2 noro 1341: @node $B%*%W%7%g%s;XDj(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
1342: @subsection $B%*%W%7%g%s;XDj(B
1.3 noro 1343: \E
1344: \BEG
1345: @node option,,, Writing user defined functions
1346: @subsection option
1347: \E
1.2 noro 1348:
1.3 noro 1349: \BJP
1.2 noro 1350: $B%f!<%6Dj5A4X?t$,(B @var{N} $BJQ?t$G@k8@$5$l$?>l9g(B, $B$=$N4X?t$O(B, @var{N}
1351: $BJQ?t$G$N8F$S=P$7$N$_$,5v$5$l$k(B.
1.3 noro 1352: \E
1353: \BEG
1354: If a user defined function is declared with @var{N} arguments,
1355: then the function is callable with @var{N} arguments only.
1356: \E
1.2 noro 1357:
1358: @example
1359: [0] def factor(A) @{ return fctr(A); @}
1360: [1] factor(x^5-1,3);
1361: evalf : argument mismatch in factor()
1362: return to toplevel
1363: @end example
1364:
1.3 noro 1365: \BJP
1.2 noro 1366: $BITDj8D0z?t$N4X?t$r%f!<%68@8l$G5-=R$7$?$$>l9g(B, $B%j%9%H(B, $BG[Ns$rMQ$$$k$3$H$G(B
1367: $B2DG=$H$J$k$,(B, $B<!$N$h$&$J$h$jJ,$+$j$d$9$$J}K!$b2DG=$G$"$k(B.
1.3 noro 1368: \E
1369: \BEG
1370: A function with indefinite number of arguments can be realized by
1371: using a list or an array as its argument. Another method is available
1372: as follows:
1373: \E
1.2 noro 1374:
1375: @example
1376: % cat factor
1377: def factor(F)
1378: @{
1379: Mod = getopt(mod);
1380: ModType = type(Mod);
1381: if ( ModType == 1 ) /* 'mod' is not specified. */
1382: return fctr(F);
1383: else if ( ModType == 0 ) /* 'mod' is a number */
1384: return modfctr(F,Mod);
1385: @}
1386: @end example
1387:
1388: @example
1389: [0] load("factor")$
1390: [1] factor(x^5-1);
1391: [[1,1],[x-1,1],[x^4+x^3+x^2+x+1,1]]
1392: [2] factor(x^5-1|mod=11);
1393: [[1,1],[x+6,1],[x+2,1],[x+10,1],[x+7,1],[x+8,1]]
1394: @end example
1395:
1.3 noro 1396: \BJP
1.2 noro 1397: 2 $BHVL\$N(B @code{factor()} $B$N8F$S=P$7$K$*$$$F(B, $B4X?tDj5A$N:]$K@k8@$5$l$?0z(B
1.3 noro 1398: $B?t(B @code{x^5-1}$B$N8e$m$K(B @code{|mod=11} $B$,CV$+$l$F$$$k(B. $B$3$l$O(B, $B4X?t<B9T;~(B
1399: $B$K(B, @code{mod} $B$H$$$&(B keyword $B$KBP$7$F(B @code{11} $B$H$$$&CM$r3d$jEv$F$k$3$H(B
1.2 noro 1400: $B$r;XDj$7$F$$$k(B. $B$3$l$r%*%W%7%g%s;XDj$H8F$V$3$H$K$9$k(B. $B$3$NCM$O(B
1401: @code{getopt(mod)} $B$G<h$j=P$9$3$H$,$G$-$k(B. 1 $BHVL\$N8F$S=P$7$N$h$&$K(B
1.3 noro 1402: @code{mod} $B$KBP$9$k%*%W%7%g%s;XDj$,$J$$>l9g$K$O(B, @code{getopt(mod)} $B$O7?(B
1.2 noro 1403: $B<1JL;R(B -1 $B$N%*%V%8%'%/%H$rJV$9(B. $B$3$l$K$h$j(B, $B;XDj$,$J$$>l9g$NF0:n$r(B if $BJ8(B
1404: $B$K$h$j5-=R$G$-$k(B. @samp{|} $B$N8e$m$K$O(B, $BG$0U8D$N%*%W%7%g%s$r(B, @samp{,}
1405: $B$G6h@Z$C$F;XDj$9$k$3$H$,$G$-$k(B.
1.3 noro 1406: \E
1407: \BEG
1408: In the second call of @code{factor()}, @code{|mod=11} is placed
1409: after the argument @code{x^5-1}, which appears in the declaration of
1410: @code{factor()}. This means that the value @code{11} is assigned to
1411: the keyword @code{mod} when the function is executed. The value
1412: can be retrieved by @code{getopt(mod)}. We call such machinery
1413: @var{option}. If the option for @var{mod} is not specified,
1414: @code{getopt(mod)} returns an object whose type is -1. By this
1415: feature, one can describe the behaviour of the function when
1416: the option is not specified by @var{if} statements.
1417: After @samp{|} one can append any number of options seperated by @samp{,}.
1418: \E
1.2 noro 1419: @example
1420: [100] xxx(1,2,x^2-1,[1,2,3]|proc=1,index=5);
1421: @end example
1422:
1.1 noro 1423:
1.8 takayama 1424: \BJP
1425: @node $B%b%8%e!<%k(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
1426: @subsection $B%b%8%e!<%k(B
1427: \E
1428: \BEG
1429: @node module,,, Writing user defined functions
1430: @subsection module
1431: \E
1432:
1433: \BJP
1434: $B%i%$%V%i%j$GDj5A$5$l$F$$$k4X?t(B, $BJQ?t$r%+%W%;%k2=$9$k;EAH$_$,(B
1435: $B%b%8%e!<%k(B (module) $B$G$"$k(B.
1436: $B$O$8$a$K%b%8%e!<%k$rMQ$$$?%W%m%0%i%`$NNc$r$"$2$h$&(B.
1437: \E
1438: \BEG
1439: Function names and variables in a library may be
1440: encapsulated by module.
1441: Let us see an example of using module
1442: \E
1443:
1444: @example
1445: module stack;
1446:
1447: static Sp $
1448: Sp = 0$
1449: static Ssize$
1450: Ssize = 100$
1451: static Stack $
1452: Stack = newvect(Ssize)$
1453: localf push $
1454: localf pop $
1455:
1456: def push(A) @{
1457: if (Sp >= Ssize) @{print("Warning: Stack overflow\nDiscard the top"); pop();@}
1458: Stack[Sp] = A;
1459: Sp++;
1460: @}
1461: def pop() @{
1462: local A;
1463: if (Sp <= 0) @{print("Stack underflow"); return 0;@}
1464: Sp--;
1465: A = Stack[Sp];
1466: return A;
1467: @}
1468: endmodule;
1469:
1470: def demo() @{
1471: stack.push(1);
1472: stack.push(2);
1473: print(stack.pop());
1474: print(stack.pop());
1475: @}
1476: @end example
1477:
1478: \BJP
1479: $B%b%8%e!<%k$O(B @code{module} $B%b%8%e!<%kL>(B $B!A(B @code{endmodule}$B$G0O$`(B.
1.12 ! ohara 1480: $B%b%8%e!<%k$OF~$l;R$K$O$G$-$J$$(B.
1.8 takayama 1481: $B%b%8%e!<%k$NCf$@$1$G;H$&Bg0hJQ?t$O(B @code{static} $B$G@k8@$9$k(B.
1482: $B$3$NJQ?t$O%b%8%e!<%k$N30$+$i$O;2>H$b$G$-$J$$$7JQ99$b$G$-$J$$(B.
1483: $B%b%8%e!<%k$N30$NBg0hJQ?t$O(B @code{extern} $B$G@k8@$9$k(B.
1484: \E
1485: \BEG
1486: Module is encapsulated by the sentences
1487: @code{module} module name
1488: and
1489: @code{endmodule}.
1490: A variable of a module is declared with the key word @code{static}.
1491: The static variables cannot be refered nor changed out of the module,
1492: but it can be refered and changed in any functions in the module.
1493: A global variable which can be refered and changed at any place
1494: is declared with the key word @code{extern}.
1495: \E
1496:
1497: \BJP
1498: $B%b%8%e!<%kFbIt$GDj5A$9$k4X?t$O(B @code{localf} $B$rMQ$$$F@k8@$7$J$$$H$$$1$J$$(B.
1499: $B>e$NNc$G$O(B @code{push} $B$H(B @code{pop} $B$r@k8@$7$F$$$k(B.
1500: $B$3$N@k8@$OI,?\$G$"$k(B.
1501: \E
1502: \BEG
1503: Any function defined in a module must be declared forward
1504: with the keyword @code{localf}.
1505: In the example above, @code{push} and @code{pop} are declared.
1506: This declaration is necessary.
1507: \E
1508:
1509: \BJP
1510: $B%b%8%e!<%k(B @code{moduleName} $B$GDj5A$5$l$?4X?t(B @code{functionName} $B$r(B
1511: $B%b%8%e!<%k$N30$+$i8F$V$K$O(B
1512: @code{moduleName.functionName($B0z?t(B1, $B0z?t(B2, ... )}
1513: $B$J$k7A<0$G$h$V(B.
1514: $B%b%8%e!<%k$NCf$+$i$O(B, $B4X?tL>$N$_$G$h$$(B.
1515: $B<!$NNc$G$O(B, $B%b%8%e!<%k$N30$+$i%b%8%e!<%k(B @code{stack} $B$GDj5A$5$l$?4X?t(B @code{push},
1516: @code{pop} $B$r8F$s$G$$$k(B.
1517: \E
1518: \BEG
1519: A function @code{functionName} defined in a module @code{moduleName}
1520: can be called by the expression
1521: @code{moduleName.functioName(arg1, arg2, ...)}
1522: out of the module.
1523: Inside the module, @code{moduleName.} is not necessary.
1524: In the example below, the functions @code{push} and @code{pop} defined
1525: in the module @code{stack} are called out of the module.
1526: \E
1527:
1528: @example
1529: stack.push(2);
1530: print( stack.pop() );
1531: 2
1532: @end example
1533:
1534: \BJP
1535: $B%b%8%e!<%k$GMQ$$$k4X?tL>$O6I=jE*$G$"$k(B.
1536: $B$D$^$j%b%8%e!<%k$N30$dJL$N%b%8%e!<%k$GDj5A$5$l$F$$$k4X?tL>$HF1$8L>A0$,(B
1537: $BMxMQ$G$-$k(B.
1538: \E
1539: \BEG
1540: Any function name defined in a module is local.
1541: In other words, the same function name may be used out of the module
1542: to define a different function.
1543: \E
1544:
1545: \BJP
1546: $B%b%8%e!<%k5!G=$OBg5,LO%i%$%V%i%j$N3+H/$rA[Dj$7$F$$$k(B.
1547: $B%i%$%V%i%j$rI,MW$K1~$8$FJ,3d%m!<%I$9$k$K$O(B, $B4X?t(B @code{module_definedp} $B$rMQ$$$k$N$,(B
1548: $BJXMx$G$"$k(B.
1549: $B%G%^%s%I%m!<%I$O$?$H$($P<!$N$h$&$K9T$J$($PNI$$(B.
1550: \E
1551: \BEG
1552: The module structure of asir is introduced to develop large libraries.
1553: In order to load libraries on demand, the command @code{module_definedp}
1554: will be useful.
1555: The below is an example of demand loading.
1556: \E
1557:
1558: @example
1559: if (!module_definep("stack")) load("stack.rr") $
1560: @end example
1561:
1562: \BJP
1563: asir $B$G$O6I=jJQ?t$N@k8@$OITMW$G$"$C$?(B.
1564: $B$7$+$7%b%8%e!<%k(B stack $B$NNc$r8+$l$PJ,$+$k$h$&$K(B, @code{local A;} $B$J$k7A<0$G(B
1565: $B6I=jJQ?t$r@k8@$G$-$k(B.
1566: $B%-!<%o!<%I(B @code{local} $B$rMQ$$$k$H(B, $B@k8@5!G=$,M-8z$H$J$k(B.
1567: $B@k8@5!G=$rM-8z$K$9$k$H(B, $B@k8@$5$l$F$J$$JQ?t$O%m!<%I$NCJ3,$G(B
1568: $B%(%i!<$r5/$3$9(B.
1569: $BJQ?tL>$N%?%$%W%_%9$K$h$kM=4|$7$J$$%H%i%V%k$rKI$0$K$O(B,
1570: $B@k8@5!G=$rM-8z$K$7$F%W%m%0%i%`$9$k$N$,$h$$(B.
1571: \E
1572: \BEG
1573: It is not necessary to declare local variables in asir.
1574: As you see in the example of the stack module,
1575: we may declare local variables by the key word @code{local}.
1576: Once this key word is used, asir requires to declare all the
1577: variables.
1578: In order to avoid some troubles to develop a large libraries,
1579: it is recommended to use @code{local} declarations.
1580: \E
1581:
1582: \BJP
1583: $B%b%8%e!<%kFb$N4X?t$r$=$N%b%8%e!<%k$,Dj5A$5$l$kA0$K(B
1584: $B8F$S=P$9$h$&$J4X?t$r=q$/$H$-$K$O(B, $B$=$N4X?t$NA0$G%b%8%e!<%k$r<!$N$h$&$K(B
1585: $B%W%m%H%?%$%W@k8@$7$F$*$/I,MW$,$"$k(B.
1586: \E
1587: \BEG
1588: When we need to call a function in a module before the module is defined,
1589: we must make a prototype declaration as the example below.
1590: \E
1591:
1592: @example
1593: /* Prototype declaration of the module stack */
1594: module stack;
1595: localf push $
1596: localf pop $
1597: endmodule;
1598:
1599: def demo() @{
1600: print("----------------");
1601: stack.push(1);
1602: print(stack.pop());
1603: print("---------------");
1604: @}
1605:
1606: module stack;
1607: /* The body of the module stack */
1608: endmodule;
1609: @end example
1.12 ! ohara 1610:
! 1611: @table @t
! 1612: \JP @item $B;2>H(B
! 1613: \EG @item References
! 1614: @fref{module_list}, @fref{module_definedp}, @fref{remove_module}.
! 1615: @end table
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>