version 1.5, 2000/09/23 07:53:24 |
version 1.11, 2003/12/01 02:13:38 |
|
|
@comment $OpenXM: OpenXM/src/asir-doc/parts/asir.texi,v 1.4 2000/01/26 01:37:32 noro Exp $ |
@comment $OpenXM: OpenXM/src/asir-doc/parts/asir.texi,v 1.10 2003/11/27 12:23:58 ohara Exp $ |
\BJP |
\BJP |
@node $B%f!<%68@8l(B Asir,,, Top |
@node $B%f!<%68@8l(B Asir,,, Top |
@chapter $B%f!<%68@8l(B Asir |
@chapter $B%f!<%68@8l(B Asir |
Line 258 comprehensible than use of structure like C programs. |
|
Line 258 comprehensible than use of structure like C programs. |
|
* $B$5$^$6$^$J<0(B:: |
* $B$5$^$6$^$J<0(B:: |
* $B%W%j%W%m%;%C%5(B:: |
* $B%W%j%W%m%;%C%5(B:: |
* $B%*%W%7%g%s;XDj(B:: |
* $B%*%W%7%g%s;XDj(B:: |
|
* $B%b%8%e!<%k(B:: |
\E |
\E |
\BEG |
\BEG |
* User defined functions:: |
* User defined functions:: |
Line 272 comprehensible than use of structure like C programs. |
|
Line 273 comprehensible than use of structure like C programs. |
|
* various expressions:: |
* various expressions:: |
* preprocessor:: |
* preprocessor:: |
* option:: |
* option:: |
|
* module:: |
\E |
\E |
@end menu |
@end menu |
|
|
|
|
@} |
@} |
return A; |
return A; |
@} |
@} |
|
|
|
@tex |
|
/* $A+B$ */ |
|
@end tex |
|
|
|
def add(A,B) |
|
"add two numbers." |
|
@{ |
|
return A+B; |
|
@} |
@end example |
@end example |
|
|
@noindent |
@noindent |
|
|
|
|
@noindent |
@noindent |
\BJP |
\BJP |
|
3 $B$DL\$NNc$G$O(B, $B0z?tJB$S$N$"$H$KJ8;zNs$,CV$+$l$F$$$k$,!"$3$l$O(B |
|
Emacs-Lisp $B$N4X?tDj5A$KN`;w$N5!G=$G!"%X%k%WMQ$NJ8;zNs$G$"$k!#(B |
|
$B$3$NNc$N>l9g!"(B@code{help(add)} $B$K$h$C$F$3$NJ8;zNs$,=PNO$5$l$k!#(B |
|
\E |
|
@table @t |
|
\JP @item $B;2>H(B |
|
\EG @item References |
|
@fref{help}. |
|
@end table |
|
|
|
@noindent |
|
\BJP |
$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 |
$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 |
$B$K$h$k%W%m%0%i%`$N=q$-J}$r2r@b$9$k(B. |
$B$K$h$k%W%m%0%i%`$N=q$-J}$r2r@b$9$k(B. |
\E |
\E |
|
|
@samp{/*} $B$,$$$/$D$"$C$F$b:G=i$N$b$N$N$_$,M-8z$H$J$j(B, $B:G=i$K8=$l$?(B |
@samp{/*} $B$,$$$/$D$"$C$F$b:G=i$N$b$N$N$_$,M-8z$H$J$j(B, $B:G=i$K8=$l$?(B |
@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 |
@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 |
$B$r4^$`2DG=@-$,$"$kItJ,$r%3%a%s%H%"%&%H$7$?>l9g$K$O(B, @code{#if 0}, |
$B$r4^$`2DG=@-$,$"$kItJ,$r%3%a%s%H%"%&%H$7$?>l9g$K$O(B, @code{#if 0}, |
@code{#endif}$B$r;H$($P$h$$(B. (@xref{$B%W%j%W%m%;%C%5(B}) |
@code{#endif}$B$r;H$($P$h$$(B. (@xref{$B%W%j%W%m%;%C%5(B}.) |
\E |
\E |
\BEG |
\BEG |
A comment can span to several lines, but it cannot be nested. |
A comment can span to several lines, but it cannot be nested. |
Line 585 in the subsequent text exist, and the comment terminat |
|
Line 609 in the subsequent text exist, and the comment terminat |
|
@samp{*/}. |
@samp{*/}. |
|
|
In order to comment out a program part that may contain comments in it, |
In order to comment out a program part that may contain comments in it, |
use the pair, @code{#if 0} and @code{#endif}. (@xref{preprocessor}) |
use the pair, @code{#if 0} and @code{#endif}. (@xref{preprocessor}.) |
\E |
\E |
|
|
@example |
@example |
|
|
\BJP |
\BJP |
$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. |
$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. |
$B$3$NC1J85Z$SN`;w$N(B @code{return} $BJ8(B, @code{break} $BJ8$J$I$,J8$N:G>.9=@.(B |
$B$3$NC1J85Z$SN`;w$N(B @code{return} $BJ8(B, @code{break} $BJ8$J$I$,J8$N:G>.9=@.(B |
$BC10L$H$J$k(B. @code{if} $BJ8$d(B @code{for} $BJ8$NDj5A(B (@xref{$BJ8K!$N>\:Y(B}) $B$r8+$l(B |
$BC10L$H$J$k(B. @code{if} $BJ8$d(B @code{for} $BJ8$NDj5A(B (@ref{$BJ8K!$N>\:Y(B}) $B$r8+$l(B |
$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 |
$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 |
$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, |
$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, |
@samp{@{} $B$H(B @samp{@}} $B$GJ8$NJB$S$r3g$C$F(B, $B0l$D$NJ8$H$7$F07$&$3$H$,$G(B |
@samp{@{} $B$H(B @samp{@}} $B$GJ8$NJB$S$r3g$C$F(B, $B0l$D$NJ8$H$7$F07$&$3$H$,$G(B |
Line 836 if ( expression1 ) @{ |
|
Line 860 if ( expression1 ) @{ |
|
@noindent |
@noindent |
\JP $B$H$7$J$1$l$P$J$i$J$$(B. |
\JP $B$H$7$J$1$l$P$J$i$J$$(B. |
|
|
|
\BJP |
|
@noindent |
|
$B4X?t$NCf$G$J$/(B, top level $B$G(B @code{if} $BJ8$rMQ$$$k$H$-$O(B @code{$} $B$^$?$O(B @code{;} |
|
$B$G=*N;$9$kI,MW$,$"$k(B. |
|
$B$3$l$i$,$J$$$H<!$NJ8$,$h$_$H$P$5$l$k(B. |
|
\E |
|
\BEG |
|
@noindent |
|
When @code{if} is used in the top level, the @code{if} expression should be |
|
terminated with @code{$} or @code{;}. |
|
If there is no terminator, the next expression will be skipped to be evaluated. |
|
\E |
|
|
\BJP |
\BJP |
@node $B%k!<%W(B break return continue,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B |
@node $B%k!<%W(B break return continue,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B |
@subsection $B%k!<%W(B, @code{break}, @code{return}, @code{continue} |
@subsection $B%k!<%W(B, @code{break}, @code{return}, @code{continue} |
|
|
|
|
@example |
@example |
\JP for ( $B<0JB$S(B-1; $B<0(B; $B<0JB$S(B-2 ) $BJ8(B |
\JP for ( $B<0JB$S(B-1; $B<0(B; $B<0JB$S(B-2 ) $BJ8(B |
\EG for ( expression list-1; expression; expression list-2 ) statement |
\EG for ( expr list-1; expr; expr list-2 ) statement |
@end example |
@end example |
|
|
\JP $B$G(B, $B$3$l$O(B |
\JP $B$G(B, $B$3$l$O(B |
Line 905 while ( $B<0(B ) @{ |
|
Line 942 while ( $B<0(B ) @{ |
|
@} |
@} |
\E |
\E |
\BEG |
\BEG |
expression list-1 (transformed into a sequence of simple statement) |
expr list-1 (transformed into a sequence of simple statement) |
while ( expression ) @{ |
while ( expr ) @{ |
statement |
statement |
expression list-2 (transformed into a sequence of simple statement) |
expr list-2 (transformed into a sequence of simple statement) |
@} |
@} |
\E |
\E |
@end example |
@end example |
Line 1137 There are special assignments combined with arithmetic |
|
Line 1174 There are special assignments combined with arithmetic |
|
|
|
@example |
@example |
\JP A = 2 A *= 3 ($B$3$l$O(B A = A*3 $B$HF1$8(B; $B$=$NB>$N1i;;;R$bF1MM(B) |
\JP A = 2 A *= 3 ($B$3$l$O(B A = A*3 $B$HF1$8(B; $B$=$NB>$N1i;;;R$bF1MM(B) |
\EG A = 2 A *= 3 (the same as A = A*3; The other combination are alike.) |
\EG A = 2 A *= 3 (the same as A = A*3; The others are alike.) |
@end example |
@end example |
@item |
@item |
\JP $BH!?t8F$S=P$7(B |
\JP $BH!?t8F$S=P$7(B |
Line 1163 A-- $BCM$O85$N(B A $B$NCM(B, A = A-1 |
|
Line 1200 A-- $BCM$O85$N(B A $B$NCM(B, A = A-1 |
|
\BEG |
\BEG |
A++ the expression value is the previous value of A, and A = A+1 |
A++ the expression value is the previous value of A, and A = A+1 |
A-- the expression value is the previous value of A, and A = A-1 |
A-- the expression value is the previous value of A, and A = A-1 |
++A A = A+1, and the expression value is the value after increment of A |
++A A = A+1, and the value is the one after increment of A |
--A A = A-1, and the expression value is the value after decrement of A |
--A A = A-1, and the value is the one after decrement of A |
\E |
\E |
@end example |
@end example |
|
|
Line 1270 because such comments cannot be nested. |
|
Line 1307 because such comments cannot be nested. |
|
#define MAX(a,b) ((a)>(b)?(a):(b)) |
#define MAX(a,b) ((a)>(b)?(a):(b)) |
@end example |
@end example |
|
|
|
\BJP |
|
@noindent |
|
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. |
|
$B$?$H$($P(B @code{LIST} $B$,Dj5A$5$l$F$$$F$b(B |
|
@code{LIST$}$B$OCV49$5$l$J$$(B. @code{$} $B$NA0$K6uGr$r$*$$$F(B |
|
@code{LIST $} $B$H=q$+$J$$$H$$$1$J$$(B. |
|
\E |
|
\BEG |
|
@noindent |
|
Since we are utilizing the C preprocessor, it cannot properly preprocess expressions |
|
with @code{$}. |
|
For example, even if @code{LIST} is defined, @code{LIST} in the expression |
|
@code{LIST$} is not replaced. Add a blank before @code{$}, i.e., |
|
write as @code{LIST $} to make the proprocessor replace it properly. |
|
\E |
|
|
\BJP |
\BJP |
@node $B%*%W%7%g%s;XDj(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B |
@node $B%*%W%7%g%s;XDj(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B |
Line 1355 After @samp{|} one can append any number of options se |
|
Line 1407 After @samp{|} one can append any number of options se |
|
@end example |
@end example |
|
|
|
|
|
\BJP |
|
@node $B%b%8%e!<%k(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B |
|
@subsection $B%b%8%e!<%k(B |
|
\E |
|
\BEG |
|
@node module,,, Writing user defined functions |
|
@subsection module |
|
\E |
|
|
|
\BJP |
|
$B%i%$%V%i%j$GDj5A$5$l$F$$$k4X?t(B, $BJQ?t$r%+%W%;%k2=$9$k;EAH$_$,(B |
|
$B%b%8%e!<%k(B (module) $B$G$"$k(B. |
|
$B$O$8$a$K%b%8%e!<%k$rMQ$$$?%W%m%0%i%`$NNc$r$"$2$h$&(B. |
|
\E |
|
\BEG |
|
Function names and variables in a library may be |
|
encapsulated by module. |
|
Let us see an example of using module |
|
\E |
|
|
|
@example |
|
module stack; |
|
|
|
static Sp $ |
|
Sp = 0$ |
|
static Ssize$ |
|
Ssize = 100$ |
|
static Stack $ |
|
Stack = newvect(Ssize)$ |
|
localf push $ |
|
localf pop $ |
|
|
|
def push(A) @{ |
|
if (Sp >= Ssize) @{print("Warning: Stack overflow\nDiscard the top"); pop();@} |
|
Stack[Sp] = A; |
|
Sp++; |
|
@} |
|
def pop() @{ |
|
local A; |
|
if (Sp <= 0) @{print("Stack underflow"); return 0;@} |
|
Sp--; |
|
A = Stack[Sp]; |
|
return A; |
|
@} |
|
endmodule; |
|
|
|
def demo() @{ |
|
stack.push(1); |
|
stack.push(2); |
|
print(stack.pop()); |
|
print(stack.pop()); |
|
@} |
|
@end example |
|
|
|
\BJP |
|
$B%b%8%e!<%k$O(B @code{module} $B%b%8%e!<%kL>(B $B!A(B @code{endmodule}$B$G0O$`(B. |
|
$B%b%8%e!<%k$NCf$@$1$G;H$&Bg0hJQ?t$O(B @code{static} $B$G@k8@$9$k(B. |
|
$B$3$NJQ?t$O%b%8%e!<%k$N30$+$i$O;2>H$b$G$-$J$$$7JQ99$b$G$-$J$$(B. |
|
$B%b%8%e!<%k$N30$NBg0hJQ?t$O(B @code{extern} $B$G@k8@$9$k(B. |
|
\E |
|
\BEG |
|
Module is encapsulated by the sentences |
|
@code{module} module name |
|
and |
|
@code{endmodule}. |
|
A variable of a module is declared with the key word @code{static}. |
|
The static variables cannot be refered nor changed out of the module, |
|
but it can be refered and changed in any functions in the module. |
|
A global variable which can be refered and changed at any place |
|
is declared with the key word @code{extern}. |
|
\E |
|
|
|
\BJP |
|
$B%b%8%e!<%kFbIt$GDj5A$9$k4X?t$O(B @code{localf} $B$rMQ$$$F@k8@$7$J$$$H$$$1$J$$(B. |
|
$B>e$NNc$G$O(B @code{push} $B$H(B @code{pop} $B$r@k8@$7$F$$$k(B. |
|
$B$3$N@k8@$OI,?\$G$"$k(B. |
|
\E |
|
\BEG |
|
Any function defined in a module must be declared forward |
|
with the keyword @code{localf}. |
|
In the example above, @code{push} and @code{pop} are declared. |
|
This declaration is necessary. |
|
\E |
|
|
|
\BJP |
|
$B%b%8%e!<%k(B @code{moduleName} $B$GDj5A$5$l$?4X?t(B @code{functionName} $B$r(B |
|
$B%b%8%e!<%k$N30$+$i8F$V$K$O(B |
|
@code{moduleName.functionName($B0z?t(B1, $B0z?t(B2, ... )} |
|
$B$J$k7A<0$G$h$V(B. |
|
$B%b%8%e!<%k$NCf$+$i$O(B, $B4X?tL>$N$_$G$h$$(B. |
|
$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}, |
|
@code{pop} $B$r8F$s$G$$$k(B. |
|
\E |
|
\BEG |
|
A function @code{functionName} defined in a module @code{moduleName} |
|
can be called by the expression |
|
@code{moduleName.functioName(arg1, arg2, ...)} |
|
out of the module. |
|
Inside the module, @code{moduleName.} is not necessary. |
|
In the example below, the functions @code{push} and @code{pop} defined |
|
in the module @code{stack} are called out of the module. |
|
\E |
|
|
|
@example |
|
stack.push(2); |
|
print( stack.pop() ); |
|
2 |
|
@end example |
|
|
|
\BJP |
|
$B%b%8%e!<%k$GMQ$$$k4X?tL>$O6I=jE*$G$"$k(B. |
|
$B$D$^$j%b%8%e!<%k$N30$dJL$N%b%8%e!<%k$GDj5A$5$l$F$$$k4X?tL>$HF1$8L>A0$,(B |
|
$BMxMQ$G$-$k(B. |
|
\E |
|
\BEG |
|
Any function name defined in a module is local. |
|
In other words, the same function name may be used out of the module |
|
to define a different function. |
|
\E |
|
|
|
\BJP |
|
$B%b%8%e!<%k5!G=$OBg5,LO%i%$%V%i%j$N3+H/$rA[Dj$7$F$$$k(B. |
|
$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 |
|
$BJXMx$G$"$k(B. |
|
$B%G%^%s%I%m!<%I$O$?$H$($P<!$N$h$&$K9T$J$($PNI$$(B. |
|
\E |
|
\BEG |
|
The module structure of asir is introduced to develop large libraries. |
|
In order to load libraries on demand, the command @code{module_definedp} |
|
will be useful. |
|
The below is an example of demand loading. |
|
\E |
|
|
|
@example |
|
if (!module_definep("stack")) load("stack.rr") $ |
|
@end example |
|
|
|
\BJP |
|
asir $B$G$O6I=jJQ?t$N@k8@$OITMW$G$"$C$?(B. |
|
$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 |
|
$B6I=jJQ?t$r@k8@$G$-$k(B. |
|
$B%-!<%o!<%I(B @code{local} $B$rMQ$$$k$H(B, $B@k8@5!G=$,M-8z$H$J$k(B. |
|
$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 |
|
$B%(%i!<$r5/$3$9(B. |
|
$BJQ?tL>$N%?%$%W%_%9$K$h$kM=4|$7$J$$%H%i%V%k$rKI$0$K$O(B, |
|
$B@k8@5!G=$rM-8z$K$7$F%W%m%0%i%`$9$k$N$,$h$$(B. |
|
\E |
|
\BEG |
|
It is not necessary to declare local variables in asir. |
|
As you see in the example of the stack module, |
|
we may declare local variables by the key word @code{local}. |
|
Once this key word is used, asir requires to declare all the |
|
variables. |
|
In order to avoid some troubles to develop a large libraries, |
|
it is recommended to use @code{local} declarations. |
|
\E |
|
|
|
\BJP |
|
$B%b%8%e!<%kFb$N4X?t$r$=$N%b%8%e!<%k$,Dj5A$5$l$kA0$K(B |
|
$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 |
|
$B%W%m%H%?%$%W@k8@$7$F$*$/I,MW$,$"$k(B. |
|
\E |
|
\BEG |
|
When we need to call a function in a module before the module is defined, |
|
we must make a prototype declaration as the example below. |
|
\E |
|
|
|
@example |
|
/* Prototype declaration of the module stack */ |
|
module stack; |
|
localf push $ |
|
localf pop $ |
|
endmodule; |
|
|
|
def demo() @{ |
|
print("----------------"); |
|
stack.push(1); |
|
print(stack.pop()); |
|
print("---------------"); |
|
@} |
|
|
|
module stack; |
|
/* The body of the module stack */ |
|
endmodule; |
|
@end example |