translation.ss
(module translation mzscheme
  
  (define (translate hash-table)
    (lambda (exp)
      (let ((op (hash-table-get hash-table
                                (car exp)
                                (lambda () #f))))
        (cond ((symbol? op)
               (cons op (cdr exp)))
              (op ;(procedure? op)
               (apply op (cdr exp)))
              (else
               exp)))))
  
  (define Scheme->Mathematica
    (translate
      (make-immutable-hash-table
        `((* . Times)
          (- . ,(case-lambda
                  ((x) (list 'Minus x))
                  ((x y) (list 'Subtract x y))
                  ((x . y)
                   `(Plus ,x
                          ,@(map (lambda (z)
                                   (list '- z))
                                 y)))))
          (+ . 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)
          (odd? . OddQ)
          (or . Or)
          (positive? . Positive)
          (quotient . Quotient)
          (rationalize . Rationalize)
          (round . Round)
          (sin . Sin)
          (sqrt . Sqrt)
          (tan . Tan)
          (truncate . IntegerPart)))))
  
  (define Mathematica->Scheme
    (translate
      (make-immutable-hash-table
        `((Times . *)
          (Plus . +)
          (Less . <)
          (LessEqual . <=)
          (Equal . =)
          (Greater . >)
          (GreaterEqual . >=)
          (ArcCos . acos)
          (And . and)
          (Arg . angle)
          (ArcSin . asin)
          (ArcTan . atan)
          (Author . ,(case-lambda
                       (() "朱崇恺")
                       (any (cons 'Author any))))
          (CompoundExpression . begin)
          (Ceiling . ceiling)
          (Cos . cos)
          (Denominator . denominator)
          (DirectedInfinity . ,(case-lambda
                                 ((z)
                                  (cond ((equal? z 1) +inf.0)
                                        ((equal? z -1) -inf.0)
                                        (else (list 'DirectedInfinity z))))
                                 (any (cons 'DirectedInfinity any))))
          (Exp . exp)
          (Power . expt)
          (Floor . floor)
          (GCD . gcd)
          (If . if)
          (Im . imag-part)
          (LCM . lcm)
          (List . list)
          (Log . log)
          (Abs . magnitude)
          (Max . max)
          (Min . min)
          (Mod . modulo)
          (Negative . negative?)
          (Not . not)
          (NumberQ . number?)
          (Numerator . numerator)
          (OddQ . odd?)
          (Or . or)
          (Positive . positive?)
          (Quotient . quotient)
          (Rationalize . rationalize)
          (Round . round)
          (Sin . sin)
          (Sqrt . sqrt)
          (Tan . tan)
          (IntegerPart . truncate)
          (Rational . ,(lambda (n d)
                         (/ n d)))
          (Complex . ,(lambda (r i)
                        (make-rectangular r i)))))))
  
  (provide Scheme->Mathematica
           Mathematica->Scheme))