[BACK]Return to asir.texi CVS log [TXT][DIR] Up to [local] / OpenXM / src / asir-doc / parts

Diff for /OpenXM/src/asir-doc/parts/asir.texi between version 1.7 and 1.16

version 1.7, 2003/04/20 08:01:25 version 1.16, 2004/07/04 00:16:43
Line 1 
Line 1 
 @comment $OpenXM: OpenXM/src/asir-doc/parts/asir.texi,v 1.6 2002/09/03 01:50:57 noro Exp $  @comment $OpenXM: OpenXM/src/asir-doc/parts/asir.texi,v 1.15 2004/07/03 15:50:34 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 227  Use of lists enables to write programs more easily, sh
Line 227  Use of lists enables to write programs more easily, sh
 comprehensible than use of structure like C programs.  comprehensible than use of structure like C programs.
 \E  \E
   
   \BJP
 @item  @item
   $B%f!<%6Dj5AH!?t$K$*$1$k0l9T%X%k%W(B.  Emacs-Lisp $B$KN`;w$7$?5!G=$G$"$k(B.
   $B>\$7$/$O(B, @xref{$B%f!<%6Dj5AH!?t(B} $B$r8+$h(B.
   \E
   
   @item
 \JP $B%f!<%6Dj5AH!?t$K$*$1$k%*%W%7%g%s;XDj(B.  \JP $B%f!<%6Dj5AH!?t$K$*$1$k%*%W%7%g%s;XDj(B.
 \EG Options can be specified in calling user defined functions.  \EG Options can be specified in calling user defined functions.
   
Line 236  comprehensible than use of structure like C programs.
Line 242  comprehensible than use of structure like C programs.
 @end itemize  @end itemize
   
 \BJP  \BJP
   @noindent
   Asir $B$G$O<!$N8l6g$,%-!<%o!<%I$H$7$FDj$a$i$l$F$$$k(B.
   @itemize
   @item C $B8@8l$KM3Mh(B:
   
   @code{break}, @code{continue}, @code{do}, @code{else}, @code{extern},
   @code{for}, @code{if}, @code{return}, @code{static}, @code{struct},
   @code{while}
   @item C $B8@8l$+$i$N3HD%(B:
   
   @code{def}, @code{endmodule}, @code{function}, @code{global},
   @code{local}, @code{localf}, @code{module}
   @item $BH!?t(B:
   
   @code{car}, @code{cdr}, @code{getopt}, @code{newstruct}, @code{map},
   @code{pari}, @code{quote}, @code{recmap}, @code{timer}
   @end itemize
   \E
   
   \BJP
 @node $B%f!<%6Dj5AH!?t$N=q$-J}(B,,, $B%f!<%68@8l(B Asir  @node $B%f!<%6Dj5AH!?t$N=q$-J}(B,,, $B%f!<%68@8l(B Asir
 @section $B%f!<%6Dj5AH!?t$N=q$-J}(B  @section $B%f!<%6Dj5AH!?t$N=q$-J}(B
 \E  \E
Line 258  comprehensible than use of structure like C programs.
Line 284  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 299  comprehensible than use of structure like C programs.
 * various expressions::  * various expressions::
 * preprocessor::  * preprocessor::
 * option::  * option::
   * module::
 \E  \E
 @end menu  @end menu
   
Line 347  def c(N)
Line 375  def c(N)
         @}          @}
     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
Line 372  ICJ
Line 410  ICJ
   
 @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
Line 436  All the program variables are initialized to the value
Line 486  All the program variables are initialized to the value
   
 \BJP  \BJP
 @item $BITDj85(B  @item $BITDj85(B
 $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  $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,
   $B$^$?$O%7%s%0%k%/%*!<%H$G0O$^$l$?J8;zNs(B, $B$b$7$/$OH!?t7A<0(B.
 $BITDj85$H$O(B, $BB?9`<04D$r9=@.$9$k:]$KE:2C$5$l$kJQ?t$r$$$&(B. @b{Asir} $B$K(B  $BITDj85$H$O(B, $BB?9`<04D$r9=@.$9$k:]$KE:2C$5$l$kJQ?t$r$$$&(B.  @b{Asir} $B$K(B
 $B$*$$$F$O(B, $BITDj85$OCM$r$b$?$J$$D61[E*$J85$G$"$j(B, $BITDj85$X$NCM$NBeF~$O(B  $B$*$$$F$O(B, $BITDj85$OCM$r$b$?$J$$D61[E*$J85$G$"$j(B, $BITDj85$X$NCM$NBeF~$O(B
 $B5v$5$l$J$$(B.  $B5v$5$l$J$$(B.
 \E  \E
Line 457  An indeterminate cannot have any value.  No assignment
Line 507  An indeterminate cannot have any value.  No assignment
 x  x
 [4] X^2+X+1;  [4] X^2+X+1;
 x^2+x+1  x^2+x+1
   [5] A='Dx'*(x-1)+x*y-y;
   (y+Dx)*x-y-Dx
   [6] function foo(x,y);
   [7] B=foo(x,y)*x^2-1;
   foo(x,y)*x^2-1
 @end example  @end example
 @end table  @end table
   
Line 836  if ( expression1 ) @{
Line 891  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}
Line 1003  statement, and the termination condition will be evalu
Line 1071  statement, and the termination condition will be evalu
 \BJP  \BJP
 $B9=B$BN$H$O(B, $B3F@.J,$NMWAG$,L>A0$G%"%/%;%9$G$-$k8GDjD9G[Ns$H;W$C$F$h$$(B.  $B9=B$BN$H$O(B, $B3F@.J,$NMWAG$,L>A0$G%"%/%;%9$G$-$k8GDjD9G[Ns$H;W$C$F$h$$(B.
 $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.  $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.
   $B9=B$BN$,@k8@$5$l$k$H$-(B, asir $B$OFbIt$G9=B$BN$N$=$l$>$l$N7?$K8GM-$N<1JL(B
   $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
   $B$G$-$k(B.
 $B$"$k7?$N9=B$BN$O(B, $BAH$_9~$_4X?t(B @code{newstruct} $B$K$h$j@8@.$5$l$k(B.  $B$"$k7?$N9=B$BN$O(B, $BAH$_9~$_4X?t(B @code{newstruct} $B$K$h$j@8@.$5$l$k(B.
 $B9=B$BN$N3F%a%s%P$O(B, $B1i;;;R(B @code{->} $B$K$h$j%"%/%;%9$9$k(B.  $B9=B$BN$N3F%a%s%P$O(B, $B1i;;;R(B @code{->} $B$K$h$j%"%/%;%9$9$k(B.
 $B%a%s%P$,9=B$BN$N>l9g(B, @code{->} $B$K$h$k;XDj$OF~$l;R$K$G$-$k(B.  $B%a%s%P$,9=B$BN$N>l9g(B, @code{->} $B$K$h$k;XDj$OF~$l;R$K$G$-$k(B.
Line 1029  by @code{->} can be nested.
Line 1100  by @code{->} can be nested.
 2  2
 [5] A;  [5] A;
 @{1,2@}  @{1,2@}
   [6] struct_type(A);
   1
 @end example  @end example
   
   @table @t
   \JP @item $B;2>H(B
   \EG @item References
   @fref{newstruct}, @fref{struct_type}
   @end table
   
 \BJP  \BJP
 @node $B$5$^$6$^$J<0(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B  @node $B$5$^$6$^$J<0(B,,, $B%f!<%6Dj5AH!?t$N=q$-J}(B
 @subsection $B$5$^$6$^$J<0(B  @subsection $B$5$^$6$^$J<0(B
Line 1200  through @code{cpp}.  This enables @b{Asir} user to use
Line 1279  through @code{cpp}.  This enables @b{Asir} user to use
 @code{#include}  @code{#include}
 @*  @*
 \BJP  \BJP
 @code{cpp} $B$KFC$K0z?t$rEO$5$J$$$?$a(B, $B%$%s%/%k!<%I%U%!%$%k$O(B,  UNIX $B$G$O(B $B%$%s%/%k!<%I%U%!%$%k$O(B, Asir $B$N%i%$%V%i%j%G%#%l%/%H%j(B
 @code{#include} $B$,=q$+$l$F$$$k%U%!%$%k$HF1$8%G%#%l%/%H%j$G%5!<%A$5$l$k(B.  ($B4D6-JQ?t(B @b{ASIR_LIBDIR} $B$G;XDj$5$l$?%G%#%l%/%H%j(B)
   $B$H(B @code{#include} $B$,=q$+$l$F$$$k%U%!%$%k$HF1$8%G%#%l%/%H%j$r%5!<%A$9$k(B.
   UNIX $B0J30$G$O(B @code{cpp} $B$KFC$K0z?t$rEO$5$J$$$?$a(B,
   @code{#include} $B$,=q$+$l$F$$$k%U%!%$%k$HF1$8%G%#%l%/%H%j$N$_$r%5!<%A$9$k(B.
 \E  \E
 \BEG  \BEG
 Include files are searched within the same directory as the file  Include files are searched within the same directory as the file
Line 1270  because such comments cannot be nested.
Line 1352  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 1354  After @samp{|} one can append any number of options se
Line 1451  After @samp{|} one can append any number of options se
 [100] xxx(1,2,x^2-1,[1,2,3]|proc=1,index=5);  [100] xxx(1,2,x^2-1,[1,2,3]|proc=1,index=5);
 @end example  @end example
   
   \BJP
   $B$5$i$K(B, $B%*%W%7%g%s$r(B @code{key1=value1,key2=value2,...} $B$N$h$&$K(B
   @samp{,} $B$G6h@Z$C$FEO$9Be$o$j$K(B, $BFCJL$J%-!<%o!<%I(B @code{option_list}
   $B$H%*%W%7%g%s%j%9%H(B @code{[["key1",value1],["key2",value2],...]}
   $B$rMQ$$$FEO$9$3$H$b2DG=$G$"$k(B.
   \E
   \BEG
   Optinal arguments may be given as a list
   with the key word @code{option_list}
   as
   @code{option_list=[["key1",value1],["key2",value2],...]}.
   It is equivalent to pass the optional arguments as
   @code{key1=value1,key2=value2,...}.
   \E
   
   @example
   [101] dp_gr_main([x^2+y^2-1,x*y-1]|option_list=[["v",[x,y]],["order",[[x,5,y,1]]]]);
   @end example
   
   \BJP
   $BFC$K(B, $B0z?t$J$7$N(B @code{getopt()} $B$O%*%W%7%g%s%j%9%H$rJV$9$N$G(B,
   $B%*%W%7%g%s$r$H$k4X?t$+$i(B, $B%*%W%7%g%s$r$H$k4X?t$r8F$S=P$9$H$-$K$OM-MQ$G$"$k(B.
   \E
   \BEG
   Since @code{getopt()} returns an option list,
   the optional argument @code{option_list=...} is useful when
   we call functions with optional arguments from
   a function with optional arguments to pass
   the all optional parameters.
   \E
   
   @example
   % cat foo.rr
   def foo(F)
   @{
       OPTS=getopt();
       return factor(F|option_list=OPTS);
   @}
   @end example
   
   @example
   [3] load("foo.rr")$
   [4] foo(x^5-1|mod=11);
   [[1,1],[x+6,1],[x+2,1],[x+10,1],[x+7,1],[x+8,1]]
   @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$OF~$l;R$K$O$G$-$J$$(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
   
   @table @t
   \JP @item $B;2>H(B
   \EG @item References
   @fref{module_list}, @fref{module_definedp}, @fref{remove_module}.
   @end table

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.16

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>