# HG changeset patch # User Miles Bader # Date 1198896717 0 # Node ID 1ae1f40664396d8424ffc5b64203fd80fc9a57b3 # Parent 56a72e2bd635a92105b108d47ab9c51b2c728ed8# Parent b914acf51c53004e1c1c186a5276bdfb6048d3e2 Merge from emacs--devo--0 Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-307 diff -r 56a72e2bd635 -r 1ae1f4066439 doc/misc/ChangeLog --- a/doc/misc/ChangeLog Sat Dec 29 02:39:17 2007 +0000 +++ b/doc/misc/ChangeLog Sat Dec 29 02:51:57 2007 +0000 @@ -1,3 +1,8 @@ +2007-12-29 Jay Belanger + + * calc.tex (Yacas Language, Maxima Language, Giac Language): + New sections. + 2007-12-29 Reiner Steib * gnus.texi (Group Parameters): Reorder the text and add a note about diff -r 56a72e2bd635 -r 1ae1f4066439 doc/misc/calc.texi --- a/doc/misc/calc.texi Sat Dec 29 02:39:17 2007 +0000 +++ b/doc/misc/calc.texi Sat Dec 29 02:51:57 2007 +0000 @@ -13802,6 +13802,9 @@ * C FORTRAN Pascal:: * TeX and LaTeX Language Modes:: * Eqn Language Mode:: +* Yacas Language Mode:: +* Maxima Language Mode:: +* Giac Language Mode:: * Mathematica Language Mode:: * Maple Language Mode:: * Compositions:: @@ -13965,13 +13968,13 @@ parentheses for both function calls and array subscripts, Calc displays both in the same way; @samp{a(i)} is interpreted as a function call upon reading, and subscripts must be entered as @samp{subscr(a, i)}. -Also, if the variable @code{a} has been declared to have type -@code{vector} or @code{matrix} then @samp{a(i)} will be parsed as a -subscript. (@xref{Declarations}.) Usually it doesn't matter, though; -if you enter the subscript expression @samp{a(i)} and Calc interprets -it as a function call, you'll never know the difference unless you -switch to another language mode or replace @code{a} with an actual -vector (or unless @code{a} happens to be the name of a built-in +If the variable @code{a} has been declared to have type +@code{vector} or @code{matrix}, however, then @samp{a(i)} will be +parsed as a subscript. (@xref{Declarations}.) Usually it doesn't +matter, though; if you enter the subscript expression @samp{a(i)} and +Calc interprets it as a function call, you'll never know the difference +unless you switch to another language mode or replace @code{a} with an +actual vector (or unless @code{a} happens to be the name of a built-in function!). Underscores are allowed in variable and function names in all of these @@ -14404,7 +14407,7 @@ @sp 2 @end iftex -@node Eqn Language Mode, Mathematica Language Mode, TeX and LaTeX Language Modes, Language Modes +@node Eqn Language Mode, Yacas Language Mode, TeX and LaTeX Language Modes, Language Modes @subsection Eqn Language Mode @noindent @@ -14480,7 +14483,87 @@ for @code{ccol} during input, and are generated instead of @code{ccol} if the matrix justification mode so specifies. -@node Mathematica Language Mode, Maple Language Mode, Eqn Language Mode, Language Modes +@node Yacas Language Mode, Maxima Language Mode, Eqn Language Mode, Language Modes +@subsection Yacas Language Mode + +@noindent +@kindex d Y +@pindex calc-yacas-language +@cindex Yacas language +The @kbd{d Y} (@code{calc-yacas-language}) command selects the +conventions of Yacas, a free computer algebra system. While the +operators and functions in Yacas are similar to those of Calc, the names +of built-in functions in Yacas are capitalized. The Calc formula +@samp{sin(2 x)}, for example, is entered and displayed @samp{Sin(2 x)} +in Yacas mode, and `@samp{arcsin(x^2)} is @samp{ArcSin(x^2)} in Yacas +mode. Complex numbers are written are written @samp{3 + 4 I}. +The standard special constants are written @code{Pi}, @code{E}, +@code{I}, @code{GoldenRatio} and @code{Gamma}. @code{Infinity} +represents both @code{inf} and @code{uinf}, and @code{Undefined} +represents @code{nan}. + +Certain operators on functions, such as @code{D} for differentiation +and @code{Integrate} for integration, take a prefix form in Yacas. For +example, the derivative of @w{@samp{e^x sin(x)}} can be computed with +@w{@samp{D(x) Exp(x)*Sin(x)}}. + +Other notable differences between Yacas and standard Calc expressions +are that vectors and matrices use curly braces in Yacas, and subscripts +use square brackets. If, for example, @samp{A} represents the list +@samp{@{a,2,c,4@}}, then @samp{A[3]} would equal @samp{c}. + + +@node Maxima Language Mode, Giac Language Mode, Yacas Language Mode, Language Modes +@subsection Maxima Language Mode + +@noindent +@kindex d X +@pindex calc-maxima-language +@cindex Maxima language +The @kbd{d X} (@code{calc-maxima-language}) command selects the +conventions of Maxima, another free computer algebra system. The +function names in Maxima are similar, but not always identical, to Calc. +For example, instead of @samp{arcsin(x)}, Maxima will use +@samp{asin(x)}. Complex numbers are written @samp{3 + 4 %i}. The +standard special constants are written @code{%pi}, @code{%e}, +@code{%i}, @code{%phi} and @code{%gamma}. In Maxima, @code{inf} means +the same as in Calc, but @code{infinity} represents Calc's @code{uinf}. + +Underscores as well as percent signs are allowed in function and +variable names in Maxima mode. The underscore again is equivalent to +the @samp{#} in Normal mode, and the percent sign is equivalent to +@samp{o'o}. + +Maxima uses square brackets for lists and vectors, and matrices are +written as calls to the function @code{matrix}, given the row vectors of +the matrix as arguments. Square brackets are also used as subscripts. + +@node Giac Language Mode, Mathematica Language Mode, Maxima Language Mode, Language Modes +@subsection Giac Language Mode + +@noindent +@kindex d A +@pindex calc-giac-language +@cindex Giac language +The @kbd{d A} (@code{calc-giac-language}) command selects the +conventions of Giac, another free computer algebra system. The function +names in Giac are similar to Maxima. Complex numbers are written +@samp{3 + 4 i}. The standard special constants in Giac are the same as +in Calc, except that @code{infinity} represents both Calc's @code{inf} +and @code{uinf}. + +Underscores are allowed in function and variable names in Giac mode. +Brackets are used for subscripts. In Giac, indexing of lists begins at +0, instead of 1 as in Calc. So if @samp{A} represents the list +@samp{[a,2,c,4]}, then @samp{A[2]} would equal @samp{c}. In general, +@samp{A[n]} in Giac mode corresponds to @samp{A_(n+1)} in Normal mode. + +The Giac interval notation @samp{2 .. 3} has no surrounding brackets; +Calc reads @samp{2 .. 3} as the closed interval @samp{[2 .. 3]} and +writes any kind of interval as @samp{2 .. 3}. This means you cannot see +the difference between an open and a closed interval while in Giac mode. + +@node Mathematica Language Mode, Maple Language Mode, Giac Language Mode, Language Modes @subsection Mathematica Language Mode @noindent @@ -14525,11 +14608,8 @@ to the function @code{matrix}, given a list of lists as the argument, and can be read in this form or with all-capitals @code{MATRIX}. -The Maple interval notation @samp{2 .. 3} has no surrounding brackets; -Calc reads @samp{2 .. 3} as the closed interval @samp{[2 .. 3]}, and -writes any kind of interval as @samp{2 .. 3}. This means you cannot -see the difference between an open and a closed interval while in -Maple display mode. +The Maple interval notation @samp{2 .. 3} is like Giac's interval +notation, and is handled the same by Calc. Maple writes complex numbers as @samp{3 + 4*I}. Its special constants are @code{Pi}, @code{E}, @code{I}, and @code{infinity} (all three of diff -r 56a72e2bd635 -r 1ae1f4066439 lisp/ChangeLog --- a/lisp/ChangeLog Sat Dec 29 02:39:17 2007 +0000 +++ b/lisp/ChangeLog Sat Dec 29 02:51:57 2007 +0000 @@ -1,3 +1,43 @@ +2007-12-29 Jay Belanger + + * calc/calc-aent.el (math-read-token): Fix misplaced + parentheses. + + * calc/calc-lang.el (calc-yacas-language, calc-maxima-language) + (calc-giac-language, math-yacas-parse-Sum, math-yacas-compose-sum) + (math-yacas-compose-deriv, math-yacas-compose-taylor) + (math-maxima-parse-subst, math-maxima-parse-taylor) + (math-maxima-compose-taylor, math-maxima-compose-subst) + (math-maxima-compose-if, math-lang-switch-args) + (math-lang-compose-switch-args, math-read-giac-subscr): + New functions. + (calc-lang-allow-underscores, calc-lang-allow-percentsigns) + (calc-lang-brackets-are-subscripts, calc-lang-c-type-hex): + Add languages. + (math-vector-brackets, math-complex-format, math-variable-table) + (math-parse-table, math-oper-table, math-function-table) + (math-special-function-table, math-compose-subscr): + Add values for new languages. + + * calc/calccomp.el (math-compose-expr): Add new languages. + + * calc/calc.el (calc-language): Add languages to docstring. + + * calc/calc-ext.el (calc-init-extensions): Add keybindings + for new languages. Autoload commands to change languages. + + * calc/calc-help.el (calc-d-prefix-help): Add new languages. + + * calc/calc-menu.el (calc-modes-menu): Add new languages. + +2007-12-28 Dan Nicolaescu + + * vc-hg.el (vc-hg-registered): Return the false when vc-hg-state + returns 'ignored or 'unregistered. + (vc-hg-state): Pass "-A" to the status command and deal with the + output. + (vc-hg-dir-state): Pass "-A" to the status command. + 2007-12-29 Richard Stallman * progmodes/compile.el (compilation-start): Set initial visible diff -r 56a72e2bd635 -r 1ae1f4066439 lisp/calc/README --- a/lisp/calc/README Sat Dec 29 02:39:17 2007 +0000 +++ b/lisp/calc/README Sat Dec 29 02:51:57 2007 +0000 @@ -72,6 +72,8 @@ Summary of changes to "Calc" ------- -- ------- -- ---- +* Added support for Yacas, Maxima and Giac languages. + * Added a menu. * Added logistic non-linear curves to curve-fitting. diff -r 56a72e2bd635 -r 1ae1f4066439 lisp/calc/calc-aent.el --- a/lisp/calc/calc-aent.el Sat Dec 29 02:39:17 2007 +0000 +++ b/lisp/calc/calc-aent.el Sat Dec 29 02:51:57 2007 +0000 @@ -775,9 +775,9 @@ (setq math-exp-token 'string math-expr-data (math-match-substring math-exp-str 1) math-exp-pos (match-end 0))) - ((and (setq adfn (get calc-language 'math-lang-read))) + ((and (setq adfn (get calc-language 'math-lang-read)) (eval (nth 0 adfn)) - (eval (nth 1 adfn))) + (eval (nth 1 adfn)))) ((eq (string-match "%%.*$" math-exp-str math-exp-pos) math-exp-pos) (setq math-exp-pos (match-end 0)) (math-read-token)) diff -r 56a72e2bd635 -r 1ae1f4066439 lisp/calc/calc-ext.el --- a/lisp/calc/calc-ext.el Sat Dec 29 02:39:17 2007 +0000 +++ b/lisp/calc/calc-ext.el Sat Dec 29 02:51:57 2007 +0000 @@ -256,6 +256,7 @@ (define-key calc-mode-map "dt" 'calc-truncate-stack) (define-key calc-mode-map "dw" 'calc-auto-why) (define-key calc-mode-map "dz" 'calc-leading-zeros) + (define-key calc-mode-map "dA" 'calc-giac-language) (define-key calc-mode-map "dB" 'calc-big-language) (define-key calc-mode-map "dD" 'calc-redo) (define-key calc-mode-map "dC" 'calc-c-language) @@ -269,6 +270,8 @@ (define-key calc-mode-map "dL" 'calc-latex-language) (define-key calc-mode-map "dU" 'calc-unformatted-language) (define-key calc-mode-map "dW" 'calc-maple-language) + (define-key calc-mode-map "dX" 'calc-maxima-language) + (define-key calc-mode-map "dY" 'calc-yacas-language) (define-key calc-mode-map "d[" 'calc-truncate-up) (define-key calc-mode-map "d]" 'calc-truncate-down) (define-key calc-mode-map "d." 'calc-point-char) @@ -1053,6 +1056,7 @@ ("calc-lang" calc-big-language calc-c-language calc-eqn-language calc-flat-language calc-fortran-language calc-maple-language +calc-yacas-language calc-maxima-language calc-giac-language calc-mathematica-language calc-normal-language calc-pascal-language calc-tex-language calc-latex-language calc-unformatted-language) diff -r 56a72e2bd635 -r 1ae1f4066439 lisp/calc/calc-help.el --- a/lisp/calc/calc-help.el Sat Dec 29 02:39:17 2007 +0000 +++ b/lisp/calc/calc-help.el Sat Dec 29 02:51:57 2007 +0000 @@ -601,6 +601,7 @@ "\" (strings); Truncate, [, ]; SPC (refresh), RET, @" "SHIFT + language: Normal, One-line, Big, Unformatted" "SHIFT + language: C, Pascal, Fortran; TeX, LaTeX, Eqn" + "SHIFT + language: Yacas, X=Maxima, A=Giac" "SHIFT + language: Mathematica, W=Maple") "display" ?d)) diff -r 56a72e2bd635 -r 1ae1f4066439 lisp/calc/calc-lang.el --- a/lisp/calc/calc-lang.el Sat Dec 29 02:39:17 2007 +0000 +++ b/lisp/calc/calc-lang.el Sat Dec 29 02:51:57 2007 +0000 @@ -1164,6 +1164,624 @@ (if (memq (nth 1 a) '(0 2)) ")" "]"))) +;;; Yacas + +(defun calc-yacas-language () + "Change the Calc language to be Yacas-like." + (interactive) + (calc-wrapper + (calc-set-language 'yacas) + (message "`Yacas' language mode"))) + +(put 'yacas 'math-vector-brackets "{}") + +(put 'yacas 'math-complex-format 'I) + +(add-to-list 'calc-lang-brackets-are-subscripts 'yacas) + +(put 'yacas 'math-variable-table + '(( Infinity . var-inf) + ( Infinity . var-uinf) + ( Undefined . var-nan) + ( Pi . var-pi) + ( E . var-e) ;; Not really in Yacas + ( GoldenRatio . var-phi) + ( Gamma . var-gamma))) + +(put 'yacas 'math-parse-table + '((("Deriv(" 0 ")" 0) + calcFunc-deriv (var ArgB var-ArgB) (var ArgA var-ArgA)) + (("D(" 0 ")" 0) + calcFunc-deriv (var ArgB var-ArgB) (var ArgA var-ArgA)) + (("Integrate(" 0 ")" 0) + calcFunc-integ (var ArgB var-ArgB)(var ArgA var-ArgA)) + (("Integrate(" 0 "," 0 "," 0 ")" 0) + calcFunc-integ (var ArgD var-ArgD) (var ArgA var-ArgA) + (var ArgB var-ArgB) (var ArgC var-ArgC)) + (("Subst(" 0 "," 0 ")" 0) + calcFunc-subst (var ArgC var-ArgC) (var ArgA var-ArgA) + (var ArgB var-ArgB)) + (("Taylor(" 0 "," 0 "," 0 ")" 0) + calcFunc-taylor (var ArgD var-ArgD) + (calcFunc-eq (var ArgA var-ArgA) (var ArgB var-ArgB)) + (var ArgC var-ArgC)))) + +(put 'yacas 'math-oper-table + '(("+" + 30 30) + ("-" - 30 60) + ("*" * 60 60) + ("/" / 70 70) + ("u-" neg -1 60) + ("^" ^ 80 80) + ("u+" ident -1 30) + ("<<" calcFunc-lsh 80 80) + (">>" calcFunc-rsh 80 80) + ("!" calcFunc-fact 80 -1) + ("!!" calcFunc-dfact 80 -1) + ("X" calcFunc-cross 70 70) + ("=" calcFunc-eq 10 10) + ("!=" calcFunc-neq 10 10) + ("<" calcFunc-lt 10 10) + (">" calcFunc-gt 10 10) + ("<=" calcFunc-leq 10 10) + (">=" calcFunc-geq 10 10) + ("And" calcFunc-land 5 5) + ("Or" calcFunc-or 4 4) + ("Not" calcFunc-lnot -1 3) + (":=" calcFunc-assign 1 1))) + +(put 'yacas 'math-function-table + '(( Div . calcFunc-idiv) + ( Mod . calcFunc-mod) + ( Abs . calcFunc-abs) + ( Sign . calcFunc-sign) + ( Sqrt . calcFunc-sqrt) + ( Max . calcFunc-max) + ( Min . calcFunc-min) + ( Floor . calcFunc-floor) + ( Ceil . calcFunc-ceil) + ( Round . calcFunc-round) + ( Conjugate . calcFunc-conj) + ( Arg . calcFunc-arg) + ( Re . calcFunc-re) + ( Im . calcFunc-im) + ( Rationalize . calcFunc-pfrac) + ( Sin . calcFunc-sin) + ( Cos . calcFunc-cos) + ( Tan . calcFunc-tan) + ( Sec . calcFunc-sec) + ( Csc . calcFunc-csc) + ( Cot . calcFunc-cot) + ( ArcSin . calcFunc-arcsin) + ( ArcCos . calcFunc-arccos) + ( ArcTan . calcFunc-arctan) + ( Sinh . calcFunc-sinh) + ( Cosh . calcFunc-cosh) + ( Tanh . calcFunc-tanh) + ( Sech . calcFunc-sech) + ( Csch . calcFunc-csch) + ( Coth . calcFunc-coth) + ( ArcSinh . calcFunc-arcsinh) + ( ArcCosh . calcFunc-arccosh) + ( ArcTanh . calcFunc-arctanh) + ( Ln . calcFunc-ln) + ( Exp . calcFunc-exp) + ( Gamma . calcFunc-gamma) + ( Gcd . calcFunc-gcd) + ( Lcm . calcFunc-lcm) + ( Bin . calcFunc-choose) + ( Bernoulli . calcFunc-bern) + ( Euler . calcFunc-euler) + ( StirlingNumber1 . calcFunc-stir1) + ( StirlingNumber2 . calcFunc-stir2) + ( IsPrime . calcFunc-prime) + ( Factors . calcFunc-prfac) + ( NextPrime . calcFunc-nextprime) + ( Moebius . calcFunc-moebius) + ( Random . calcFunc-random) + ( Concat . calcFunc-vconcat) + ( Head . calcFunc-head) + ( Tail . calcFunc-tail) + ( Length . calcFunc-vlen) + ( Reverse . calcFunc-rev) + ( CrossProduct . calcFunc-cross) + ( Dot . calcFunc-mul) + ( DiagonalMatrix . calcFunc-diag) + ( Transpose . calcFunc-trn) + ( Inverse . calcFunc-inv) + ( Determinant . calcFunc-det) + ( Trace . calcFunc-tr) + ( RemoveDuplicates . calcFunc-rdup) + ( Union . calcFunc-vunion) + ( Intersection . calcFunc-vint) + ( Difference . calcFunc-vdiff) + ( Apply . calcFunc-apply) + ( Map . calcFunc-map) + ( Simplify . calcFunc-simplify) + ( ExpandBrackets . calcFunc-expand) + ( Solve . calcFunc-solve) + ( Degree . calcFunc-pdeg) + ( If . calcFunc-if) + ( Contains . (math-lang-switch-args calcFunc-in)) + ( Sum . (math-yacas-parse-Sum calcFunc-sum)) + ( Factorize . (math-yacas-parse-Sum calcFunc-prod)))) + +(put 'yacas 'math-special-function-table + '(( calcFunc-sum . (math-yacas-compose-sum "Sum")) + ( calcFunc-prod . (math-yacas-compose-sum "Factorize")) + ( calcFunc-deriv . (math-yacas-compose-deriv "Deriv")) + ( calcFunc-integ . (math-yacas-compose-deriv "Integrate")) + ( calcFunc-taylor . math-yacas-compose-taylor) + ( calcFunc-in . (math-lang-compose-switch-args "Contains")))) + +(put 'yacas 'math-compose-subscr + (function + (lambda (a) + (let ((args (cdr (cdr a)))) + (list 'horiz + (math-compose-expr (nth 1 a) 1000) + "[" + (math-compose-vector args ", " 0) + "]"))))) + +(defun math-yacas-parse-Sum (f val) + "Read in the arguments to \"Sum\" in Calc's Yacas mode." + (let ((args (math-read-expr-list))) + (math-read-token) + (list (nth 2 f) + (nth 3 args) + (nth 0 args) + (nth 1 args) + (nth 2 args)))) + +(defun math-yacas-compose-sum (a fn) + "Compose the \"Sum\" function in Calc's Yacas mode." + (list 'horiz + (nth 1 fn) + "(" + (math-compose-expr (nth 2 a) -1) + "," + (math-compose-expr (nth 3 a) -1) + "," + (math-compose-expr (nth 4 a) -1) + "," + (math-compose-expr (nth 1 a) -1) + ")")) + +(defun math-yacas-compose-deriv (a fn) + "Compose the \"Deriv\" function in Calc's Yacas mode." + (list 'horiz + (nth 1 fn) + "(" + (math-compose-expr (nth 2 a) -1) + (if (not (nth 3 a)) + ")" + (concat + "," + (math-compose-expr (nth 3 a) -1) + "," + (math-compose-expr (nth 4 a) -1) + ")")) + " " + (math-compose-expr (nth 1 a) -1))) + +(defun math-yacas-compose-taylor (a) + "Compose the \"Taylor\" function in Calc's Yacas mode." + (list 'horiz + "Taylor(" + (if (eq (car-safe (nth 2 a)) 'calcFunc-eq) + (concat (math-compose-expr (nth 1 (nth 2 a)) -1) + "," + (math-compose-expr (nth 2 (nth 2 a)) -1)) + (concat (math-compose-expr (nth 2 a) -1) ",0")) + "," + (math-compose-expr (nth 3 a) -1) + ") " + (math-compose-expr (nth 1 a) -1))) + + +;;; Maxima + +(defun calc-maxima-language () + "Change the Calc language to be Maxima-like." + (interactive) + (calc-wrapper + (calc-set-language 'maxima) + (message "`Maxima' language mode"))) + +(put 'maxima 'math-oper-table + '(("+" + 100 100) + ("-" - 100 134) + ("*" * 120 120) + ("." * 130 129) + ("/" / 120 120) + ("u-" neg -1 180) + ("u+" ident -1 180) + ("^" ^ 140 139) + ("**" ^ 140 139) + ("!" calcFunc-fact 160 -1) + ("!!" calcFunc-dfact 160 -1) + ("=" calcFunc-eq 80 80) + ("#" calcFunc-neq 80 80) + ("<" calcFunc-lt 80 80) + (">" calcFunc-gt 80 80) + ("<=" calcFunc-leq 80 80) + (">=" calcFunc-geq 80 80) + ("and" calcFunc-land 65 65) + ("or" calcFunc-or 60 60) + ("not" calcFunc-lnot -1 70) + (":" calcFunc-assign 180 20))) + + +(put 'maxima 'math-function-table + '(( matrix . vec) + ( abs . calcFunc-abs) + ( cabs . calcFunc-abs) + ( signum . calcFunc-sign) + ( floor . calcFunc-floor) + ( entier . calcFunc-floor) + ( fix . calcFunc-floor) + ( conjugate . calcFunc-conj ) + ( carg . calcFunc-arg) + ( realpart . calcFunc-re) + ( imagpart . calcFunc-im) + ( rationalize . calcFunc-pfrac) + ( asin . calcFunc-arcsin) + ( acos . calcFunc-arccos) + ( atan . calcFunc-arctan) + ( atan2 . calcFunc-arctan2) + ( asinh . calcFunc-arcsinh) + ( acosh . calcFunc-arccosh) + ( atanh . calcFunc-arctanh) + ( log . calcFunc-ln) + ( plog . calcFunc-ln) + ( bessel_j . calcFunc-besJ) + ( bessel_y . calcFunc-besY) + ( factorial . calcFunc-fact) + ( binomial . calcFunc-choose) + ( primep . calcFunc-prime) + ( next_prime . calcFunc-nextprime) + ( prev_prime . calcFunc-prevprime) + ( append . calcFunc-vconcat) + ( rest . calcFunc-tail) + ( reverse . calcFunc-rev) + ( innerproduct . calcFunc-mul) + ( inprod . calcFunc-mul) + ( row . calcFunc-mrow) + ( columnvector . calcFunc-mcol) + ( covect . calcFunc-mcol) + ( transpose . calcFunc-trn) + ( invert . calcFunc-inv) + ( determinant . calcFunc-det) + ( mattrace . calcFunc-tr) + ( member . calcFunc-in) + ( lmax . calcFunc-vmax) + ( lmin . calcFunc-vmin) + ( distrib . calcFunc-expand) + ( partfrac . calcFunc-apart) + ( rat . calcFunc-nrat) + ( product . calcFunc-prod) + ( diff . calcFunc-deriv) + ( integrate . calcFunc-integ) + ( quotient . calcFunc-pdiv) + ( remainder . calcFunc-prem) + ( divide . calcFunc-pdivrem) + ( equal . calcFunc-eq) + ( notequal . calcFunc-neq) + ( rhs . calcFunc-rmeq) + ( subst . (math-maxima-parse-subst)) + ( substitute . (math-maxima-parse-subst)) + ( taylor . (math-maxima-parse-taylor)))) + +(defun math-maxima-parse-subst (f val) + "Read in the arguments to \"subst\" in Calc's Maxima mode." + (let ((args (math-read-expr-list))) + (math-read-token) + (list 'calcFunc-subst + (nth 1 args) + (nth 2 args) + (nth 0 args)))) + +(defun math-maxima-parse-taylor (f val) + "Read in the arguments to \"taylor\" in Calc's Maxima mode." + (let ((args (math-read-expr-list))) + (math-read-token) + (list 'calcFunc-taylor + (nth 0 args) + (list 'calcFunc-eq + (nth 1 args) + (nth 2 args)) + (nth 3 args)))) + +(put 'maxima 'math-parse-table + '((("if" 0 "then" 0 "else" 0) + calcFunc-if + (var ArgA var-ArgA) + (var ArgB var-ArgB) + (var ArgC var-ArgC)))) + +(put 'maxima 'math-special-function-table + '(( calcFunc-taylor . math-maxima-compose-taylor) + ( calcFunc-subst . math-maxima-compose-subst) + ( calcFunc-if . math-maxima-compose-if))) + +(defun math-maxima-compose-taylor (a) + "Compose the \"taylor\" function in Calc's Maxima mode." + (list 'horiz + "taylor(" + (math-compose-expr (nth 1 a) -1) + "," + (if (eq (car-safe (nth 2 a)) 'calcFunc-eq) + (concat (math-compose-expr (nth 1 (nth 2 a)) -1) + "," + (math-compose-expr (nth 2 (nth 2 a)) -1)) + (concat (math-compose-expr (nth 2 a) -1) ",0")) + "," + (math-compose-expr (nth 3 a) -1) + ")")) + +(defun math-maxima-compose-subst (a) + "Compose the \"subst\" function in Calc's Maxima mode." + (list 'horiz + "substitute(" + (math-compose-expr (nth 2 a) -1) + "," + (math-compose-expr (nth 3 a) -1) + "," + (math-compose-expr (nth 1 a) -1) + ")")) + +(defun math-maxima-compose-if (a) + "Compose the \"if\" function in Calc's Maxima mode." + (list 'horiz + "if " + (math-compose-expr (nth 1 a) -1) + " then " + (math-compose-expr (nth 2 a) -1) + " else " + (math-compose-expr (nth 3 a) -1))) + +(put 'maxima 'math-variable-table + '(( infinity . var-uinf) + ( %pi . var-pi) + ( %e . var-e) + ( %i . var-i) + ( %phi . var-phi) + ( %gamma . var-gamma))) + +(put 'maxima 'math-complex-format '%i) + +(add-to-list 'calc-lang-allow-underscores 'maxima) + +(add-to-list 'calc-lang-allow-percentsigns 'maxima) + +(add-to-list 'calc-lang-brackets-are-subscripts 'maxima) + +(put 'maxima 'math-compose-subscr + (function + (lambda (a) + (let ((args (cdr (cdr a)))) + (list 'horiz + (math-compose-expr (nth 1 a) 1000) + "[" + (math-compose-vector args ", " 0) + "]"))))) + +(put 'maxima 'math-matrix-formatter + (function + (lambda (a) + (list 'horiz + "matrix(" + (math-compose-vector (cdr a) + (concat math-comp-comma " ") + math-comp-vector-prec) + ")")))) + + +;;; Giac + +(defun calc-giac-language () + "Change the Calc language to be Giac-like." + (interactive) + (calc-wrapper + (calc-set-language 'giac) + (message "`Giac' language mode"))) + +(put 'giac 'math-oper-table + '( ( "[" (math-read-giac-subscr) 250 -1 ) + ( "+" + 180 181 ) + ( "-" - 180 181 ) + ( "/" / 191 192 ) + ( "*" * 191 192 ) + ( "^" ^ 201 200 ) + ( "u+" ident -1 197 ) + ( "u-" neg -1 197 ) + ( "!" calcFunc-fact 210 -1 ) + ( ".." (math-read-maple-dots) 165 165 ) + ( "\\dots" (math-read-maple-dots) 165 165 ) + ( "intersect" calcFunc-vint 191 192 ) + ( "union" calcFunc-vunion 180 181 ) + ( "minus" calcFunc-vdiff 180 181 ) + ( "<" calcFunc-lt 160 160 ) + ( ">" calcFunc-gt 160 160 ) + ( "<=" calcFunc-leq 160 160 ) + ( ">=" calcFunc-geq 160 160 ) + ( "=" calcFunc-eq 160 160 ) + ( "==" calcFunc-eq 160 160 ) + ( "!=" calcFunc-neq 160 160 ) + ( "and" calcFunc-land 110 111 ) + ( "or" calcFunc-lor 100 101 ) + ( "&&" calcFunc-land 110 111 ) + ( "||" calcFunc-lor 100 101 ) + ( "not" calcFunc-lnot -1 121 ) + ( ":=" calcFunc-assign 51 50 ))) + + +(put 'giac 'math-function-table + '(( rdiv . calcFunc-div) + ( iquo . calcFunc-idiv) + ( irem . calcFunc-mod) + ( remain . calcFunc-mod) + ( floor . calcFunc-floor) + ( iPart . calcFunc-floor) + ( ceil . calcFunc-ceil) + ( ceiling . calcFunc-ceil) + ( re . calcFunc-re) + ( real . calcFunc-re) + ( im . calcFunc-im) + ( imag . calcFunc-im) + ( float2rational . calcFunc-pfrac) + ( exact . calcFunc-pfrac) + ( evalf . calcFunc-pfloat) + ( bitand . calcFunc-and) + ( bitor . calcFunc-or) + ( bitxor . calcFunc-xor) + ( asin . calcFunc-arcsin) + ( acos . calcFunc-arccos) + ( atan . calcFunc-arctan) + ( asinh . calcFunc-arcsinh) + ( acosh . calcFunc-arccosh) + ( atanh . calcFunc-arctanh) + ( log . calcFunc-ln) + ( logb . calcFunc-log) + ( factorial . calcFunc-fact) + ( comb . calcFunc-choose) + ( binomial . calcFunc-choose) + ( nCr . calcFunc-choose) + ( perm . calcFunc-perm) + ( nPr . calcFunc-perm) + ( bernoulli . calcFunc-bern) + ( is_prime . calcFunc-prime) + ( isprime . calcFunc-prime) + ( isPrime . calcFunc-prime) + ( ifactors . calcFunc-prfac) + ( euler . calcFunc-totient) + ( phi . calcFunc-totient) + ( rand . calcFunc-random) + ( concat . calcFunc-vconcat) + ( augment . calcFunc-vconcat) + ( mid . calcFunc-subvec) + ( length . calcFunc-length) + ( size . calcFunc-length) + ( nops . calcFunc-length) + ( SortA . calcFunc-sort) + ( SortB . calcFunc-rsort) + ( revlist . calcFunc-rev) + ( cross . calcFunc-cross) + ( crossP . calcFunc-cross) + ( crossproduct . calcFunc-cross) + ( mul . calcFunc-mul) + ( dot . calcFunc-mul) + ( dotprod . calcFunc-mul) + ( dotP . calcFunc-mul) + ( scalar_product . calcFunc-mul) + ( scalar_Product . calcFunc-mul) + ( row . calcFunc-mrow) + ( col . calcFunc-mcol) + ( dim . calcFunc-mdims) + ( tran . calcFunc-trn) + ( transpose . calcFunc-trn) + ( lu . calcFunc-lud) + ( trace . calcFunc-tr) + ( member . calcFunc-in) + ( sum . calcFunc-vsum) + ( add . calcFunc-vsum) + ( product . calcFunc-vprod) + ( mean . calcFunc-vmean) + ( median . calcFunc-vmedian) + ( stddev . calcFunc-vsdev) + ( stddevp . calcFunc-vpsdev) + ( variance . calcFunc-vpvar) + ( map . calcFunc-map) + ( apply . calcFunc-map) + ( of . calcFunc-map) + ( zip . calcFunc-map) + ( expand . calcFunc-expand) + ( fdistrib . calcFunc-expand) + ( partfrac . calcFunc-apart) + ( ratnormal . calcFunc-nrat) + ( diff . calcFunc-deriv) + ( derive . calcFunc-deriv) + ( integrate . calcFunc-integ) + ( int . calcFunc-integ) + ( Int . calcFunc-integ) + ( romberg . calcFunc-ninteg) + ( nInt . calcFunc-ninteg) + ( lcoeff . calcFunc-plead) + ( content . calcFunc-pcont) + ( primpart . calcFunc-pprim) + ( quo . calcFunc-pdiv) + ( rem . calcFunc-prem) + ( quorem . calcFunc-pdivrem) + ( divide . calcFunc-pdivrem) + ( equal . calcFunc-eq) + ( ifte . calcFunc-if) + ( not . calcFunc-lnot) + ( rhs . calcFunc-rmeq) + ( right . calcFunc-rmeq) + ( prepend . (math-lang-switch-args calcFunc-cons)) + ( contains . (math-lang-switch-args calcFunc-in)) + ( has . (math-lang-switch-args calcFunc-refers)))) + +(defun math-lang-switch-args (f val) + "Read the arguments to a Calc function in reverse order. +This is used for various language modes which have functions in reverse +order to Calc's." + (let ((args (math-read-expr-list))) + (math-read-token) + (list (nth 2 f) + (nth 1 args) + (nth 0 args)))) + +(put 'giac 'math-parse-table + '((("set" 0) + calcFunc-rdup + (var ArgA var-ArgA)))) + +(put 'giac 'math-special-function-table + '((calcFunc-cons . (math-lang-compose-switch-args "prepend")) + (calcFunc-in . (math-lang-compose-switch-args "contains")) + (calcFunc-refers . (math-lang-compose-switch-args "has")) + (intv . math-compose-maple-intv))) + +(defun math-lang-compose-switch-args (a fn) + "Compose the arguments to a Calc function in reverse order. +This is used for various language modes which have functions in reverse +order to Calc's." + (list 'horiz (nth 1 fn) + "(" + (math-compose-expr (nth 2 a) 0) + "," + (math-compose-expr (nth 1 a) 0) + ")")) + +(put 'giac 'math-variable-table + '(( infinity . var-inf) + ( infinity . var-uinf))) + +(add-to-list 'calc-lang-allow-underscores 'giac) + +(put 'giac 'math-compose-subscr + (function + (lambda (a) + (let ((args (cdr (cdr a)))) + (list 'horiz + (math-compose-expr (nth 1 a) 1000) + "[" + (math-compose-expr + (calc-normalize (list '- (nth 2 a) 1)) 0) + "]"))))) + +(defun math-read-giac-subscr (x op) + (let ((idx (math-read-expr-level 0))) + (or (equal math-expr-data "]") + (throw 'syntax "Expected ']'")) + (math-read-token) + (list 'calcFunc-subscr x (calc-normalize (list '+ idx 1))))) + +(add-to-list 'calc-lang-c-type-hex 'giac) + + (defun calc-mathematica-language () (interactive) (calc-wrapper diff -r 56a72e2bd635 -r 1ae1f4066439 lisp/calc/calc-menu.el --- a/lisp/calc/calc-menu.el Sat Dec 29 02:39:17 2007 +0000 +++ b/lisp/calc/calc-menu.el Sat Dec 29 02:51:57 2007 +0000 @@ -1157,7 +1157,28 @@ (call-interactively 'calc-eqn-language)) :keys "d E" :style radio - :selected (eq calc-language 'eqn)]) + :selected (eq calc-language 'eqn)] + ["Yacas" + (progn + (require 'calc-lang) + (call-interactively 'calc-yacas-language)) + :keys "d Y" + :style radio + :selected (eq calc-language 'yacas)] + ["Maxima" + (progn + (require 'calc-lang) + (call-interactively 'calc-maxima-language)) + :keys "d X" + :style radio + :selected (eq calc-language 'maxima)] + ["Giac" + (progn + (require 'calc-lang) + (call-interactively 'calc-giac-language)) + :keys "d A" + :style radio + :selected (eq calc-language 'giac)]) "----" ["Save mode settings" calc-save-modes :keys "m m"] "----" diff -r 56a72e2bd635 -r 1ae1f4066439 lisp/calc/calc.el --- a/lisp/calc/calc.el Sat Dec 29 02:39:17 2007 +0000 +++ b/lisp/calc/calc.el Sat Dec 29 02:51:57 2007 +0000 @@ -685,6 +685,9 @@ tex Use TeX notation. latex Use LaTeX notation. eqn Use eqn notation. + yacas Use Yacas notation. + maxima Use Maxima notation. + giac Use Giac notation. math Use Mathematica(tm) notation. maple Use Maple notation.") diff -r 56a72e2bd635 -r 1ae1f4066439 lisp/calc/calccomp.el --- a/lisp/calc/calccomp.el Sat Dec 29 02:39:17 2007 +0000 +++ b/lisp/calc/calccomp.el Sat Dec 29 02:51:57 2007 +0000 @@ -781,6 +781,9 @@ ( tex . math-compose-tex ) ( latex . math-compose-latex ) ( eqn . math-compose-eqn ) + ( yacas . math-compose-yacas ) + ( maxima . math-compose-maxima ) + ( giac . math-compose-giac ) ( math . math-compose-math ) ( maple . math-compose-maple )))) (setq op (get (car a) (cdr op))) diff -r 56a72e2bd635 -r 1ae1f4066439 lisp/vc-hg.el --- a/lisp/vc-hg.el Sat Dec 29 02:39:17 2007 +0000 +++ b/lisp/vc-hg.el Sat Dec 29 02:51:57 2007 +0000 @@ -147,7 +147,9 @@ (defun vc-hg-registered (file) "Return non-nil if FILE is registered with hg." (when (vc-hg-root file) ; short cut - (vc-file-setprop file 'vc-state (vc-hg-state file)))) ; expensive + (let ((state (vc-hg-state file))) ; expensive + (vc-file-setprop file 'vc-state state) + (not (memq state '(ignored unregistered)))))) (defun vc-hg-state (file) "Hg-specific version of `vc-state'." @@ -162,26 +164,26 @@ ;; Ignore all errors. (call-process "hg" nil t nil "--cwd" (file-name-directory file) - "status" (file-name-nondirectory file)) + "status" "-A" (file-name-nondirectory file)) ;; Some problem happened. E.g. We can't find an `hg' ;; executable. (error nil))))))) (when (eq 0 status) - (if (eq 0 (length out)) 'up-to-date (when (null (string-match ".*: No such file or directory$" out)) (let ((state (aref out 0))) (cond + ((eq state ?C) 'up-to-date) ((eq state ?A) 'edited) ((eq state ?M) 'edited) ((eq state ?I) 'ignored) ((eq state ?R) 'unregistered) ((eq state ??) 'unregistered) - (t 'up-to-date)))))))) + (t 'up-to-date))))))) (defun vc-hg-dir-state (dir) (with-temp-buffer (buffer-disable-undo) ;; Because these buffers can get huge - (vc-hg-command (current-buffer) nil nil "status") + (vc-hg-command (current-buffer) nil nil "status" "-A") (goto-char (point-min)) (let ((status-char nil) (file nil)) diff -r 56a72e2bd635 -r 1ae1f4066439 src/ChangeLog --- a/src/ChangeLog Sat Dec 29 02:39:17 2007 +0000 +++ b/src/ChangeLog Sat Dec 29 02:51:57 2007 +0000 @@ -1,8 +1,5 @@ 2007-12-24 YAMAMOTO Mitsuharu - * process.c (make_process): Initialize pty_flag to Qnil instead of 0 - as it is not a bit field on Emacs 22 yet. - * xdisp.c (phys_cursor_in_rect_p): Check if cursor is in fringe area. 2007-12-22 Eli Zaretskii diff -r 56a72e2bd635 -r 1ae1f4066439 src/process.c --- a/src/process.c Sat Dec 29 02:39:17 2007 +0000 +++ b/src/process.c Sat Dec 29 02:51:57 2007 +0000 @@ -631,7 +631,7 @@ p->tick = 0; p->update_tick = 0; p->pid = 0; - p->pty_flag = Qnil; + p->pty_flag = 0; p->raw_status_new = 0; p->status = Qrun; p->mark = Fmake_marker ();