@menu
* Lisp与Maxima::            
* 垃圾收集::          
* 文档::               
* 帮助函数与变量::        
@end menu

@node Lisp与Maxima, 垃圾收集, 帮助, 帮助
@section Lisp and Maxima
Maxima是用Lisp写的,从Maxima里很容易访问Lisp的函数与变量,反之也一样.
Lisp与Maxima的标志符通过命名习惯来区分.
一个以美元符号@code{$}开始的Lisp标志符对应于一个没有美元符号的Maxima标志符.
@c NEED TO MENTION THIS OR IS IT JUST CLUTTERING ??
@c This includes special Maxima variables such as @code{%} and input and output labels,
@c which appear as @code{$%}, @code{$%i1}, @code{$%o1}, etc., in Lisp.

一个以问号@code{?}开始的Maxima标志符对应于一个没有问号的Lisp标志符.

例如Maxima标志符@code{foo}对应于Lisp标志符@code{$foo},而Maxima标志符@code{?foo}对应于Lisp标志符@code{foo},注意书写@code{?foo}时@code{?}与@code{foo}之间没有空格,否则可能会误认为是@code{describe ("foo")}.

连接号@code{-},星号@code{*}或者其它在Lisp中的标志符当它们出现在Maxima代码中时必须通过反斜杠@code{\}来转义.
例如,Lisp标志符 @code{*foo-bar*}在Maxima中要写成@code{?\*foo\-bar\*}.

Lisp代码可以在Maxima对话中执行.
包含一种或者多种形式的一行Lisp代码可以通过特殊命令command @code{:lisp}来执行.例如

@example
(%i1) :lisp (foo $x $y)
@end example
@noindent
将调用Lisp函数@code{foo},并以Maxima变量@code{x}与@code{y}作为参数. 
@code{:lisp} 结构能出现在交互式提示符中或者在一个通过@code{batch} 与 @code{demo}处理过的文件中,
但是不能出现在@code{load}, @code{batchload}, @code{translate_file}, 或 @code{compile_file}处理的文件中.

函数@code{to_lisp()}将开启一个交互式Lisp环境.
键入@code{(to-maxima)} 将关闭这个交互式环增色并返回Maxima.

@c I DON'T EVEN WANT TO MENTION USING CTRL-C TO OPEN A LISP SESSION.
@c (1) IT TAKES EXTRA SET UP TO GET STARTED NAMELY :lisp (setq *debugger-hook* nil)
@c (2) IT GETS SCREWED UP EASILY -- TYPE SOMETHING WRONG AND YOU CAN'T GET BACK TO MAXIMA
@c (3) IT DOESN'T OFFER FUNCTIONALITY NOT PRESENT IN THE to_lisp() SESSION

那些打算在Maxima中可见的只有普通的名字的Lsip函数与变量,它的Lisp名字必须以美元标志@code{$}开始.
Maxima是大小写敏感的,可以区分大写与小写字母的标志符,然而Lisp却不是.
有一些规则来控制这些名字在Lisp与Maxima中的变化.

@enumerate
@item
一个没有被竖条围住的Lisp标志符对应一个小写的Maxima标志符
无论Lisp标志符是大写,小写还是大小写混杂的都将被忽略,例如Lisp的@code{$foo}, @code{$FOO}, 和 @code{$Foo}都对应着Maxima的 @code{foo}.

@item
全大写或者全小写并且用竖条围住的Lisp标志符对应着Maxima的标志符大小写颠倒的.
即大写全部变成小写,小写全部变成大写.
如Lisp标志符Lisp @code{|$FOO|} 与 @code{|$foo|}各自对应着Maxima的@code{foo} 与 @code{FOO}.

@item
一个大小写混杂的并且用竖条围着Lisp标志符对应着Maxima同样的标志符,
例如Lisp标志符@code{|$Foo|}对应着Maxima中的@code{Foo}.
@end enumerate

Lisp宏@code{#$}允许在Lisp代码中运用Maxima表达式.
Lisp表达式@code{#$@var{expr}$}等同于 Maxima表达式@var{expr}.

@example
(msetq $foo #$[x, y]$)
@end example

@noindent
输入下面内容也起同样作用

@example
(%i1) foo: [x, y];
@end example

@noindent
Lisp函数@code{displa} 以Maxima格式输出一个表达式.

@example
(%i1) :lisp #$[x, y, z]$ 
((MLIST SIMP) $X $Y $Z)
(%i1) :lisp (displa '((MLIST SIMP) $X $Y $Z))
[x, y, z]
NIL
@end example

在Maxima中定义的函数不是普通的Lisp函数.
Lisp函数@code{mfuncall}调用一个Maxima函数.
例如:

@example
(%i1) foo(x,y) := x*y$
(%i2) :lisp (mfuncall '$foo 'a 'b)
((MTIMES SIMP) A B)
@end example

一些Lisp函数在Maxima包中是看不见的,它们是:

@code{complement},
@code{continue},
@code{//},
@code{float},
@code{functionp},
@code{array},
@code{exp},
@code{listen},
@code{signum},
@code{atan},
@code{asin},
@code{acos},
@code{asinh},
@code{acosh},
@code{atanh},
@code{tanh},
@code{cosh},
@code{sinh},
@code{tan},
@code{break},
和 @code{gcd}.


@node 垃圾收集,文档,Lisp与Maxima,帮助
@section 垃圾收集
符号运算很容易产生大量垃圾,有效的处理这些垃圾对一些程序的完成是非常重要的.

@c HOW MUCH OF THE FOLLOWING STILL HOLDS ??
@c WHAT ABOUT GC IN GCL ON MS WINDOWS ??
@c SHOULD WE SAY SOMETHING ABOUT GC FOR OTHER LISPS ??

GCL语言下可以调用UNIX系统(包括SUN OS4.0 及一些变种BSD)的mprotect系统,那是一种分层的垃圾收集功能.
这限制了最近写入的页的回收.参见GCL文档中ALLOCATE与GBC,在Lisp层次下使用(setq si::*notify-gbc* t)能帮助你决定哪一个层次需要更多空间.
@c上面这一段话翻译得不准,需改

@node 文档, 帮助有关函数与变量,垃圾收集,帮助 
@section 帮助

@c SHOULD TALK ABOUT OTHER FORMS OF DOCUMENTATION ASIDE FROM ON-LINE MANUAL.

Maxima在线用户手册可以通过多种形式阅读,在Maxima交互式命令行中,用户手册可以用@code{?}命令显示成普通文本(例如@code{describe} 函数),还可以显示成@code{info}超文本通过 @code{info} 显示程序来看,也可以通过网页通过网页浏览器来看.

@code{example} 显示了许多Maxima函数例子.
例如,

@example
(%i1) example (integrate);
@end example

将输出

@example
(%i2) test(f):=block([u],u:integrate(f,x),ratsimp(f-diff(u,x)))
(%o2) test(f) := block([u], u : integrate(f, x), 

                                         ratsimp(f - diff(u, x)))
(%i3) test(sin(x))
(%o3)                           0
(%i4) test(1/(x+1))
(%o4)                           0
(%i5) test(1/(x^2+1))
(%o5)                           0
@end example

和一些别的信息.

@node 帮助的函数与变量,文档,帮助
@section 与帮助有关的函数与变量

@deffn {Function} demo (@var{filename})
评估@var{filename}里Maxima表达式并显示结果.
@code{demo}将会在评估完每一个表达式后暂停,等待用户输入回车键继续.
如果是在Xmaxima里运行,@code{demo}可能需要输入一个分号@code{;}再按回车.

@code{demo} 搜索目录列表@code{file_search_demo} 来查找@code{filename}
如果文件有@code{dem}后缀,这个后缀可能会被省略掉. 参见@code{file_search}.


@code{demo} 计算它的参数.
@code{demo} 返回演示的文件名.

例子:

@example
(%i1) demo ("disol");

batching /home/wfs/maxima/share/simplification/disol.dem
 At the _ prompt, type ';' followed by enter to get next demo
(%i2)                      load(disol)

_
(%i3)           exp1 : a (e (g + f) + b (d + c))
(%o3)               a (e (g + f) + b (d + c))

_
(%i4)                disolate(exp1, a, b, e)
(%t4)                         d + c

(%t5)                         g + f

(%o5)                   a (%t5 e + %t4 b)

_
(%i5) demo ("rncomb");

batching /home/wfs/maxima/share/simplification/rncomb.dem
 At the _ prompt, type ';' followed by enter to get next demo
(%i6)                     load(rncomb)

_
                             z         x
(%i7)               exp1 : ----- + ---------
                           y + x   2 (y + x)
                          z         x
(%o7)                   ----- + ---------
                        y + x   2 (y + x)

_
(%i8)                     combine(exp1)
                          z         x
(%o8)                   ----- + ---------
                        y + x   2 (y + x)

_
(%i9)                     rncombine(%)
                             2 z + x
(%o9)                       ---------
                            2 (y + x)

_
                             d   c   b   a
(%i10)                exp2 : - + - + - + -
                             3   3   2   2
                          d   c   b   a
(%o10)                    - + - + - + -
                          3   3   2   2

_
(%i11)                    combine(exp2)
                      2 d + 2 c + 3 (b + a)
(%o11)                ---------------------
                                6

_
(%i12)                   rncombine(exp2)
                      2 d + 2 c + 3 b + 3 a
(%o12)                ---------------------
                                6

_
(%i13) 
@end example

@end deffn

@deffn {Function} describe (@var{string})
@deffnx {Function} describe (@var{string}, exact)
@deffnx {Function} describe (@var{string}, inexact)
@ifinfo
@fnindex Help
@end ifinfo

@code{describe(@var{string})} 等同于 @code{describe(@var{string}, exact)}.

@code{describe(@var{string}, exact)}查找一个名称等同于(大小写不敏感) @var{string}的子项, 当然要存在那么一个子项.

@code{describe(@var{string}, inexact)} 搜索所有标题中包含@var{string}的文档子项,
如果找到多于一个子项,Maxima将会询问用户显示哪一项或者多项.

在交互式命令行中@code{? foo} (@code{?} 与 @code{foo}中有一个空格)等同于@code{describe("foo", exact)},
@code{?? foo}等同于 @code{describe("foo", inexact)}.

@code{describe("", inexact)}将输出所有在线手册主题列表.

@code{describe}将它的参数括起来了.
如果@code{describe}找到文档将返回@code{true},否则返回@code{false}.
 
参见 @ref{Documentation}.

Example:

@example
(%i1) ?? integ
 0: Functions and Variables for Elliptic Integrals
 1: Functions and Variables for Integration
 2: Introduction to Elliptic Functions and Integrals
 3: Introduction to Integration
 4: askinteger  (Functions and Variables for Simplification)
 5: integerp  (Functions and Variables for Miscellaneous Options)
 6: integer_partitions  (Functions and Variables for Sets)
 7: integrate  (Functions and Variables for Integration)
 8: integrate_use_rootsof  (Functions and Variables for
    Integration)
 9: integration_constant_counter  (Functions and Variables for
    Integration)
 10: nonnegintegerp  (Functions and Variables for linearalgebra)
Enter space-separated numbers, `all' or `none': 7 8

 -- Function: integrate (<expr>, <x>)
 -- Function: integrate (<expr>, <x>, <a>, <b>)
     Attempts to symbolically compute the integral of <expr> with
     respect to <x>.  `integrate (<expr>, <x>)' is an indefinite
     integral, while `integrate (<expr>, <x>, <a>, <b>)' is a
     definite integral, [...]
     
 -- Option variable: integrate_use_rootsof
     Default value: `false'

     When `integrate_use_rootsof' is `true' and the denominator of
     a rational function cannot be factored, `integrate' returns
     the integral in a form which is a sum over the roots (not yet
     known) of the denominator.
     [...]
@end example

在这个例子中,子项7与子项8被选择了.可以用 @code{all}或者@code{none}来全选或全不选,也可以用它们的缩写形式,@code{a} 与 @code{n}.
@end deffn

@deffn {Function} example (@var{topic})
@deffnx {Function} example ()
@code{example (@var{topic})} 将显示 @var{topic}中的一些例子,var{topic}是符号而不是字符串.
许多题目都是函数名称.@code{example ()} 将返回所有认识的主题列表.
包含例子的文件名是通过全局变量@code{manual_demo}给定的,它的缺省值是 @code{"manual.demo"}.

@code{example} 括起了它的参数.
@code{example} 将返回 @code{done},如遇到错误或者没有参数@code{example}将返回所有认识的题目.

Examples:

@example
(%i1) example (append);
(%i2) append([x+y,0,-3.2],[2.5E+20,x])
(%o2)             [y + x, 0, - 3.2, 2.5E+20, x]
(%o2)                         done
(%i3) example (coeff);
(%i4) coeff(b+tan(x)+2*a*tan(x) = 3+5*tan(x),tan(x))
(%o4)                      2 a + 1 = 5
(%i5) coeff(1+x*%e^x+y,x,0)
(%o5)                         y + 1
(%o5)                         done
@end example

@end deffn

