MrMathematica * Zhu ChongKai

  _MrMathematica_  *  _Zhu ChongKai_

MrMathematica allows you to call _Mathematica_ from Scheme.

> MathKernel : [byte-string*] -> MathLink

Load the Mathematica kernel and return a _MathLink_. The argument(s) 
is command to open the MathLink connection. If not presented, 
MrMathematica will use #"-linkname" #"math -MathLink" as default, 
which in general will always open the Mathematica kernel. See the 
Mathmatica Book 2.13.14 "Running Mathematica from Within an External 
Program" for more about this. The return value, a MathLink, is a 
value indicates the Mathematica kernel. It can be save to a variable 
and later used to distinguish different Mathematica kernel.

> MathEval : S-exp [MathLink] -> S-exp

Use Mathematica Kernel to evaluate. You should write the S-exp in 
Scheme style and they will be translated to Mathematica style 
automatically. Only numbers, booleans, symbols, strings, voids or 
none empty lists are allowed in the input. Otherwise 
exn:application:contract will be raised.

The optional argment, MathLink, specifies using which Mathematica 
kernel to do the computation. If no MathLink is given, MrMathematica 
will use the current-mathlink, or if current-mathlink is #f, call 
(MathKernel) to create one.

> MathExit : [MathLink] -> void

Close the Mathematica Kernel. Please avoid using closed MathLink, 
otherwise an error will be raised.

> MathLink? : exp -> boolean

Check whether the argument is a MathLink.

> current-mathlink

A parameter procedure that sets and retrieves the default MathLink to 
use. #f indicates no current MathLink. Each time MathKernel was 
called, the return value will be automatically set as current-mathlink.

Translation between Scheme and Mathematica: 

S-exp such as '(f x y) will be translated to f[x,y] and send to 
Mathematica Kernel. The return expression of Mathematica will be 
translated back into Scheme. Besides that, MrMathematica also use the 
following dictionary to translate function names:

'((* . Times)
  (- . Minus)
  (+ . Plus)
  (/ . Divide)
  (< . Less)
  (<= . LessEqual)
  (= . Equal)
  (> . Greater)
  (>= . GreaterEqual)
  (abs . Abs)
  (acos . ArcCos)
  (and . And)
  (angle . Arg)
  (asin . ArcSin)
  (atan . ArcTan)
  (begin . CompoundExpression)
  (ceiling . Ceiling)
  (cos . Cos)
  (denominator . Denominator)
  (exp . Exp)
  (expt . Power)
  (floor . Floor)
  (gcd . GCD)
  (if . If)
  (imag-part . Im)
  (lcm . LCM)
  (list . List)
  (log . Log)
  (magnitude . Abs)
  (max . Max)
  (min . Min)
  (modulo . Mod)
  (negative? . Negative)
  (not . Not)
  (number? . NumberQ)
  (numerator . Numerator)
  (or . Or)
  (positive? . Positive)
  (quotient . Quotient)
  (rationalize . Rationalize)
  (round . Round)
  (sin . Sin)
  (sqrt . Sqrt)
  (string-length . StringLength)
  (tan . Tan)
  (truncate . IntegerPart))

The translation table is defined in "". If you just 
want no translation, change this file so that it provides the 
identity function.

There are some other functions that are similar in Mathematica and 
Scheme. According to the need, you can also add translation rules 
into the table. Here I list some such function pairs: 

append  Join
apply  Apply
build-list  Array
car  First
cdr  Rest
collect-garbage  Share
compose  Composition
cond  Which
cons  Prepend
copy-file  CopyFile/CopyDirectory
current-directory  Directory/SetDirectory
current-memory-use  MemoryInUse
current-process-milliseconds  TimeUsed
current-seconds  AbsoluteTime
define  Set
delay  Hold/Unevaluated
delete-directory  DeleteDirectory
delete-file  DeleteFile
directory-list  FileNames
display  Print
even?  EvenQ
exit  Exit/Quit
file-or-directory-modify-seconds  FileDate/SetFileDate
file-size  FileByteCount
filter  Select
fluid-let  Block
foldl  Fold
for-each  Scan
force  ReleaseHold/Evaluate
getenv  Environment
identity  Identity
integer?  IntegerQ
lambda  Function
length  Length
let  Module
list-ref  Part
list-tail  Drop
map  Map
make-directory  CreateDirectory
member/memq/memv  MemberQ
nand  Nand
nor  Nor
odd?  OddQ
pair?  AtomQ
read  Input
rename-file-or-directory  RenameFile/RenameDirectory
reverse  Reverse
shell-execute  Run/RunThrough
sleep  Pause
string->symbol  Symbol
string-append  StringJoin
symbol->string  SymbolName
system-type  $System
time  Timing
version  $Version
zero?  ZeroQ

Notice that they are not identical so some rules should be 
conditional. Learn the default rule of '- for details.