You can subscribe to this list here.
| 2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(20) |
Dec
(17) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2002 |
Jan
(39) |
Feb
(21) |
Mar
(33) |
Apr
(135) |
May
(53) |
Jun
(88) |
Jul
(47) |
Aug
(59) |
Sep
(207) |
Oct
(40) |
Nov
(7) |
Dec
(26) |
| 2003 |
Jan
(49) |
Feb
(39) |
Mar
(117) |
Apr
(50) |
May
(62) |
Jun
(6) |
Jul
(19) |
Aug
(24) |
Sep
(11) |
Oct
(11) |
Nov
(49) |
Dec
(9) |
| 2004 |
Jan
(29) |
Feb
(123) |
Mar
(32) |
Apr
(53) |
May
(52) |
Jun
(19) |
Jul
(33) |
Aug
(10) |
Sep
(76) |
Oct
(86) |
Nov
(171) |
Dec
(163) |
| 2005 |
Jan
(147) |
Feb
(121) |
Mar
(120) |
Apr
(126) |
May
(120) |
Jun
(213) |
Jul
(76) |
Aug
(79) |
Sep
(140) |
Oct
(83) |
Nov
(156) |
Dec
(202) |
| 2006 |
Jan
(181) |
Feb
(171) |
Mar
(157) |
Apr
(98) |
May
(96) |
Jun
(97) |
Jul
(193) |
Aug
(76) |
Sep
(130) |
Oct
(63) |
Nov
(196) |
Dec
(253) |
| 2007 |
Jan
(256) |
Feb
(293) |
Mar
(276) |
Apr
(258) |
May
(181) |
Jun
(91) |
Jul
(108) |
Aug
(69) |
Sep
(107) |
Oct
(179) |
Nov
(137) |
Dec
(121) |
| 2008 |
Jan
(124) |
Feb
(129) |
Mar
(192) |
Apr
(201) |
May
(90) |
Jun
(86) |
Jul
(115) |
Aug
(142) |
Sep
(49) |
Oct
(91) |
Nov
(95) |
Dec
(218) |
| 2009 |
Jan
(230) |
Feb
(149) |
Mar
(118) |
Apr
(72) |
May
(77) |
Jun
(68) |
Jul
(102) |
Aug
(72) |
Sep
(89) |
Oct
(76) |
Nov
(125) |
Dec
(86) |
| 2010 |
Jan
(75) |
Feb
(90) |
Mar
(89) |
Apr
(121) |
May
(111) |
Jun
(66) |
Jul
(75) |
Aug
(66) |
Sep
(66) |
Oct
(166) |
Nov
(121) |
Dec
(73) |
| 2011 |
Jan
(74) |
Feb
|
Mar
|
Apr
(14) |
May
(22) |
Jun
(31) |
Jul
(53) |
Aug
(37) |
Sep
(23) |
Oct
(25) |
Nov
(31) |
Dec
(28) |
| 2012 |
Jan
(18) |
Feb
(11) |
Mar
(32) |
Apr
(17) |
May
(48) |
Jun
(37) |
Jul
(23) |
Aug
(54) |
Sep
(15) |
Oct
(11) |
Nov
(19) |
Dec
(22) |
| 2013 |
Jan
(11) |
Feb
(32) |
Mar
(24) |
Apr
(37) |
May
(31) |
Jun
(14) |
Jul
(26) |
Aug
(33) |
Sep
(40) |
Oct
(21) |
Nov
(36) |
Dec
(84) |
| 2014 |
Jan
(23) |
Feb
(20) |
Mar
(27) |
Apr
(24) |
May
(31) |
Jun
(27) |
Jul
(34) |
Aug
(26) |
Sep
(21) |
Oct
(45) |
Nov
(23) |
Dec
(73) |
| 2015 |
Jan
(33) |
Feb
(8) |
Mar
(24) |
Apr
(45) |
May
(27) |
Jun
(19) |
Jul
(21) |
Aug
(51) |
Sep
(43) |
Oct
(29) |
Nov
(61) |
Dec
(86) |
| 2016 |
Jan
(99) |
Feb
(52) |
Mar
(80) |
Apr
(61) |
May
(24) |
Jun
(23) |
Jul
(36) |
Aug
(30) |
Sep
(41) |
Oct
(43) |
Nov
(27) |
Dec
(46) |
| 2017 |
Jan
(57) |
Feb
(34) |
Mar
(40) |
Apr
(31) |
May
(78) |
Jun
(49) |
Jul
(72) |
Aug
(33) |
Sep
(26) |
Oct
(82) |
Nov
(69) |
Dec
(29) |
| 2018 |
Jan
(43) |
Feb
(9) |
Mar
|
Apr
(40) |
May
(34) |
Jun
(49) |
Jul
(45) |
Aug
(8) |
Sep
(51) |
Oct
(75) |
Nov
(103) |
Dec
(80) |
| 2019 |
Jan
(153) |
Feb
(78) |
Mar
(47) |
Apr
(48) |
May
(63) |
Jun
(54) |
Jul
(10) |
Aug
(7) |
Sep
(17) |
Oct
(24) |
Nov
(29) |
Dec
(17) |
| 2020 |
Jan
(22) |
Feb
(74) |
Mar
(47) |
Apr
(48) |
May
(12) |
Jun
(44) |
Jul
(13) |
Aug
(18) |
Sep
(26) |
Oct
(36) |
Nov
(25) |
Dec
(23) |
| 2021 |
Jan
(28) |
Feb
(25) |
Mar
(58) |
Apr
(76) |
May
(72) |
Jun
(70) |
Jul
(25) |
Aug
(67) |
Sep
(17) |
Oct
(24) |
Nov
(30) |
Dec
(30) |
| 2022 |
Jan
(51) |
Feb
(39) |
Mar
(72) |
Apr
(65) |
May
(30) |
Jun
(72) |
Jul
(129) |
Aug
(44) |
Sep
(45) |
Oct
(30) |
Nov
(48) |
Dec
(275) |
| 2023 |
Jan
(235) |
Feb
(232) |
Mar
(68) |
Apr
(16) |
May
(52) |
Jun
(87) |
Jul
(143) |
Aug
(32) |
Sep
(26) |
Oct
(15) |
Nov
(20) |
Dec
(74) |
| 2024 |
Jan
(119) |
Feb
(32) |
Mar
(64) |
Apr
(68) |
May
(30) |
Jun
(50) |
Jul
(37) |
Aug
(32) |
Sep
(10) |
Oct
(27) |
Nov
(47) |
Dec
(36) |
| 2025 |
Jan
(94) |
Feb
(68) |
Mar
(79) |
Apr
(66) |
May
(46) |
Jun
(21) |
Jul
(134) |
Aug
(134) |
Sep
(53) |
Oct
(24) |
Nov
(69) |
Dec
(68) |
| 2026 |
Jan
(48) |
Feb
(49) |
Mar
(56) |
Apr
(140) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: rtoy <rt...@us...> - 2026-04-27 17:47:17
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via c848b6d4a104a3950fdbbcfc0ef5432a7bf791dc (commit)
from 3538c1e5d50d46d30c927dca585c1422f23c206a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit c848b6d4a104a3950fdbbcfc0ef5432a7bf791dc
Author: Raymond Toy <toy...@gm...>
Date: Mon Apr 27 10:42:48 2026 -0700
Move nummod from miscellaneous to hypergeometric module
nummod defines the macro bind-fpprec which is used only in
hypergeometric.lisp and nfloat.lisp. It makes sense to move to the
hypergeometric module.
Testsuite passes.
Note that bind-fpprec should probably move somewhere else. Maybe
float.lisp or something. Also nummod uses apply-reflection-rule from
trigi.lisp. We should move apply-reflection-rule to simp.lisp or
something; it's used in lots of different files in different packages.
(Other reflection-related functions should move too.)
diff --git a/src/maxima.system b/src/maxima.system
index bb2389d51..dd4ce57a5 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -844,7 +844,11 @@
;; special-variable references.
:components
((:file "hyp")
- (:file "hypergeometric")
+ ;; Note: nummod uses apply-reflection-rule from trigi.
+ ;; This should be updated.
+ (:file "nummod")
+ (:file "hypergeometric"
+ :depends-on ("nummod"))
(:file "nfloat"
;; Comment in nfloat says hypergeometric needs to
;; be loaded first.
@@ -1004,6 +1008,7 @@
(:file "gamma"
:depends-on ("expintegral"))
(:file "plasma")))
+
(:module miscellaneous :source-pathname ""
:depends-on ("globals" "defmfun" "compatibility-macros1"
"reader" "utility-macros" "commands"
@@ -1026,7 +1031,6 @@
(:file "nset")
(:file "rand-mt19937")
(:file "maxmin")
- (:file "nummod")
(:file "conjugate")
(:file "hstep")
(:file "sinc")
-----------------------------------------------------------------------
Summary of changes:
src/maxima.system | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: willisbl <wil...@us...> - 2026-04-27 15:34:05
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, master has been updated
via 6dac3c3e0ff74f340b072872f906f57b02a6e272 (commit)
from b83d81fd3f579276ab00509e85f7d0a259b32daa (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 6dac3c3e0ff74f340b072872f906f57b02a6e272
Author: Barton Willis <wi...@un...>
Date: Mon Apr 27 10:33:54 2026 -0500
Unify definition of *large-positive-number* and replace hardcoded literals
• Remove the duplicate definition of *large-positive-number* from limit.lisp.
• Keep the definition in tlimit.lisp and set its value to 10^8.
• Replace all occurrences of the literal 100000000 in assume calls by *large-positive-number* to avoid magic numbers and ensure consistency.
For background discussion and rationale, see: https://sourceforge.net/p/maxima/mailman/maxima-discuss/thread/7612e629-d4d2-402d-9d0c-1af68a712e5e%40gmail.com/#msg59326645
Tested with SBCL 2.4.7 and Clozure CL 1.13.1 with no unexpected failures in the testsuite or share testsuite.
diff --git a/src/limit.lisp b/src/limit.lisp
index 8e2cee65b..eee165e00 100644
--- a/src/limit.lisp
+++ b/src/limit.lisp
@@ -56,10 +56,7 @@
#+nil
(unless (boundp 'integer-info) (setq integer-info ()))
-;; For limits toward infinity for the gruntz code, we assume that the limit
-;; variable exceeds *large-positive-number*. This value matches the value
-;; that the limit code uses for the same purpose.
-(defmvar *large-positive-number* (expt 10 8))
+
;; Don't ask sign questions about $ind.
(putprop '$ind t 'internal)
@@ -278,8 +275,8 @@
(defun limit-context (var val direction) ;Only works on entry!
(cond (limit-top
- (assume '((mgreaterp) lim-epsilon 0))
- (assume '((mgreaterp) prin-inf 100000000))
+ (assume (ftake 'mgreaterp 'lim-epsilon 0))
+ (assume (ftake 'mgreaterp 'prin-inf *large-positive-number*))
(setq *limit-assumptions* (make-limit-assumptions var val direction))
(setq limit-top ()))
(t ()))
@@ -292,13 +289,16 @@
((and (not (infinityp val)) (null direction))
())
((eq val '$inf)
- `(,(assume `((mgreaterp) ,var 100000000)) ,@new-assumptions))
+ (cons (assume (ftake 'mgreaterp var *large-positive-number*)) new-assumptions))
+
((eq val '$minf)
- `(,(assume `((mgreaterp) -100000000 ,var)) ,@new-assumptions))
+ (cons (assume (ftake 'mgreaterp (- *large-positive-number*) var)) new-assumptions))
+
((eq direction '$plus)
- `(,(assume `((mgreaterp) ,var 0)) ,@new-assumptions)) ;All limits around 0
+ (cons (assume (ftake 'mgreaterp var 0)) new-assumptions)) ;All limits around 0
+
((eq direction '$minus)
- `(,(assume `((mgreaterp) 0 ,var)) ,@new-assumptions))
+ (cons (assume (ftake 'mgreaterp 0 var)) new-assumptions))
(t
()))))
@@ -308,8 +308,8 @@
(do ((assumption-list *limit-assumptions* (cdr assumption-list)))
((null assumption-list) t)
(forget (car assumption-list)))
- (forget '((mgreaterp) lim-epsilon 0))
- (forget '((mgreaterp) prin-inf 100000000))
+ (forget (ftake 'mgreaterp 'lim-epsilon 0))
+ (forget (ftake 'mgreaterp 'prin-inf *large-positive-number*))
(cond ((and (not (null *integer-info*))
(not limitp))
(do ((list *integer-info* (cdr list)))
diff --git a/src/tlimit.lisp b/src/tlimit.lisp
index 1be08976e..1cef71321 100644
--- a/src/tlimit.lisp
+++ b/src/tlimit.lisp
@@ -44,8 +44,8 @@
(defvar *already-processed-limits* nil)
(defmvar *max-limit-depth* 8) ; magic number = 8 for no particular reason
-;; For limits toward `inf`, assume that the limit variable exceeds `*large-positive-number*`
-(defmvar *large-positive-number* 4398046511104) ; 2^42 for no particular reason
+;; For limits toward `inf`, assume that the limit variable exceeds *large-positive-number*.
+(defmvar *large-positive-number* (expt 10 8))
;; TOP LEVEL FUNCTION(S): $TLIMIT $TLDEFINT
(declaim (special limit-using-taylor))
-----------------------------------------------------------------------
Summary of changes:
src/limit.lisp | 24 ++++++++++++------------
src/tlimit.lisp | 4 ++--
2 files changed, 14 insertions(+), 14 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: <ap...@us...> - 2026-04-27 02:12:33
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, master has been updated
via b83d81fd3f579276ab00509e85f7d0a259b32daa (commit)
from 1395beb5692e9c9f816bc45d068b56101f7cdeae (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit b83d81fd3f579276ab00509e85f7d0a259b32daa
Author: Robert Dodier <rob...@so...>
Date: Sun Apr 26 17:52:43 2026 -0700
Fix minor bug (incorrect width) in pretty printer output for 'product(...).
The product symbol for Unicode output is wider at the top than the
bottom. Take that into account when figuring placement of the various
elements.
Fixes SF bug #4711: "Pretty-printer slightly incorrect output for 'product(...)"
diff --git a/src/displa.lisp b/src/displa.lisp
index 97c9d4fac..5ca697f2c 100644
--- a/src/displa.lisp
+++ b/src/displa.lisp
@@ -531,8 +531,9 @@
(update-heights height depth)
(return result)))))
-(defun dsumprod (form result d-form symbol-w symbol-h symbol-d)
- (prog (str to dummy (w 0) (h 0) (d 0) dummy2 (lsum (eq (caar form) '%lsum)))
+(defun dsumprod (form result d-form symbol-w-above symbol-w-below symbol-h symbol-d)
+ (prog (str to dummy (w 0) (h 0) (d 0) dummy2 (lsum (eq (caar form) '%lsum)) w1)
+ ;; format the variable
(setq dummy2 (dimension (caddr form) nil 'mparen 'mequal nil 0)
w width
h height
@@ -541,27 +542,30 @@
(setq str " in " to "")
(setq str " = " to (cadr (cdddr form))))
(push-string str dummy2)
+ ;; format the lower limit
(setq dummy2 (dimension (cadddr form) dummy2 'mequal 'mparen nil 0)
w (+ (length str) w width)
h (max h height)
d (max d depth))
+ ;; format the upper limit
(setq dummy (dimension to nil 'mparen 'mparen nil 0))
(unless (checkfit (max w width))
(return (dimension-function form result)))
- (setq dummy2 (cons (cons (- symbol-w) (cons (- (+ symbol-d h)) dummy2)) (cons d-form result)))
- (cond ((> width symbol-w)
- (setq symbol-w 0))
+ (setq dummy2 (cons (cons (- symbol-w-below) (cons (- (+ symbol-d h)) dummy2)) (cons d-form result)))
+ (cond ((> width symbol-w-below)
+ (setq w1 0))
(t
- (setq symbol-w (truncate (- symbol-w width) 2)
- width (+ symbol-w width))))
- (setq dummy (cons (cons (- symbol-w w) (cons (+ symbol-h depth) dummy)) dummy2)
+ (setq w1 (truncate (- symbol-w-below width) 2)
+ width (+ w1 width))))
+ (setq dummy (cons (cons (- w1 w) (cons (+ symbol-h depth) dummy)) dummy2)
w (max w width)
d (+ symbol-d h d)
h (+ symbol-h height depth))
(update-heights h d)
+ ;; format the expression
(setq dummy (dimension (cadr form) (cons (list (1+ (- w width)) 0) dummy)
(caar form) rop w right)
- width (+ 1 w width)
+ width (+ 1 w width (truncate (- symbol-w-above symbol-w-below) 2))
height (max h height)
depth (max d depth))
(return dummy)))
@@ -604,7 +608,10 @@
(displa-def %product dim-%product 115.)
(defun dim-%product (form result)
- (dsumprod form result '(d-prodsign) 5 3 1))
+ (let
+ ((symbol-width-above (if $display2d_unicode 7 5))
+ (symbol-width-below 5))
+ (dsumprod form result '(d-prodsign) symbol-width-above symbol-width-below 3 1)))
(displa-def rat dim-rat "/")
(displa-def %rat dim-rat "/")
@@ -974,10 +981,10 @@
(displa-def %lsum dim-%lsum 110.)
(defun dim-%lsum (form result)
- (dsumprod form result '(d-sumsign) 4 3 2))
+ (dsumprod form result '(d-sumsign) 4 4 3 2))
(defun dim-%sum (form result)
- (dsumprod form result '(d-sumsign) 4 3 2))
+ (dsumprod form result '(d-sumsign) 4 4 3 2))
(defun dim-%limit (form result)
(prog ((w 0) (h 0) (d 0) dummy)
diff --git a/tests/rtest_unicode_display.mac b/tests/rtest_unicode_display.mac
index 35f9a409d..ea863b667 100644
--- a/tests/rtest_unicode_display.mac
+++ b/tests/rtest_unicode_display.mac
@@ -121,7 +121,7 @@ block ([display2d_unicode: true], print_string_2d (product((x^i+1)^2.5,i,1,inf)/
│ │ (x + 1)
│ │
i = 1
- ─────────────────
+──────────────────
2
x + 1
"$
@@ -862,44 +862,44 @@ print_string_2d_unicode(matrix(ee1));
";
print_string_2d_unicode(transpose(matrix(ee1)));
-"┌ ┐
-│ ⌠ │
-│ ⎮ │
-│ ⎮ f(u) du │
-│ ⎮ │
-│ ⌡ │
-│ │
-│ 1 │
-│ ⌠ │
-│ ⎮ │
-│ ⎮ f(u) du │
-│ ⎮ │
-│ ⌡ │
-│ 0 │
-│ │
-│ m │
-│ ____ │
-│ ╲ │
-│ ⟩ g │
-│ ╱ k │
-│ ‾‾‾‾ │
-│ k = 1 │
-│ │
-│ │
-│ ____ │
-│ ╲ 2 │
-│ ⟩ v │
-│ ╱ k │
-│ ‾‾‾‾ │
-│ k in L │
-│ │
-│ inf │
-│ ─┬───┬─ │
-│ │ │ │
-│ │ │ N │
-│ │ │ i │
-│ i = 1 │
-└ ┘
+"┌ ┐
+│ ⌠ │
+│ ⎮ │
+│ ⎮ f(u) du │
+│ ⎮ │
+│ ⌡ │
+│ │
+│ 1 │
+│ ⌠ │
+│ ⎮ │
+│ ⎮ f(u) du │
+│ ⎮ │
+│ ⌡ │
+│ 0 │
+│ │
+│ m │
+│ ____ │
+│ ╲ │
+│ ⟩ g │
+│ ╱ k │
+│ ‾‾‾‾ │
+│ k = 1 │
+│ │
+│ │
+│ ____ │
+│ ╲ 2 │
+│ ⟩ v │
+│ ╱ k │
+│ ‾‾‾‾ │
+│ k in L │
+│ │
+│ inf │
+│ ─┬───┬─ │
+│ │ │ │
+│ │ │ N │
+│ │ │ i │
+│ i = 1 │
+└ ┘
";
(ee2:[e5,e6b,e7,e8a,e8b],print_string_2d_unicode(ee2));
@@ -1296,37 +1296,37 @@ block ([linel: 140], print_string_2d_unicode (matrix (ee1, ee2, ee4, ee5)));
│ ⌡ ⌡ ‾‾‾‾ ‾‾‾‾ i = 1 │
│ 0 k = 1 k in L │
│ │
-│ ┌ ┐ │
-│ │ y │ │
-│ │ 1 │ │
-│ │ │ │
-│ │ y │ │
-│ │ 2 │ │
-│ │ │ │
-│ │ y │ │
-│ │ 3 │ │
-│ │ │ │
-│ │ y │ │
-│ │ 4 │ │
-│ │ │ │
-│ 6 │ │ y │ │
-│ ∂ 1 │ │ 1 │ ┌ ┐ │ 5 │ │
-│ ─────────── (h(u , v , w )) ───────────│ │─────│ │ y y y y y y y y y y │ │ │ │
-│ 3 2 i j k 1 │ │ n │ │ 1 2 3 4 5 6 7 8 9 10 │ │ y │ │
-│ ∂u ∂v ∂w ─────── + 1│ │p │ └ ┘ │ 6 │ │
-│ i j k f(u, v) │ │ q │ │ │ │
-│ │(u = 0), (v = 1) │ r │ │ y │ │
-│ │ s │ │ 7 │ │
-│ │ 0│ │ │ │
-│ │ y │ │
-│ │ 8 │ │
-│ │ │ │
-│ │ y │ │
-│ │ 9 │ │
-│ │ │ │
-│ │ y │ │
-│ │ 10 │ │
-│ └ ┘ │
+│ ┌ ┐ │
+│ │ y │ │
+│ │ 1 │ │
+│ │ │ │
+│ │ y │ │
+│ │ 2 │ │
+│ │ │ │
+│ │ y │ │
+│ │ 3 │ │
+│ │ │ │
+│ │ y │ │
+│ │ 4 │ │
+│ │ │ │
+│ 6 │ │ y │ │
+│ ∂ 1 │ │ 1 │ ┌ ┐ │ 5 │ │
+│ ─────────── (h(u , v , w )) ───────────│ │─────│ │ y y y y y y y y y y │ │ │ │
+│ 3 2 i j k 1 │ │ n │ │ 1 2 3 4 5 6 7 8 9 10 │ │ y │ │
+│ ∂u ∂v ∂w ─────── + 1│ │p │ └ ┘ │ 6 │ │
+│ i j k f(u, v) │ │ q │ │ │ │
+│ │(u = 0), (v = 1) │ r │ │ y │ │
+│ │ s │ │ 7 │ │
+│ │ 0│ │ │ │
+│ │ y │ │
+│ │ 8 │ │
+│ │ │ │
+│ │ y │ │
+│ │ 9 │ │
+│ │ │ │
+│ │ y │ │
+│ │ 10 │ │
+│ └ ┘ │
│ │
│ baz╗ quux═══╗ │
│ foo bar╗ ║ n║ ║ 1 ║ y │
@@ -1338,9 +1338,9 @@ block ([linel: 140], print_string_2d_unicode (matrix (ee1, ee2, ee4, ee5)));
│ │
│ 3 2 2 3 │
│ - y + 3 x y - 3 x y + x - 1 │
-│ l k l k l k │ │
-│ ───────────────────────────────── FOO BAR BAZ u│ │
-│ 456 │u = 0 │
+│ l k l k l k │ │
+│ ───────────────────────────────── FOO BAR BAZ u│ │
+│ 456 │u = 0 │
│ 1234 - ────────── │
│ 3 │
│ (a - b ) │
@@ -1578,3 +1578,41 @@ print_string_2d_unicode ('diff(f,x,4,y,2));
4 2
∂x ∂y
";
+
+/* tests for SF bug #4711: "Pretty-printer slightly incorrect output for 'product(...)"
+ * which is also covered by tests involving 'product(...) expressions above
+ */
+
+print_string_2d_unicode (matrix ([box (1/(123456+a)), box('product(g(u),u,1, inf))], [box(h(z)), box([1])]));
+"┌ ┐
+│ ╔═══════════╗ │
+│ ║ inf ║ │
+│ ╔══════════╗ ║─┬───┬─ ║ │
+│ ║ 1 ║ ║ │ │ ║ │
+│ ║──────────║ ║ │ │ g(u)║ │
+│ ║a + 123456║ ║ │ │ ║ │
+│ ╚══════════╝ ║ u = 1 ║ │
+│ ╚═══════════╝ │
+│ │
+│ ╔════╗ ╔═══╗ │
+│ ║h(z)║ ║[1]║ │
+│ ╚════╝ ╚═══╝ │
+└ ┘
+";
+
+print_string_2d_unicode (matrix ([box(h(z)), box([1])], [box (1/(123456+a)), box('product(g(u),u,1, inf))]));
+"┌ ┐
+│ ╔════╗ ╔═══╗ │
+│ ║h(z)║ ║[1]║ │
+│ ╚════╝ ╚═══╝ │
+│ │
+│ ╔═══════════╗ │
+│ ║ inf ║ │
+│ ╔══════════╗ ║─┬───┬─ ║ │
+│ ║ 1 ║ ║ │ │ ║ │
+│ ║──────────║ ║ │ │ g(u)║ │
+│ ║a + 123456║ ║ │ │ ║ │
+│ ╚══════════╝ ║ u = 1 ║ │
+│ ╚═══════════╝ │
+└ ┘
+";
-----------------------------------------------------------------------
Summary of changes:
src/displa.lisp | 31 ++++---
tests/rtest_unicode_display.mac | 184 ++++++++++++++++++++++++----------------
2 files changed, 130 insertions(+), 85 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 23:21:42
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via 3538c1e5d50d46d30c927dca585c1422f23c206a (commit)
from b79fbf5a456108e05e1679b432a1cc904134a7b4 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 3538c1e5d50d46d30c927dca585c1422f23c206a
Author: Raymond Toy <toy...@gm...>
Date: Sun Apr 26 16:19:55 2026 -0700
Add/update comments about intra-module dependency
For each module add a comment about the components if they are
completely cycle-free. For the ones that aren't add a brief comment
about what is cycle-free and what causes a cycle.
diff --git a/src/maxima.system b/src/maxima.system
index 8797a4dad..bb2389d51 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -234,6 +234,8 @@
:depends-on ("globals" "defmfun" "compatibility-macros1"
"declarations" "prerequisites"
"compatibility-macros")
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "defcal")
(:file "maxmac")))
@@ -249,6 +251,7 @@
;; and can't depend on those modules because that causes a
;; circular dependency.
:depends-on ("prerequisites" "defmfun")
+ ;; Module is a clean DAG at every level.
:components
((:file "mopers")
(:file "opers"
@@ -268,11 +271,15 @@
;; Note: this depends on merror which causes a circular
;; dependency.
:depends-on ("simp-utilities" "fundamental-macros" "nformat")
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "opr-util")
(:file "basic-util")))
(:module m2-pattern-matcher :source-pathname ""
:depends-on ("simp-utilities")
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "schatc")
(:file "schatc-util")))
@@ -288,7 +295,7 @@
(:module other-macros :source-pathname ""
:depends-on ("defmfun" "compatibility-macros1" "declarations"
"prerequisites" "utility-macros")
- ;; These files appear to be independent of each other.
+ ;; Module is a clean DAG at every level.
:components
((:file "mrgmac")
(:file "rzmac")
@@ -306,6 +313,8 @@
:depends-on ("globals" "defmfun" "utility-macros" "compatibility-macros"
"compatibility-macros1" "declarations" "fundamental-macros"
"prerequisites")
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "utils")
(:file "sumcon")
@@ -339,6 +348,7 @@
;; get the rest of maxima built.
(:module numerical
:depends-on ("defmfun")
+ ;; Compile-time deps form a DAG.
:components
((:module packages :source-pathname ""
:components
@@ -759,7 +769,8 @@
"utility-macros" "reader"
"fundamental-macros" "other-macros" "prerequisites"
"numerical-utilities")
- ;; These files are mutually independent.
+ ;; Module is a clean DAG at every level: function calls, macros,
+ ;; special-variable references.
:components
((:file "bessel")
(:file "airy")))
@@ -780,7 +791,8 @@
:depends-on ("globals" "defmfun" "compatibility-macros1" "declarations"
"fundamental-macros" "prerequisites"
"simp-utilities")
- ;; No circular dependencies between these files.
+ ;; Module is a clean DAG at every level: function calls, macros,
+ ;; special-variable references.
:components
((:file "mgrind") ; grinding/sizing utilities
(:file "grind" ; Linear display
@@ -791,6 +803,8 @@
:depends-on ("globals" "defmfun" "declarations" "destructuring-let"
"fundamental-macros" "prerequisites"
"rat-macros" "utilities")
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "spgcd")
(:file "ezgcd")))
@@ -804,6 +818,11 @@
:depends-on ("globals" "defmfun" "compatibility-macros1" "declarations"
"evaluator" "fundamental-macros" "other-macros"
"prerequisites" "utility-macros")
+ ;; Compile-time deps form a DAG. Two runtime cycles are
+ ;; structural: compar <-> db (sign/comparison logic vs the
+ ;; fact database) and askp <-> compar (interactive
+ ;; integer/parity queries vs the predicates that prompt
+ ;; them).
:components
((:file "inmis")
(:file "db")
@@ -821,6 +840,8 @@
"miscellaneous" "other-macros" "prerequisites" "utility-macros"
"m2-pattern-matcher"
"variable-predicates")
+ ;; Module is a clean DAG at every level: function calls, macros,
+ ;; special-variable references.
:components
((:file "hyp")
(:file "hypergeometric")
@@ -866,10 +887,8 @@
"hypergeometric"
"m2-pattern-matcher"
"variable-predicates")
- ;; xref analysis confirms compile-time dependencies form a
- ;; DAG (no defmacro is used cross-file). residu is the
- ;; leaf; defint depends on it (function calls); laplac
- ;; depends on defint and hypgeo. No cycles.
+ ;; Module is a clean DAG at every level: function calls, macros,
+ ;; special-variable references.
:components
((:file "residu")
(:file "defint"
@@ -885,6 +904,10 @@
"prerequisites" "utility-macros"
"taylor-series"
"m2-pattern-matcher")
+ ;; Compile-time deps form a DAG. Runtime cycle trigi <->
+ ;; trigo is structural (trigi calls trigo:trigexpand for
+ ;; forward simplification, trigo calls trigi for shared
+ ;; eval/reflection helpers).
:components
((:file "trigi")
(:file "trigo")
@@ -902,8 +925,8 @@
"maxima-language-compiler-macros"
"prerequisites" "utility-macros"
"destructuring-let" "utilities")
- ;; Now circular dependencies; all functions defined before
- ;; use.
+ ;; Module is a clean DAG at every level: function calls, macros,
+ ;; special-variable references.
:components
((:file "mat")
(:file "matrix" :depends-on ("mat"))
@@ -912,6 +935,8 @@
:depends-on ("globals" "defmfun" "declarations"
"maxima-language-compiler-macros"
"prerequisites")
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "sprdet")
(:file "newinv")
@@ -922,6 +947,8 @@
"fundamental-macros" "prerequisites"
"rat-macros"
"simp-utilities")
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "matcom")
(:file "matrun")
@@ -932,8 +959,9 @@
"errset" "fundamental-macros"
"other-macros" "prerequisites"
"utilities" "utility-macros")
- ;; These 2 files are coupled. Hard to separate out
- ;; without moving lots and lots of things around.
+ ;; Compile-time deps form a DAG. Runtime cycle limit <->
+ ;; tlimit is structural (mutual dispatch between limit and
+ ;; Taylor-limit).
:components ((:file "tlimit")
(:file "limit")))
(:module solve :source-pathname ""
@@ -962,17 +990,20 @@
:depends-on ("globals" "defmfun" "compatibility-macros1" "compatibility-macros"
"declarations" "fundamental-macros"
"prerequisites" "utility-macros")
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "mtrace")
(:file "mdebug")))
(:module gamma-expint :source-pathname ""
- :depends-on ("numerical-utilities" "m2-pattern-matcher")
- ;; No circular dependencies among the files here.
- :components
- ((:file "expintegral")
- (:file "gamma"
- :depends-on ("expintegral"))
- (:file "plasma")))
+ :depends-on ("numerical-utilities" "m2-pattern-matcher")
+ ;; Module is a clean DAG at every level: function calls, macros,
+ ;; special-variable references.
+ :components
+ ((:file "expintegral")
+ (:file "gamma"
+ :depends-on ("expintegral"))
+ (:file "plasma")))
(:module miscellaneous :source-pathname ""
:depends-on ("globals" "defmfun" "compatibility-macros1"
"reader" "utility-macros" "commands"
@@ -1007,6 +1038,8 @@
(:module poisson-series :source-pathname ""
:depends-on ("defmfun" "declarations" "fundamental-macros"
"prerequisites")
+ ;; Module is a clean DAG at every level: function calls, macros,
+ ;; special-variable references.
:components
((:file "pois2")
(:file "pois3"
@@ -1017,6 +1050,8 @@
"defmfun" "declarations" "errset"
"miscellaneous" "other-macros" "prerequisites"
"utility-macros")
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "desoln")
(:file "elim")
@@ -1025,6 +1060,8 @@
(:file "plot")))
(:module graphics-drivers :source-pathname ""
:depends-on ("defmfun")
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "plotcolors")
(:file "gnuplot_def")
@@ -1037,6 +1074,8 @@
;; at runtime are not part of the final executable if they aren't.
;; compiled.
#-ecl :load-only #-ecl t
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "autol")
(:file "max_ext")
-----------------------------------------------------------------------
Summary of changes:
src/maxima.system | 75 ++++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 57 insertions(+), 18 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 22:43:13
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via b79fbf5a456108e05e1679b432a1cc904134a7b4 (commit)
from 426b0eb5f0d48f9239674a6b11af3a35d6bfa10c (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit b79fbf5a456108e05e1679b432a1cc904134a7b4
Author: Raymond Toy <toy...@gm...>
Date: Sun Apr 26 15:41:08 2026 -0700
Document the cycles in rational-functions and translator
Add a comment documenting (very briefly) the cycles in the
rationa-functions module and the maxima-language-compiler module.
These cycles are hard to break and probably not worth it now. As long
as the files stay in their respective modules, this dependency is
manageable.
diff --git a/src/maxima.system b/src/maxima.system
index 3c95ff07a..8797a4dad 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -698,6 +698,9 @@
"compatibility-macros" "declarations" "destructuring-let"
"fundamental-macros" "prerequisites" "utilities"
"simp-utilities")
+ ;; Compile-time deps ahve no cross-file macros nor
+ ;; cross-file specials. However, there's lots of mutually
+ ;; recursive calls amlong the files. Pretty hard to fix this.
:components
((:file "rat3a")
(:file "rat3b")
@@ -711,6 +714,11 @@
"compatibility-macros" "compatibility-macros1"
"declarations" "destructuring-let" "fundamental-macros"
"i-o" "prerequisites")
+ ;; Compile-time deps form a DAG. Three small runtime
+ ;; cycles remain, all between transl (the translator core)
+ ;; and its tightly-coupled helpers: trans2 (array
+ ;; dispatch), trutil (defvar pushing), trmode (mode
+ ;; system).
:components
((:file "transl")
(:file "transs"
-----------------------------------------------------------------------
Summary of changes:
src/maxima.system | 8 ++++++++
1 file changed, 8 insertions(+)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 21:15:24
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via 426b0eb5f0d48f9239674a6b11af3a35d6bfa10c (commit)
from adbf6be29f7fb482b8bead7ad73c89792c951724 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 426b0eb5f0d48f9239674a6b11af3a35d6bfa10c
Author: Raymond Toy <toy...@gm...>
Date: Sun Apr 26 14:14:05 2026 -0700
Break cycle between logarc and rpart
Move halfangle, halfangleaux, halfangleaux-factor from logarc.lisp
to a new file halfangle.lisp. These half-angle functions are
called from trigi/trigo, not from logarc itself, but they used
rpart's $realpart/$imagpart -- which combined with rpart's call to
logarc formed the cycle.
Component order becomes logarc -> rpart -> halfangle. The
simplification module now has no cycle.
diff --git a/src/halfangle.lisp b/src/halfangle.lisp
new file mode 100644
index 000000000..5404a90a8
--- /dev/null
+++ b/src/halfangle.lisp
@@ -0,0 +1,69 @@
+;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
+;;;
+;;; This file is part of the Maxima computer algebra project
+;;; (https://sourceforge.net/projects/maxima/)
+;;; SPDX-License-Identifier: GPL-2.0-or-later
+;;;
+;;; Maxima is copyrighted by its authors and licensed under the GNU
+;;; General Public License. This program is distributed WITHOUT ANY
+;;; WARRANTY. See COPYING and AUTHORS for details.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Half-angle simplification, called from trigi and trigo. Split out
+;;; from logarc so that the half-angle code's dependence on rpart's
+;;; $realpart / $imagpart does not create a cycle with rpart's call to
+;;; logarc.
+
+(in-package :maxima)
+(macsyma-module halfangle)
+
+(defun halfangle (f a)
+ (and (mtimesp a)
+ (ratnump (cadr a))
+ (equal (caddr (cadr a)) 2)
+ (halfangleaux f (mul 2 a))))
+
+(defun halfangleaux (f a) ;; f=function; a=twice argument
+ (let ((sw (member f '(%cos %cot %coth %cosh) :test #'eq)))
+ (cond ((member f '(%sin %cos) :test #'eq)
+ (mul (halfangleaux-factor f a)
+ (power (div (add 1 (porm sw (take '(%cos) a))) 2) 1//2)))
+ ((member f '(%tan %cot) :test #'eq)
+ (div (add 1 (porm sw (take '(%cos) a))) (take '(%sin) a)))
+ ((member f '(%sinh %cosh) :test #'eq)
+ (mul (halfangleaux-factor f a)
+ (power (div (add (take '(%cosh) a) (porm sw 1)) 2) 1//2)))
+ ((member f '(%tanh %coth) :test #'eq)
+ (div (add (take '(%cosh) a) (porm sw 1)) (take '(%sinh) a)))
+ ((member f '(%sec %csc %sech %csch) :test #'eq)
+ (inv (halfangleaux (get f 'recip) a))))))
+
+(defun halfangleaux-factor (f a)
+ (cond
+ ((member f '(%sin %cos))
+ (let ((arg (div (if (eq f '%sin)
+ ($realpart a)
+ (add ($realpart a) '$%pi))
+ (mul 2 '$%pi))))
+ (mul
+ (power -1 (simplify (list '($floor) arg)))
+ (sub 1
+ (mul
+ (add 1
+ (power -1 (add (simplify (list '($floor) arg))
+ (simplify (list '($floor) (mul -1 arg))))))
+ (simplify (list '($unit_step) (mul -1 ($imagpart a)))))))))
+ ((member f '(%sinh %cosh))
+ (let ((arg (div (add ($imagpart a) '$%pi) (mul 2 '$%pi)))
+ (fac (if (eq f '%sinh)
+ (div (power (power a 2) (div 1 2)) a)
+ 1)))
+ (mul fac
+ (power -1 (simplify (list '($floor) arg)))
+ (sub 1
+ (mul
+ (add 1
+ (power -1 (add (simplify (list '($floor) arg))
+ (simplify (list '($floor) (mul -1 arg))))))
+ (simplify (list '($unit_step) ($realpart a))))))))
+ (t 1)))
diff --git a/src/logarc.lisp b/src/logarc.lisp
index c9c175a4f..b5905911b 100644
--- a/src/logarc.lisp
+++ b/src/logarc.lisp
@@ -11,7 +11,7 @@
(in-package :maxima)
(macsyma-module logarc)
-;;; Logarc and Halfangles
+;;; Logarithmic form of inverse-trig and trig functions.
(defmfun $logarc (exp)
(cond ((atom exp) exp)
@@ -65,54 +65,3 @@
(logarc '%atan2 (list (partial-logarc (second e) l)
(partial-logarc (third e) l))))
(t (recur-apply #'(lambda (q) (partial-logarc q l)) e))))
-
-(defun halfangle (f a)
- (and (mtimesp a)
- (ratnump (cadr a))
- (equal (caddr (cadr a)) 2)
- (halfangleaux f (mul 2 a))))
-
-(defun halfangleaux (f a) ;; f=function; a=twice argument
- (let ((sw (member f '(%cos %cot %coth %cosh) :test #'eq)))
- (cond ((member f '(%sin %cos) :test #'eq)
- (mul (halfangleaux-factor f a)
- (power (div (add 1 (porm sw (take '(%cos) a))) 2) 1//2)))
- ((member f '(%tan %cot) :test #'eq)
- (div (add 1 (porm sw (take '(%cos) a))) (take '(%sin) a)))
- ((member f '(%sinh %cosh) :test #'eq)
- (mul (halfangleaux-factor f a)
- (power (div (add (take '(%cosh) a) (porm sw 1)) 2) 1//2)))
- ((member f '(%tanh %coth) :test #'eq)
- (div (add (take '(%cosh) a) (porm sw 1)) (take '(%sinh) a)))
- ((member f '(%sec %csc %sech %csch) :test #'eq)
- (inv (halfangleaux (get f 'recip) a))))))
-
-(defun halfangleaux-factor (f a)
- (cond
- ((member f '(%sin %cos))
- (let ((arg (div (if (eq f '%sin)
- ($realpart a)
- (add ($realpart a) '$%pi))
- (mul 2 '$%pi))))
- (mul
- (power -1 (simplify (list '($floor) arg)))
- (sub 1
- (mul
- (add 1
- (power -1 (add (simplify (list '($floor) arg))
- (simplify (list '($floor) (mul -1 arg))))))
- (simplify (list '($unit_step) (mul -1 ($imagpart a)))))))))
- ((member f '(%sinh %cosh))
- (let ((arg (div (add ($imagpart a) '$%pi) (mul 2 '$%pi)))
- (fac (if (eq f '%sinh)
- (div (power (power a 2) (div 1 2)) a)
- 1)))
- (mul fac
- (power -1 (simplify (list '($floor) arg)))
- (sub 1
- (mul
- (add 1
- (power -1 (add (simplify (list '($floor) arg))
- (simplify (list '($floor) (mul -1 arg))))))
- (simplify (list '($unit_step) ($realpart a))))))))
- (t 1)))
diff --git a/src/maxima.system b/src/maxima.system
index 648597785..3c95ff07a 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -622,14 +622,22 @@
"fundamental-macros" "i-o" "other-macros" "prerequisites"
"numerical-utilities"
"simp-utilities")
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "simp-fn")
- (:file "float")
(:file "csimp")
- (:file "csimp2")
- (:file "zero")
(:file "logarc")
- (:file "rpart")))
+ (:file "rpart"
+ :depends-on ("logarc"))
+ (:file "float"
+ :depends-on ("logarc" "rpart"))
+ (:file "csimp2"
+ :depends-on ("csimp" "float" "rpart"))
+ (:file "zero"
+ :depends-on ("rpart"))
+ (:file "halfangle"
+ :depends-on ("rpart"))))
(:module numeric-bigfloat :source-pathname ""
:depends-on ("globals" "defmfun" #-gcl "package"
#+gcl "proclaim")
-----------------------------------------------------------------------
Summary of changes:
src/halfangle.lisp | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/logarc.lisp | 53 +----------------------------------------
src/maxima.system | 16 +++++++++----
3 files changed, 82 insertions(+), 56 deletions(-)
create mode 100644 src/halfangle.lisp
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 20:20:22
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via adbf6be29f7fb482b8bead7ad73c89792c951724 (commit)
from e2fe63ab2fee84a82abd160612c3c843377f6472 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit adbf6be29f7fb482b8bead7ad73c89792c951724
Author: Raymond Toy <toy...@gm...>
Date: Sun Apr 26 13:19:37 2026 -0700
Break the cycle between macsys and mload
Moved $demo from macsys.lisp to mload.lisp. $demo was the only
remaining macsys -> mload entry point ($file_search and $batch
calls), and it logically belongs with the other file-loading
operations in mload.
Also removed `batch' and `batch-internal' from macsys.lisp. The
`batch' function had been marked "APPARENTLY NEVER CALLED. OMIT
FROM GETTEXT SWEEP AND DELETE IT EVENTUALLY" in a comment;
verified that nothing in the source tree actually calls it.
`batch-internal' was only called from `batch', so it became dead
too. Removing them eliminates a residual macsys -> mload
$file_search edge that would otherwise re-create the cycle.
After this, the i-o module is a clean DAG at every level: every
function and special variable is defined in a file that loads
before any caller.
Update the maxima.system comment to reflect that no cycles remain.
diff --git a/src/macsys.lisp b/src/macsys.lisp
index 10e505b31..c68dc195b 100644
--- a/src/macsys.lisp
+++ b/src/macsys.lisp
@@ -308,35 +308,6 @@
(third (mread #+(or sbcl cmu) *standard-input*
#-(or sbcl cmu) *query-io*))))
-;; FUNCTION BATCH APPARENTLY NEVER CALLED. OMIT FROM GETTEXT SWEEP AND DELETE IT EVENTUALLY
-(defun batch (filename &optional demo-p
- &aux (orig filename) list
- file-obj (accumulated-time 0.0) (abortp t))
- (setq list (if demo-p '$file_search_demo '$file_search_maxima))
- (setq filename ($file_search filename (symbol-value list)))
- (or filename (merror "Could not find ~M in ~M: ~M"
- orig list (symbol-value list)))
-
- (unwind-protect
- (progn (batch-internal (setq file-obj (open filename)) demo-p)
- (setq abortp nil)
- (when $showtime
- (format t "~&Batch spent ~,4F seconds in evaluation.~%"
- accumulated-time)))
- (if file-obj (close file-obj))
- (when abortp (format t "~&(Batch of ~A aborted.)~%" filename))))
-
-
-(defun batch-internal (fileobj demo-p)
- (continue :stream (make-echo-stream fileobj *standard-output*)
- :batch-or-demo-flag (if demo-p ':demo ':batch)))
-
-(defmfun $demo (filename)
- (let ((tem ($file_search filename $file_search_demo)))
- (or tem (merror (intl:gettext "demo: could not find ~M in ~M.")
- filename '$file_search_demo))
- ($batch tem '$demo)))
-
(defmfun $bug_report ()
(if $maxima_frontend
(format t (intl:gettext
diff --git a/src/maxima.system b/src/maxima.system
index ca648b52b..648597785 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -643,18 +643,8 @@
"declarations" "fundamental-macros" "other-macros"
"prerequisites" "utilities" "utility-macros"
"evaluator")
- ;; Compile-time deps form a DAG. prompt.lisp holds the
- ;; prompt-formatting cluster (format-prompt, break-prompt,
- ;; main-prompt, stripdollar, plus their specials),
- ;; extracted from macsys and suprv1 so both can depend on
- ;; it without forming a cycle. generic-autoload and
- ;; $directory were moved from suprv1 to mload (where they
- ;; logically belong, since both are file-loading
- ;; operations) to break the suprv1 <-> mload cycle. One
- ;; small runtime cycle remains: macsys <-> mload
- ;; (macsys:demo-impl invokes mload's $batch / $file_search;
- ;; mload:batch-stream re-enters macsys:continue for the
- ;; batch loop).
+ ;; Module is a clean DAG at every level: function calls,
+ ;; macros, special-variable references.
:components
((:file "prompt-util")
(:file "suprv1"
diff --git a/src/mload.lisp b/src/mload.lisp
index effa3891d..110af0b22 100644
--- a/src/mload.lisp
+++ b/src/mload.lisp
@@ -263,6 +263,12 @@
(with-open-file (in-stream filename)
(batch-stream in-stream demo)))))))
+(defmfun $demo (filename)
+ (let ((tem ($file_search filename $file_search_demo)))
+ (or tem (merror (intl:gettext "demo: could not find ~M in ~M.")
+ filename '$file_search_demo))
+ ($batch tem '$demo)))
+
(defun batch-stream (in-stream demo)
(declare (special $batch_answers_from_file))
(let ($load_pathname)
-----------------------------------------------------------------------
Summary of changes:
src/macsys.lisp | 29 -----------------------------
src/maxima.system | 14 ++------------
src/mload.lisp | 6 ++++++
3 files changed, 8 insertions(+), 41 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 19:59:14
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via e2fe63ab2fee84a82abd160612c3c843377f6472 (commit)
from 5ce616cd7569a18015f0dd7c918a8f5c6d32080a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit e2fe63ab2fee84a82abd160612c3c843377f6472
Author: Raymond Toy <toy...@gm...>
Date: Sun Apr 26 12:57:16 2026 -0700
Break the cycle between mload and suprv1
Moved generic-autoload, $directory, and $setup_autoload from suprv1 to
mload. This breaks the cycle.
Update maxima.system with new dependencies.
diff --git a/src/maxima.system b/src/maxima.system
index 23d1087ac..ca648b52b 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -647,18 +647,27 @@
;; prompt-formatting cluster (format-prompt, break-prompt,
;; main-prompt, stripdollar, plus their specials),
;; extracted from macsys and suprv1 so both can depend on
- ;; it without forming a cycle. One small runtime cycle
- ;; remains: macsys <-> mload (macsys:demo-impl invokes
- ;; mload's $batch / $file_search; mload:batch-stream
- ;; re-enters macsys:continue for the batch loop).
+ ;; it without forming a cycle. generic-autoload and
+ ;; $directory were moved from suprv1 to mload (where they
+ ;; logically belong, since both are file-loading
+ ;; operations) to break the suprv1 <-> mload cycle. One
+ ;; small runtime cycle remains: macsys <-> mload
+ ;; (macsys:demo-impl invokes mload's $batch / $file_search;
+ ;; mload:batch-stream re-enters macsys:continue for the
+ ;; batch loop).
:components
- ((:file "prompt")
- (:file "suprv1" :depends-on ("prompt"))
- (:file "macsys" :depends-on ("prompt" "suprv1"))
+ ((:file "prompt-util")
+ (:file "suprv1"
+ :depends-on ("prompt-util"))
+ (:file "macsys"
+ :depends-on ("prompt-util" "suprv1"))
(:file "testsuite")
- (:file "mload" :depends-on ("prompt" "suprv1" "macsys" "testsuite"))
- (:file "mactex" :depends-on ("prompt" "suprv1"))
- (:file "dskfn" :depends-on ("prompt" "suprv1"))))
+ (:file "mload"
+ :depends-on ("prompt-util" "suprv1" "macsys" "testsuite"))
+ (:file "mactex"
+ :depends-on ("prompt-util" "suprv1"))
+ (:file "dskfn"
+ :depends-on ("prompt-util" "suprv1"))))
(:module factoring :source-pathname ""
:depends-on ("globals" "defmfun" "compatibility-macros" "compatibility-macros1"
"declarations" "fundamental-macros" "other-macros"
diff --git a/src/mload.lisp b/src/mload.lisp
index a220814e1..effa3891d 100644
--- a/src/mload.lisp
+++ b/src/mload.lisp
@@ -196,6 +196,43 @@
(pathname-type pathname)))
+;; Following GENERIC-AUTOLOAD is copied from orthopoly/orthopoly-init.lisp.
+;; Previous version didn't take Clisp, CMUCL, or SBCL into account.
+;; Moved here from suprv1 (along with $setup_autoload and $directory)
+;; so that mload no longer has a back-edge from suprv1. The defvar
+;; *autoloaded-files* stays in suprv1 because suprv1's kill code
+;; mutates it; suprv1 also still owns (defvar autoload
+;; 'generic-autoload) since its load-function calls (funcall autoload
+;; ...).
+
+(defun generic-autoload (file &aux type)
+ (unless (member file *autoloaded-files* :test #'equal)
+ (push file *autoloaded-files*)
+ (setq file (pathname (cdr file)))
+ (setq type (pathname-type file))
+ (let ((bin-ext #+gcl "o"
+ #+cmu (c::backend-fasl-file-type c::*target-backend*)
+ #+clisp "fas"
+ #+allegro "fasl"
+ #+openmcl (pathname-type ccl::*.fasl-pathname*)
+ #+lispworks (pathname-type (compile-file-pathname "foo.lisp"))
+ #-(or gcl cmu clisp allegro openmcl lispworks) ""))
+ (if (member type (list bin-ext "lisp" "lsp") :test 'equalp)
+ (let ((*read-base* 10.) (*print-base* 10.)) #-sbcl (load file) #+sbcl (with-compilation-unit nil (load file)))
+ ($load file)))))
+
+(defmfun $directory (path)
+ (cons '(mlist) (mapcar 'namestring (directory ($filename_merge path)))))
+
+(defmfun $setup_autoload (filename &rest functions)
+ (let ((file ($file_search filename)))
+ (dolist (func functions)
+ (nonsymchk func '$setup_autoload)
+ (putprop (setq func ($verbify func)) file 'autoload)
+ (add2lnc func $props)))
+ '$done)
+
+
(defvar *macsyma-startup-queue* nil)
(declaim (special *mread-prompt*))
diff --git a/src/suprv1.lisp b/src/suprv1.lisp
index 74c19d1d9..7038fc786 100644
--- a/src/suprv1.lisp
+++ b/src/suprv1.lisp
@@ -142,22 +142,6 @@
(defvar *autoloaded-files* ())
-(defun generic-autoload (file &aux type)
- (unless (member file *autoloaded-files* :test #'equal)
- (push file *autoloaded-files*)
- (setq file (pathname (cdr file)))
- (setq type (pathname-type file))
- (let ((bin-ext #+gcl "o"
- #+cmu (c::backend-fasl-file-type c::*target-backend*)
- #+clisp "fas"
- #+allegro "fasl"
- #+openmcl (pathname-type ccl::*.fasl-pathname*)
- #+lispworks (pathname-type (compile-file-pathname "foo.lisp"))
- #-(or gcl cmu clisp allegro openmcl lispworks) ""))
- (if (member type (list bin-ext "lisp" "lsp") :test 'equalp)
- (let ((*read-base* 10.) (*print-base* 10.)) #-sbcl (load file) #+sbcl (with-compilation-unit nil (load file)))
- ($load file)))))
-
(defvar autoload 'generic-autoload)
(defun load-function (func mexprp) ; The dynamic loader
@@ -169,14 +153,6 @@
(loadfile (namestring (maxima-string (meval (cadr form)))) nil
(not (member $loadprint '(nil $autoload) :test #'equal))))
-(defmfun $setup_autoload (filename &rest functions)
- (let ((file ($file_search filename)))
- (dolist (func functions)
- (nonsymchk func '$setup_autoload)
- (putprop (setq func ($verbify func)) file 'autoload)
- (add2lnc func $props)))
- '$done)
-
(defun dollarify (l)
(let ((errset t))
(cons '(mlist simp)
@@ -205,9 +181,6 @@
(or tem (merror (intl:gettext "loadfile: failed to load ~A") (namestring path)))
(namestring path)))
-(defmfun $directory (path)
- (cons '(mlist) (mapcar 'namestring (directory ($filename_merge path)))))
-
(defmspec $kill (form)
(clear) ;; get assume db into consistent state
(mapc #'kill1 (cdr form))
-----------------------------------------------------------------------
Summary of changes:
src/maxima.system | 29 +++++++++++++++++++----------
src/mload.lisp | 37 +++++++++++++++++++++++++++++++++++++
src/suprv1.lisp | 27 ---------------------------
3 files changed, 56 insertions(+), 37 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 18:16:31
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via 5ce616cd7569a18015f0dd7c918a8f5c6d32080a (commit)
from 928cc063573c9bf175ccf9eac02c7abf681f7f36 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 5ce616cd7569a18015f0dd7c918a8f5c6d32080a
Author: Raymond Toy <toy...@gm...>
Date: Sun Apr 26 11:13:30 2026 -0700
Break cycle between macsys and suprv1
This cycle is broken by moving the common prompting functions from
suprv1 to a new file, prompt-util.lisp. Common defvars also moved.
Updated comment on the cycle.
diff --git a/src/macsys.lisp b/src/macsys.lisp
index 129708cf1..10e505b31 100644
--- a/src/macsys.lisp
+++ b/src/macsys.lisp
@@ -14,82 +14,6 @@
(macsyma-module system)
-;;; Standard Kinds of Input Prompts
-
-(defmvar $prompt '_
- "Prompt symbol of the demo function, playback, and the Maxima break loop.")
-
-
-;; A prefix and suffix that are wrapped around every prompt that Maxima
-;; emits. This is designed for use with text-based interfaces that drive Maxima
-;; through standard input and output and need to decorate prompts to make the
-;; output easier to parse. There are some more notes in
-;; doc/implementation/external-interface.txt.
-(defvar *prompt-prefix* "")
-(defvar *prompt-suffix* "")
-(defvar *general-display-prefix* "")
-(defvar $alt_format_prompt nil "If NIL, use DEFAULT-FORMAT-PROMPT to print input prompt; if a function, use it to print input prompt.")
-
-(defun format-prompt (destination control-string &rest arguments)
- "If $ALT_FORMAT_PROMPT is NIL, use DEFAULT-FORMAT-PROMPT to print
-prompt; otherwise MFUNCALL $ALT_FORMAT_PROMPT to print prompt."
- (funcall (if $alt_format_prompt #'alt-format-prompt #'default-format-prompt)
- destination control-string arguments))
-
-(defun alt-format-prompt (destination control-string arguments)
- "MFUNCALL $ALT_FORMAT_PROMPT with a heavy coating of error protection."
- (handler-bind ((error (lambda(msg) (setq $alt_format_prompt nil)
- (format t (intl:gettext "Error in printing prompt; reverting to default.~%~a") msg)
- (throw 'macsyma-quit 'maxima-error))))
- (with-$error (let ((prompt (mfuncall $alt_format_prompt destination control-string arguments)))
- (if (stringp prompt) prompt (merror "alt_format_prompt returned an object of type ~a, needed a string." (type-of prompt)))))))
-
-(defun default-format-prompt (destination control-string arguments)
- "Like AFORMAT, but add the prefix and suffix configured for a prompt. This
-function deals correctly with the ~M control character, but only when
-DESTINATION is an actual stream (rather than nil for a string)."
- (let ((*print-circle* nil) (*print-base* 10.) *print-radix*)
- (if (null destination)
- ;; return value string is important
- (concatenate 'string
- *prompt-prefix*
- (apply #'aformat destination
- control-string
- arguments)
- *prompt-suffix*)
- (progn
- (format destination "~A~A~A"
- *prompt-prefix*
- (apply #'aformat nil
- control-string
- arguments)
- *prompt-suffix*)))))
-
-
-(defvar $default_format_prompt (symbol-function 'default-format-prompt))
-
-;; "When time began" (or at least the start of version control history),
-;; the following comment was made at this point:
-;;
-;; instead of using this STRIPDOLLAR hackery, the
-;; MREAD function should call MFORMAT to print the prompt,
-;; and take a format string and format arguments.
-;; Even easier and more general is for MREAD to take
-;; a FUNARG as the prompt. -gjc
-;;
-;; I guess we're still failing miserably, but unfortunately MFORMAT/AFORMAT
-;; don't deal correctly with ~M plus a string output stream.
-(defun main-prompt ()
- (if (and *display-labels-p* (not *suppress-input-echo*))
- (format-prompt nil "(~A~A) "
- (print-invert-case (stripdollar $inchar))
- $linenum)
- ""))
-
-(defun break-prompt ()
- (format-prompt nil "~A"
- (print-invert-case (stripdollar $prompt))))
-
(defun toplevel-macsyma-eval (x)
;; Catch rat-err's here.
;;
@@ -518,7 +442,6 @@ DESTINATION is an actual stream (rather than nil for a string)."
(defvar *maxima-started* nil)
(defvar *maxima-prolog* "")
-(defvar *maxima-epilog* "")
(defvar *maxima-quiet* nil)
diff --git a/src/maxima.system b/src/maxima.system
index 5f32fcc76..23d1087ac 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -643,13 +643,22 @@
"declarations" "fundamental-macros" "other-macros"
"prerequisites" "utilities" "utility-macros"
"evaluator")
+ ;; Compile-time deps form a DAG. prompt.lisp holds the
+ ;; prompt-formatting cluster (format-prompt, break-prompt,
+ ;; main-prompt, stripdollar, plus their specials),
+ ;; extracted from macsys and suprv1 so both can depend on
+ ;; it without forming a cycle. One small runtime cycle
+ ;; remains: macsys <-> mload (macsys:demo-impl invokes
+ ;; mload's $batch / $file_search; mload:batch-stream
+ ;; re-enters macsys:continue for the batch loop).
:components
- ((:file "macsys")
+ ((:file "prompt")
+ (:file "suprv1" :depends-on ("prompt"))
+ (:file "macsys" :depends-on ("prompt" "suprv1"))
(:file "testsuite")
- (:file "mload")
- (:file "suprv1")
- (:file "mactex")
- (:file "dskfn")))
+ (:file "mload" :depends-on ("prompt" "suprv1" "macsys" "testsuite"))
+ (:file "mactex" :depends-on ("prompt" "suprv1"))
+ (:file "dskfn" :depends-on ("prompt" "suprv1"))))
(:module factoring :source-pathname ""
:depends-on ("globals" "defmfun" "compatibility-macros" "compatibility-macros1"
"declarations" "fundamental-macros" "other-macros"
@@ -933,7 +942,7 @@
:depends-on ("solve"))
(:file "algsys"
:depends-on ("solve" "sqrtdenest" "polyrz" "cpoly")
- ))
+ )))
(:module debugging :source-pathname ""
:depends-on ("globals" "defmfun" "compatibility-macros1" "compatibility-macros"
"declarations" "fundamental-macros"
diff --git a/src/prompt-util.lisp b/src/prompt-util.lisp
new file mode 100644
index 000000000..66f115e41
--- /dev/null
+++ b/src/prompt-util.lisp
@@ -0,0 +1,108 @@
+;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
+;;;
+;;; This file is part of the Maxima computer algebra project
+;;; (https://sourceforge.net/projects/maxima/)
+;;; SPDX-License-Identifier: GPL-2.0-or-later
+;;;
+;;; Maxima is copyrighted by its authors and licensed under the GNU
+;;; General Public License. This program is distributed WITHOUT ANY
+;;; WARRANTY. See COPYING and AUTHORS for details.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; PROMPT: prompt-formatting cluster. Holds the input-prompt
+;;; specials, the format-prompt machinery, the main-prompt /
+;;; break-prompt printers, and the stripdollar utility. Extracted
+;;; into its own file so that suprv1 (which calls break-prompt from
+;;; continuep) and macsys (which calls format-prompt and stripdollar
+;;; from the REPL) can both depend on it, without a cycle.
+
+(in-package :maxima)
+
+(macsyma-module prompt)
+
+;;; Standard Kinds of Input Prompts
+
+(defmvar $prompt '_
+ "Prompt symbol of the demo function, playback, and the Maxima break loop.")
+
+
+;; A prefix and suffix that are wrapped around every prompt that Maxima
+;; emits. This is designed for use with text-based interfaces that drive Maxima
+;; through standard input and output and need to decorate prompts to make the
+;; output easier to parse. There are some more notes in
+;; doc/implementation/external-interface.txt.
+(defvar *prompt-prefix* "")
+(defvar *prompt-suffix* "")
+(defvar *general-display-prefix* "")
+(defvar $alt_format_prompt nil "If NIL, use DEFAULT-FORMAT-PROMPT to print input prompt; if a function, use it to print input prompt.")
+
+(defun format-prompt (destination control-string &rest arguments)
+ "If $ALT_FORMAT_PROMPT is NIL, use DEFAULT-FORMAT-PROMPT to print
+prompt; otherwise MFUNCALL $ALT_FORMAT_PROMPT to print prompt."
+ (funcall (if $alt_format_prompt #'alt-format-prompt #'default-format-prompt)
+ destination control-string arguments))
+
+(defun alt-format-prompt (destination control-string arguments)
+ "MFUNCALL $ALT_FORMAT_PROMPT with a heavy coating of error protection."
+ (handler-bind ((error (lambda(msg) (setq $alt_format_prompt nil)
+ (format t (intl:gettext "Error in printing prompt; reverting to default.~%~a") msg)
+ (throw 'macsyma-quit 'maxima-error))))
+ (with-$error (let ((prompt (mfuncall $alt_format_prompt destination control-string arguments)))
+ (if (stringp prompt) prompt (merror "alt_format_prompt returned an object of type ~a, needed a string." (type-of prompt)))))))
+
+(defun default-format-prompt (destination control-string arguments)
+ "Like AFORMAT, but add the prefix and suffix configured for a prompt. This
+function deals correctly with the ~M control character, but only when
+DESTINATION is an actual stream (rather than nil for a string)."
+ (let ((*print-circle* nil) (*print-base* 10.) *print-radix*)
+ (if (null destination)
+ ;; return value string is important
+ (concatenate 'string
+ *prompt-prefix*
+ (apply #'aformat destination
+ control-string
+ arguments)
+ *prompt-suffix*)
+ (progn
+ (format destination "~A~A~A"
+ *prompt-prefix*
+ (apply #'aformat nil
+ control-string
+ arguments)
+ *prompt-suffix*)))))
+
+
+(defvar $default_format_prompt (symbol-function 'default-format-prompt))
+
+;; "When time began" (or at least the start of version control history),
+;; the following comment was made at this point:
+;;
+;; instead of using this STRIPDOLLAR hackery, the
+;; MREAD function should call MFORMAT to print the prompt,
+;; and take a format string and format arguments.
+;; Even easier and more general is for MREAD to take
+;; a FUNARG as the prompt. -gjc
+;;
+;; I guess we're still failing miserably, but unfortunately MFORMAT/AFORMAT
+;; don't deal correctly with ~M plus a string output stream.
+(defun main-prompt ()
+ (if (and *display-labels-p* (not *suppress-input-echo*))
+ (format-prompt nil "(~A~A) "
+ (print-invert-case (stripdollar $inchar))
+ $linenum)
+ ""))
+
+(defun break-prompt ()
+ (format-prompt nil "~A"
+ (print-invert-case (stripdollar $prompt))))
+
+(defun stripdollar (x)
+ (cond ((not (atom x))
+ (cond ((and (eq (caar x) 'bigfloat) (not (minusp (cadr x)))) (implode (fpformat x)))
+ (t (merror (intl:gettext "STRIPDOLLAR: argument must be an atom; found: ~M") x))))
+ ((numberp x) x)
+ ((null x) 'false)
+ ((eq x t) 'true)
+ ((member (get-first-char x) '(#\$ #\%) :test #'char=)
+ (intern (subseq (string x) 1)))
+ (t x)))
diff --git a/src/suprv1.lisp b/src/suprv1.lisp
index 2d95d875b..74c19d1d9 100644
--- a/src/suprv1.lisp
+++ b/src/suprv1.lisp
@@ -542,17 +542,6 @@
(setf $aliases (delete x $aliases :count 1 :test #'eq))
(remprop (setq x y) 'alias) (remprop x 'verb) x))))
-(defun stripdollar (x)
- (cond ((not (atom x))
- (cond ((and (eq (caar x) 'bigfloat) (not (minusp (cadr x)))) (implode (fpformat x)))
- (t (merror (intl:gettext "STRIPDOLLAR: argument must be an atom; found: ~M") x))))
- ((numberp x) x)
- ((null x) 'false)
- ((eq x t) 'true)
- ((member (get-first-char x) '(#\$ #\%) :test #'char=)
- (intern (subseq (string x) 1)))
- (t x)))
-
(defun fullstrip (x)
(mapcar #'fullstrip1 x))
@@ -781,6 +770,9 @@
(incf thistime (- (get-internal-run-time) tim))))
+(defvar *maxima-epilog* ""
+ "String printed when Maxima exits via $quit.")
+
(defmfun $quit (&optional (exit-code 0))
"Quit Maxima with an optional exit code for Lisps and systems that
support exit codes."
-----------------------------------------------------------------------
Summary of changes:
src/macsys.lisp | 77 ------------------------------------
src/maxima.system | 21 +++++++---
src/prompt-util.lisp | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++
src/suprv1.lisp | 14 ++-----
4 files changed, 126 insertions(+), 94 deletions(-)
create mode 100644 src/prompt-util.lisp
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 14:57:08
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via 928cc063573c9bf175ccf9eac02c7abf681f7f36 (commit)
from ecb45b5004b8b08ea112f8996da45142ba24cb03 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 928cc063573c9bf175ccf9eac02c7abf681f7f36
Author: Raymond Toy <toy...@gm...>
Date: Sun Apr 26 07:55:31 2026 -0700
Document the cycle in the factoring module
Add :depends-on so things are built in the (mostly) correct order but,
of course, there are cycles so things aren't quite clean.
diff --git a/src/maxima.system b/src/maxima.system
index 7d8baa186..5f32fcc76 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -654,13 +654,24 @@
:depends-on ("globals" "defmfun" "compatibility-macros" "compatibility-macros1"
"declarations" "fundamental-macros" "other-macros"
"prerequisites" "rat-macros" "utilities")
- :components
- ((:file "lesfac")
- (:file "factor")
- (:file "algfac")
- (:file "nalgfa")
- (:file "ufact")
- (:file "result")))
+ ;; Compile-time deps form a DAG. Runtime cycle by design:
+ ;; factor <-> algfac (7+7 calls) -- factor's general
+ ;; factoring dispatches to algfac for algebraic
+ ;; extensions; algfac uses factor's primitives. Several
+ ;; declare-top specials in factor.lisp (var, res, trl*,
+ ;; ind, alc, *xn, split*) are mutated cross-file.
+ :components
+ ((:file "factor") ; declare-top specials, base primitives
+ (:file "lesfac" ; calls factor:testdivide
+ :depends-on ("factor"))
+ (:file "ufact" ; mutates factor's specials
+ :depends-on ("factor"))
+ (:file "result"
+ :depends-on ("factor" "lesfac" "ufact"))
+ (:file "algfac" ; cycle with factor; uses result:redresult
+ :depends-on ("factor" "result"))
+ (:file "nalgfa" ; calls result:resultant)
+ :depends-on ("factor" "result"))))
(:module ifactor :source-pathname ""
:depends-on ("defmfun" "prerequisites" "rat-macros" "utility-macros")
:components
-----------------------------------------------------------------------
Summary of changes:
src/maxima.system | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 14:40:41
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via ecb45b5004b8b08ea112f8996da45142ba24cb03 (commit)
via e379afb446be0dc5dcdbc30c6b2e7ac25cfc4df8 (commit)
from 2fa43aac082a79f93d9a9509e71b25f3b3852adc (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit ecb45b5004b8b08ea112f8996da45142ba24cb03
Author: Raymond Toy <toy...@gm...>
Date: Sun Apr 26 07:39:43 2026 -0700
Update file deps for solve module
Add documentation for the cycle between the functions in the module as
well.
diff --git a/src/maxima.system b/src/maxima.system
index 05127253a..7d8baa186 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -831,17 +831,18 @@
"hypergeometric"
"m2-pattern-matcher"
"variable-predicates")
- ;; An analysis using xref data shows that these files have
- ;; no circular dependencies. residu.lisp and hypeo.lisp
- ;; are independent of the other files, and the
- ;; dependencies listed below are correct.
+ ;; xref analysis confirms compile-time dependencies form a
+ ;; DAG (no defmacro is used cross-file). residu is the
+ ;; leaf; defint depends on it (function calls); laplac
+ ;; depends on defint and hypgeo. No cycles.
:components
((:file "residu")
(:file "defint"
:depends-on ("residu"))
- (:file "hypgeo")
+ (:file "hypgeo"
+ :depends-on ("residu"))
(:file "laplac"
- :depends-on ("defint" "hypgeo"))))
+ :depends-on ("defint" "hypgeo" "residu"))))
(:module trigonometry :source-pathname ""
:depends-on ("globals" "defmfun"
"compatibility-macros" "declarations"
@@ -905,13 +906,23 @@
"declarations" "fundamental-macros"
"other-macros" "prerequisites" "rat-macros"
"utilities" "utility-macros")
- :components
- ((:file "solve")
- (:file "psolve")
- (:file "algsys")
- (:file "sqrtdenest")
+ ;; Compile-time deps form a DAG. Two runtime call cycles
+ ;; remain by design: solve <-> psolve (cubic/quartic
+ ;; formulas tightly coupled to solve's display
+ ;; machinery), and solve <-> algsys (univariate vs
+ ;; system-of-equations dispatchers calling each other).
+ ;; sqrtdenest, polyrz, and cpoly are leaves, called from
+ ;; algsys.
+ :components
+ ((:file "sqrtdenest")
(:file "polyrz")
- (:file "cpoly")))
+ (:file "cpoly")
+ (:file "solve")
+ (:file "psolve"
+ :depends-on ("solve"))
+ (:file "algsys"
+ :depends-on ("solve" "sqrtdenest" "polyrz" "cpoly")
+ ))
(:module debugging :source-pathname ""
:depends-on ("globals" "defmfun" "compatibility-macros1" "compatibility-macros"
"declarations" "fundamental-macros"
commit e379afb446be0dc5dcdbc30c6b2e7ac25cfc4df8
Author: Raymond Toy <toy...@gm...>
Date: Sat Apr 25 21:45:19 2026 -0700
Just add a comment on the cycle in the integration module
diff --git a/src/maxima.system b/src/maxima.system
index 2984744e2..05127253a 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -800,10 +800,19 @@
"prerequisites" "rat-macros" "utility-macros"
"m2-pattern-matcher"
"variable-predicates")
+ ;; Compile-time deps form a DAG. Runtime: risch.lisp and
+ ;; sin.lisp are mutually recursive by design -- risch's
+ ;; hypertrigint1 falls back to sin's sinint when Risch
+ ;; can't make progress, and sin's integrate1 dispatches to
+ ;; risch's rischint. The cycle is structural; not broken.
+ ;;
+ ;; This could be fixed by moving lots of code around to a
+ ;; separate file.
:components
((:file "sin-util")
(:file "sinint")
- (:file "risch")
+ (:file "risch"
+ :depends-on ("sinint"))
(:file "irinte"
:depends-on ("sin-util"))
(:file "sin"
-----------------------------------------------------------------------
Summary of changes:
src/maxima.system | 46 +++++++++++++++++++++++++++++++++-------------
1 file changed, 33 insertions(+), 13 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 04:32:43
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via 2fa43aac082a79f93d9a9509e71b25f3b3852adc (commit)
from 2acb006939a0403a72cb7f5af0c019d1dc8248e6 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 2fa43aac082a79f93d9a9509e71b25f3b3852adc
Author: Raymond Toy <toy...@gm...>
Date: Sat Apr 25 21:31:26 2026 -0700
Fix circular dependency in matrix-algebra
Just needed to move defun get-array-pointer from a matrix.lisp to
mat.lisp. No circulare dependencies now. Functions are defined
before use.
diff --git a/src/mat.lisp b/src/mat.lisp
index 1b3e89755..a4053e3f0 100644
--- a/src/mat.lisp
+++ b/src/mat.lisp
@@ -23,6 +23,16 @@
(defvar *col*)
(defvar *colinv*)
+;; If SYMBOL is an array, return it directly; otherwise return its
+;; value cell. Used to follow indirect array references where one
+;; symbol is bound to another that holds the actual array. (Moved
+;; from matrix.lisp so that mat.lisp is a leaf in the
+;; matrix-algebra module's call graph.)
+(defun get-array-pointer (symbol)
+ "There may be nesting of functions and we may well need to apply
+ this twice in a row"
+ (if (arrayp symbol) symbol (symbol-value symbol)))
+
(defun solcoef (m *c varl flag)
(prog (cc answer leftover)
diff --git a/src/matrix.lisp b/src/matrix.lisp
index 4d030ff80..e767247ab 100644
--- a/src/matrix.lisp
+++ b/src/matrix.lisp
@@ -22,12 +22,6 @@
(defvar *mat*)
-;;I believe that all the code now stores arrays in the value cell
-(defun get-array-pointer (symbol)
- "There may be nesting of functions and we may well need to apply
- this twice in a row"
- (if (arrayp symbol) symbol (symbol-value symbol)))
-
(defun mxc (x)
(mapcar #'(lambda (y) (cons '(mlist) y)) x)) ; Matrix to MACSYMA conversion
diff --git a/src/maxima.system b/src/maxima.system
index c63aff0ae..2984744e2 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -857,10 +857,12 @@
"maxima-language-compiler-macros"
"prerequisites" "utility-macros"
"destructuring-let" "utilities")
+ ;; Now circular dependencies; all functions defined before
+ ;; use.
:components
((:file "mat")
- (:file "linnew")
- (:file "matrix")))
+ (:file "matrix" :depends-on ("mat"))
+ (:file "linnew" :depends-on ("mat" "matrix"))))
(:module determinants :source-pathname ""
:depends-on ("globals" "defmfun" "declarations"
"maxima-language-compiler-macros"
-----------------------------------------------------------------------
Summary of changes:
src/mat.lisp | 10 ++++++++++
src/matrix.lisp | 6 ------
src/maxima.system | 6 ++++--
3 files changed, 14 insertions(+), 8 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 02:33:13
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via 2acb006939a0403a72cb7f5af0c019d1dc8248e6 (commit)
from 424a7370c7f9302d1ee3f16120dff31efac72198 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 2acb006939a0403a72cb7f5af0c019d1dc8248e6
Author: Raymond Toy <toy...@gm...>
Date: Sat Apr 25 19:31:31 2026 -0700
Rename chrps to *chrps*
Make it clear that it's a specvar.
diff --git a/src/grind.lisp b/src/grind.lisp
index 49bd9be4d..72708e076 100644
--- a/src/grind.lisp
+++ b/src/grind.lisp
@@ -57,7 +57,7 @@
(defun strgrind (x)
- (let (*grind-charlist* (chrps 0))
+ (let (*grind-charlist* (*chrps* 0))
(strprint (msize x nil nil 'mparen 'mparen))
(nreverse *grind-charlist*)))
@@ -65,27 +65,27 @@
(cond ((atom x) (styo x))
((< (car x) (chrct*)) (mapc #'strprint (cdr x)))
(t (prog (i)
- (setq i chrps)
+ (setq i *chrps*)
(strprint (cadr x))
(cond ((null (cddr x)) (return nil))
((and (or (atom (cadr x)) (< (caadr x) (chrct*)))
(or (> (chrct*) (truncate $linel 2))
(atom (caddr x)) (< (caaddr x) (chrct*))))
- (setq i chrps)
+ (setq i *chrps*)
(strprint (caddr x)))
- (t (setq i (1+ i)) (setq chrps 0) (sterpri)
+ (t (setq i (1+ i)) (setq *chrps* 0) (sterpri)
(styotbsp i) (strprint (caddr x))))
(do ((l (cdddr x) (cdr l))) ((null l))
(cond
((or (atom (car l)) (< (caar l) (chrct*))) nil)
- (t (setq chrps 0) (sterpri) (styotbsp i)))
+ (t (setq *chrps* 0) (sterpri) (styotbsp i)))
(strprint (car l)))))))
-(defun styo (x) (setq *grind-charlist* (cons x *grind-charlist*) chrps (1+ chrps)))
+(defun styo (x) (setq *grind-charlist* (cons x *grind-charlist*) *chrps* (1+ chrps)))
-(defun sterpri () (setq *grind-charlist* (cons #\newline *grind-charlist*) chrps 0))
+(defun sterpri () (setq *grind-charlist* (cons #\newline *grind-charlist*) *chrps* 0))
-(defun styotbsp (n) (declare (fixnum n)) (setq chrps n)
+(defun styotbsp (n) (declare (fixnum n)) (setq *chrps* n)
(do () ((< n 1)) (setq *grind-charlist* (cons #\space *grind-charlist*) n (1- n))))
(defun mstring (x)
diff --git a/src/mgrind.lisp b/src/mgrind.lisp
index 4d854b643..b5f3faa62 100644
--- a/src/mgrind.lisp
+++ b/src/mgrind.lisp
@@ -16,16 +16,16 @@
;;; appear, so that mprint can decide when to break a line and so
;;; that strgrind (in grind.lisp) can buffer string-mode output via
;;; styo/sterpri.
-(defvar chrps 0)
+(defvar *chrps* 0)
;;; Number of characters left on the current output line, given the
;;; current position chrps and Maxima's $linel.
-(defun chrct* () (- $linel chrps))
+(defun chrct* () (- $linel *chrps*))
;;; Output N spaces to OUT, advancing chrps.
(defun mtyotbsp (n out)
(declare (fixnum n))
- (incf chrps n)
+ (incf *chrps* n)
(do () ((< n 1)) (write-char #\space out) (decf n)))
;;; Format a Maxima `do' form (mdo) as a flat keyword-tagged list,
@@ -95,28 +95,28 @@
(t dummy))))))
(defun mgrind (x out)
- (setq chrps 0)
+ (setq *chrps* 0)
(mprint (msize x nil nil 'mparen 'mparen) out))
(defun mprint (x out)
(cond ((characterp x)
- (incf chrps)
+ (incf *chrps*)
(write-char x out))
((< (car x) (chrct*)) (mapc #'(lambda (l) (mprint l out)) (cdr x)))
- (t (prog (i) (setq i chrps)
+ (t (prog (i) (setq i *chrps*)
(mprint (cadr x) out)
(cond ((null (cddr x)) (return nil))
((and (or (atom (cadr x)) (< (caadr x) (chrct*)))
(or (> (chrct*) (truncate $linel 2))
(atom (caddr x)) (< (caaddr x) (chrct*))))
- (setq i chrps)
+ (setq i *chrps*)
(mprint (caddr x) out))
- (t (setq i (1+ i)) (setq chrps 0) (terpri out)
+ (t (setq i (1+ i)) (setq *chrps* 0) (terpri out)
(mtyotbsp i out) (mprint (caddr x) out)))
(do ((l (cdddr x) (cdr l))) ((null l))
(cond
((or (atom (car l)) (< (caar l) (chrct*))) nil)
- (t (setq chrps 0) (terpri out) (mtyotbsp i out)))
+ (t (setq *chrps* 0) (terpri out) (mtyotbsp i out)))
(mprint (car l) out))))))
(defun msize (x l r lop rop)
-----------------------------------------------------------------------
Summary of changes:
src/grind.lisp | 16 ++++++++--------
src/mgrind.lisp | 18 +++++++++---------
2 files changed, 17 insertions(+), 17 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 02:26:42
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via 424a7370c7f9302d1ee3f16120dff31efac72198 (commit)
from e1299a8ffad18a827344aad03415626f54f9d52d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 424a7370c7f9302d1ee3f16120dff31efac72198
Author: Raymond Toy <toy...@gm...>
Date: Sat Apr 25 19:20:49 2026 -0700
Fix the cycle between mgrind and grind
First, actually make chrps a defvar in mgrind instead of declaring it
special all over.
Second, move
* chrct* — moved from grind.lisp.
* mtyotbsp — moved from grind.lisp.
* strmdo, strmdoin — moved from grind.lisp.
* (defmvar $display_format_internal nil "...") — moved from displa.lisp.
* nformat-check — moved from displa.lisp (uses $display_format_internal).
* makestring — moved from displa.lisp.
Update defsystem with correct dependencies and add note that there are
no circular dependencies among the files.
diff --git a/src/displa.lisp b/src/displa.lisp
index 97c9d4fac..027a93b3b 100644
--- a/src/displa.lisp
+++ b/src/displa.lisp
@@ -87,17 +87,6 @@
(mgrind form *standard-output*)
(mterpri))
-(defmvar $display_format_internal nil
- "Setting this TRUE can help give the user a greater understanding
- of the behavior of maxima on certain of his problems,
- especially those involving roots and quotients")
-
-(defun nformat-check (form)
- (if (and $display_format_internal
- (not (or (atom form) (atom (car form)) (specrepp form))))
- form
- (nformat form)))
-
(defun dimension (form result lop rop w right)
(let ((level (1+ level))
(break (if (and w break) (+ w break))))
@@ -152,28 +141,6 @@
(incf width))
(setq result (rplacd dummy result))))))))
-(defun makestring (atom)
- (let (dummy)
- (cond ((numberp atom) (exploden atom))
- ((stringp atom)
- (setq dummy (coerce atom 'list))
- (if $stringdisp
- (cons #\" (nconc dummy (list #\")))
- dummy))
- ((not (symbolp atom)) (exploden atom))
- ((and (setq dummy (get atom 'reversealias))
- (not (and (member atom $aliases :test #'eq) (get atom 'noun))))
- (exploden (stripdollar dummy)))
- ((not (eq (getop atom) atom))
- (makestring (getop atom)))
- (t (setq dummy (exploden atom))
- (cond
- ((null dummy) nil)
- ((char= #\$ (car dummy)) (cdr dummy))
- ((char= #\% (car dummy)) (cdr dummy))
- ($lispdisp (cons #\? dummy))
- (t dummy))))))
-
(defun dimension-paren (form result)
(setq result (cons #\) (dimension form (cons #\( result) 'mparen 'mparen 1 (1+ right))))
(incf width 2)
diff --git a/src/grind.lisp b/src/grind.lisp
index 54cd62208..49bd9be4d 100644
--- a/src/grind.lisp
+++ b/src/grind.lisp
@@ -12,9 +12,7 @@
(macsyma-module grind)
-(declare-top (special lop rop *grind-charlist* chrps))
-
-(defun chrct* () (- $linel chrps))
+(declare-top (special lop rop *grind-charlist*))
(defmspec $grind (x)
(setq x (cdr x))
@@ -58,11 +56,6 @@
'$done))
-(defun mtyotbsp (n out)
- (declare (fixnum n))
- (incf chrps n)
- (do () ((< n 1)) (write-char #\space out) (decf n)))
-
(defun strgrind (x)
(let (*grind-charlist* (chrps 0))
(strprint (msize x nil nil 'mparen 'mparen))
@@ -112,32 +105,6 @@
;;; ----------------------------------------------------------------------------
-;; Formatting a mdefine or mdefmacro expression
-
-
-
-(defun strmdo (x)
- (nconc (cond ((second x) `($for ,(second x))))
- (cond ((equal 1 (third x)) nil)
- ((third x) `($from ,(third x))))
- (cond ((equal 1 (fourth x)) nil)
- ((fourth x) `($step ,(fourth x)))
- ((fifth x) `($next ,(fifth x))))
- (cond ((sixth x) `($thru ,(sixth x))))
- (cond ((null (seventh x)) nil)
- ((and (consp (seventh x)) (eq 'mnot (caar (seventh x))))
- `($while ,(cadr (seventh x))))
- (t `($unless ,(seventh x))))
- `($do ,(eighth x))))
-
-(defun strmdoin (x)
- (nconc `($for ,(second x) $in ,(third x))
- (cond ((sixth x) `($thru ,(sixth x))))
- (cond ((null (seventh x)) nil)
- ((and (consp (seventh x)) (eq 'mnot (caar (seventh x))))
- `($while ,(cadr (seventh x))))
- (t `($unless ,(seventh x))))
- `($do ,(eighth x))))
(defprop mfunction 190. lbp)
(defprop mfunction 190. rbp)
diff --git a/src/maxima.system b/src/maxima.system
index df33d81d7..c63aff0ae 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -745,13 +745,13 @@
:depends-on ("globals" "defmfun" "compatibility-macros1" "declarations"
"fundamental-macros" "prerequisites"
"simp-utilities")
+ ;; No circular dependencies between these files.
:components
((:file "mgrind") ; grinding/sizing utilities
- ;; displa and grind are now independent.
- (:file "displa" ; 2D display
- :depends-on ("mgrind"))
(:file "grind" ; Linear display
- :depends-on ("mgrind"))))
+ :depends-on ("mgrind"))
+ (:file "displa" ; 2D display
+ :depends-on ("mgrind" "grind"))))
(:module gcd :source-pathname ""
:depends-on ("globals" "defmfun" "declarations" "destructuring-let"
"fundamental-macros" "prerequisites"
@@ -910,9 +910,11 @@
(:file "mdebug")))
(:module gamma-expint :source-pathname ""
:depends-on ("numerical-utilities" "m2-pattern-matcher")
+ ;; No circular dependencies among the files here.
:components
((:file "expintegral")
- (:file "gamma")
+ (:file "gamma"
+ :depends-on ("expintegral"))
(:file "plasma")))
(:module miscellaneous :source-pathname ""
:depends-on ("globals" "defmfun" "compatibility-macros1"
diff --git a/src/mgrind.lisp b/src/mgrind.lisp
index 15d1a3059..4d854b643 100644
--- a/src/mgrind.lisp
+++ b/src/mgrind.lisp
@@ -11,6 +11,89 @@
(in-package :maxima)
+;;; Current character position on the output line. Used by the
+;;; grinding/sizing printer to track where the next character will
+;;; appear, so that mprint can decide when to break a line and so
+;;; that strgrind (in grind.lisp) can buffer string-mode output via
+;;; styo/sterpri.
+(defvar chrps 0)
+
+;;; Number of characters left on the current output line, given the
+;;; current position chrps and Maxima's $linel.
+(defun chrct* () (- $linel chrps))
+
+;;; Output N spaces to OUT, advancing chrps.
+(defun mtyotbsp (n out)
+ (declare (fixnum n))
+ (incf chrps n)
+ (do () ((< n 1)) (write-char #\space out) (decf n)))
+
+;;; Format a Maxima `do' form (mdo) as a flat keyword-tagged list,
+;;; suitable for grinding. Pure data builder.
+(defun strmdo (x)
+ (nconc (cond ((second x) `($for ,(second x))))
+ (cond ((equal 1 (third x)) nil)
+ ((third x) `($from ,(third x))))
+ (cond ((equal 1 (fourth x)) nil)
+ ((fourth x) `($step ,(fourth x)))
+ ((fifth x) `($next ,(fifth x))))
+ (cond ((sixth x) `($thru ,(sixth x))))
+ (cond ((null (seventh x)) nil)
+ ((and (consp (seventh x)) (eq 'mnot (caar (seventh x))))
+ `($while ,(cadr (seventh x))))
+ (t `($unless ,(seventh x))))
+ `($do ,(eighth x))))
+
+;;; Format a Maxima `do in' form (mdoin) as a flat keyword-tagged list,
+;;; suitable for grinding. Pure data builder.
+(defun strmdoin (x)
+ (nconc `($for ,(second x) $in ,(third x))
+ (cond ((sixth x) `($thru ,(sixth x))))
+ (cond ((null (seventh x)) nil)
+ ((and (consp (seventh x)) (eq 'mnot (caar (seventh x))))
+ `($while ,(cadr (seventh x))))
+ (t `($unless ,(seventh x))))
+ `($do ,(eighth x))))
+
+;;; Wrap nformat: only re-format if $display_format_internal is true and
+;;; the form has structure worth re-formatting. Used to preprocess a
+;;; form before sizing or printing it.
+(defmvar $display_format_internal nil
+ "Setting this TRUE can help give the user a greater understanding
+ of the behavior of maxima on certain of his problems,
+ especially those involving roots and quotients")
+
+(defun nformat-check (form)
+ (if (and $display_format_internal
+ (not (or (atom form) (atom (car form)) (specrepp form))))
+ form
+ (nformat form)))
+
+;;; Convert ATOM to a list of characters suitable for printing.
+;;; Handles numbers, strings (with optional surrounding quotes),
+;;; symbols (stripping leading $ or %, mapping aliases, etc.).
+(defun makestring (atom)
+ (let (dummy)
+ (cond ((numberp atom) (exploden atom))
+ ((stringp atom)
+ (setq dummy (coerce atom 'list))
+ (if $stringdisp
+ (cons #\" (nconc dummy (list #\")))
+ dummy))
+ ((not (symbolp atom)) (exploden atom))
+ ((and (setq dummy (get atom 'reversealias))
+ (not (and (member atom $aliases :test #'eq) (get atom 'noun))))
+ (exploden (stripdollar dummy)))
+ ((not (eq (getop atom) atom))
+ (makestring (getop atom)))
+ (t (setq dummy (exploden atom))
+ (cond
+ ((null dummy) nil)
+ ((char= #\$ (car dummy)) (cdr dummy))
+ ((char= #\% (car dummy)) (cdr dummy))
+ ($lispdisp (cons #\? dummy))
+ (t dummy))))))
+
(defun mgrind (x out)
(setq chrps 0)
(mprint (msize x nil nil 'mparen 'mparen) out))
-----------------------------------------------------------------------
Summary of changes:
src/displa.lisp | 33 ----------------------
src/grind.lisp | 35 +----------------------
src/maxima.system | 12 ++++----
src/mgrind.lisp | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 91 insertions(+), 72 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 01:51:30
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via e1299a8ffad18a827344aad03415626f54f9d52d (commit)
from 743ea60215d27b59a733214043b748d9f230de3c (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit e1299a8ffad18a827344aad03415626f54f9d52d
Author: Raymond Toy <toy...@gm...>
Date: Sat Apr 25 18:50:27 2026 -0700
Last commit was incomplete. No bigfloat::while.
Remove remnants of previous incorrect attempts.
diff --git a/src/hypergeometric.lisp b/src/hypergeometric.lisp
index 7534d2b1c..49e090f58 100644
--- a/src/hypergeometric.lisp
+++ b/src/hypergeometric.lisp
@@ -331,7 +331,7 @@ ff(a,b,c,x,n) := block([f, f0 : 1, f1 : 1- 2 * b / c,s : 1,k : 1, cf : a / (1-2/
(eps (epsilon x)) (done 0))
(setq b (- c (* 2 b)))
(setq z (- 1 (/ 2 x)))
- (while (< done 3)
+ (maxima::while (< done 3)
(setq ds (* cf f1))
(setq s (+ s ds))
(setq done (if (< (abs ds) (* eps (max 1 (abs s)))) (+ done 1) 0))
@@ -374,7 +374,7 @@ ff(a,b,c,x,n) := block([f, f0 : 1, f1 : 1- 2 * b / c,s : 1,k : 1, cf : a / (1-2/
(setq er 1)
(setq f 1)
- (while (> (abs er) (* eps (max (abs f) 1)))
+ (maxima::while (> (abs er) (* eps (max (abs f) 1)))
(maxima::bind-fpprec local-fpprec
(setq mma (maxima::nfloat ma `((maxima::mlist)) local-fpprec maxima::$max_fpprec))
(setq mmb (maxima::nfloat mb `((maxima::mlist)) local-fpprec maxima::$max_fpprec))
@@ -418,7 +418,7 @@ ff(a,b,c,x,n) := block([f, f0 : 1, f1 : 1- 2 * b / c,s : 1,k : 1, cf : a / (1-2/
(format t "d = ~A~%" d)
(format t "region = ~A~%" region))
(setq f nil)
- (while d
+ (maxima::while d
(setq f (if (equal region "none")
`((maxima::multiple_values) ,ff t)
(maxima::mfuncall 'maxima::$abramowitz_id ff region)))
@@ -449,7 +449,7 @@ ff(a,b,c,x,n) := block([f, f0 : 1, f1 : 1- 2 * b / c,s : 1,k : 1, cf : a / (1-2/
(let ((s 0) (s0 1) (k 0) (z 1) (es 0) (ez 1) (n) (p) (q) (stop 20000) (dig))
(setq n (* 2 (+ (length a) (length b) 1)))
- (while (and (< k stop) (/= s s0)) ;; (not (= s s0)))
+ (maxima::while (and (< k stop) (/= s s0)) ;; (not (= s s0)))
(setq s s0)
(setq p (reduce #'* (mapcar #'(lambda (s) (+ s k)) a))) ;; p adds and p-1 multiplications
(setq q (reduce #'* (mapcar #'(lambda (s) (+ s k)) b))) ;; q adds and q-1 multiplications
@@ -480,7 +480,7 @@ ff(a,b,c,x,n) := block([f, f0 : 1, f1 : 1- 2 * b / c,s : 1,k : 1, cf : a / (1-2/
(defun hypergeometric-poly-case (a b x)
(let ((z 1) (s 1) (k 0) (p) (q))
- (while (not (zerop z))
+ (maxima::while (not (zerop z))
(setq p (reduce #'* (mapcar #'(lambda (s) (+ s k)) a)))
(setq q (reduce #'* (mapcar #'(lambda (s) (+ s k)) b)))
(incf k)
@@ -546,7 +546,7 @@ ff(a,b,c,x,n) := block([f, f0 : 1, f1 : 1- 2 * b / c,s : 1,k : 1, cf : a / (1-2/
;; recurse on local-fpprec; bailout when local-fpprec exceeds $max_fpprec.
- (while (and (or (null f) (< d digits)) (< local-fpprec maxima::$max_fpprec))
+ (maxima::while (and (or (null f) (< d digits)) (< local-fpprec maxima::$max_fpprec))
(maxima::bind-fpprec local-fpprec
(multiple-value-setq (f d) (hypergeometric-by-series a b x))
(setq a (mapcar #'(lambda (s) (bigfloat::to (maxima::$bfloat s))) ma))
@@ -582,7 +582,7 @@ ff(a,b,c,x,n) := block([f, f0 : 1, f1 : 1- 2 * b / c,s : 1,k : 1, cf : a / (1-2/
((eql a -1) (values fm1 0))
(t
(setq x (- x b))
- (while (>= k a)
+ (maxima::while (>= k a)
(setq f (/ (- (* k fo) (* (+ (* 2 k) x) fm1)) (- b k)))
(setq ef
(+
diff --git a/src/maxima.system b/src/maxima.system
index b6589f820..df33d81d7 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -785,7 +785,6 @@
:depends-on ("compatibility-macros1" "declarations" "defmfun" "errset" "globals"
"miscellaneous" "other-macros" "prerequisites" "utility-macros"
"m2-pattern-matcher"
- "numeric-bigfloat"
"variable-predicates")
:components
((:file "hyp")
diff --git a/src/nfloat.lisp b/src/nfloat.lisp
index f98637f2a..c895559ab 100644
--- a/src/nfloat.lisp
+++ b/src/nfloat.lisp
@@ -127,7 +127,7 @@
(acc 0) (err 0) (x) (q))
(cond ((and (integerp lo) (integerp hi))
- (while (<= lo hi)
+ (maxima::while (<= lo hi)
(setq q (maxima::$sublis `((maxima::mlist) ((maxima::mequal) ,v ,lo)) sumand))
(setq q (maxima::simplify q))
(setq x (running-error-eval q subs bits))
@@ -145,7 +145,7 @@
(acc 1) (err 0) (x))
(cond ((and (integerp lo) (integerp hi))
- (while (<= lo hi)
+ (maxima::while (<= lo hi)
(setq x (maxima::$sublis `((maxima::mlist) ((maxima::mequal) ,v ,lo)) prodand))
(setq x (maxima::simplify x))
(setq x (running-error-eval x subs bits))
@@ -339,7 +339,7 @@
(setq e (nformat e))
(setq eps (expt 10.0 (- digits)))
(setq eps (/ eps (- 1 eps)))
- (while (and (or (null (first z)) (bigfloat::not-done (second z) (first z) eps machine-epsilon))
+ (maxima::while (and (or (null (first z)) (bigfloat::not-done (second z) (first z) eps machine-epsilon))
(< digits max-digits))
(bind-fpprec digits
(setq z (bigfloat::running-error-eval e subs fpprec))
diff --git a/src/numeric.lisp b/src/numeric.lisp
index c9460960d..b6f27507e 100644
--- a/src/numeric.lisp
+++ b/src/numeric.lisp
@@ -15,14 +15,6 @@
(in-package #:bigfloat)
-;; A while-loop macro for bigfloat-package code. Mirrors maxima::while
-;; but lives in the bigfloat package so callers don't need to qualify
-;; the symbol or worry about importing across packages.
-(defmacro while (cond &rest body)
- `(do ()
- ((not ,cond))
- ,@body))
-
(defun intofp (re)
;; Kind of like Maxima's INTOFP, but we only handle numeric types.
;; We should return a Maxima bigfloat object (list of bigfloat
-----------------------------------------------------------------------
Summary of changes:
src/hypergeometric.lisp | 14 +++++++-------
src/maxima.system | 1 -
src/nfloat.lisp | 6 +++---
src/numeric.lisp | 8 --------
4 files changed, 10 insertions(+), 19 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-26 01:23:44
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via 743ea60215d27b59a733214043b748d9f230de3c (commit)
via 73c36c9a0ffcc022256fe1aeca4942a521627539 (commit)
via 9033050868ec90151a9fa444c6244035bd89644b (commit)
from 41b7dfa26a34c7444afad1be9b6bb99b01146c06 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 743ea60215d27b59a733214043b748d9f230de3c
Author: Raymond Toy <toy...@gm...>
Date: Sat Apr 25 17:38:39 2026 -0700
Don't define a bigfloat:while
There's no real reason to have a separate `while` macro in the
bigfloat package for hypergeometric.lisp and nfloat.lisp. Just use
the maxima version by qualifying the symbol as needed.
A minor cleanup noted when looking at the dependencies.
diff --git a/src/hypergeometric.lisp b/src/hypergeometric.lisp
index 5e180c18e..7534d2b1c 100644
--- a/src/hypergeometric.lisp
+++ b/src/hypergeometric.lisp
@@ -301,13 +301,6 @@
(in-package #:bigfloat)
-;(import 'maxima::while) ;; <--- broken Why?
-
-(defmacro while (cond &rest body)
- `(do ()
- ((not ,cond))
- ,@body))
-
(defun 0f0-numeric (x)
(exp x))
diff --git a/src/maxima.system b/src/maxima.system
index df33d81d7..b6589f820 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -785,6 +785,7 @@
:depends-on ("compatibility-macros1" "declarations" "defmfun" "errset" "globals"
"miscellaneous" "other-macros" "prerequisites" "utility-macros"
"m2-pattern-matcher"
+ "numeric-bigfloat"
"variable-predicates")
:components
((:file "hyp")
diff --git a/src/nfloat.lisp b/src/nfloat.lisp
index bb084c1b0..f98637f2a 100644
--- a/src/nfloat.lisp
+++ b/src/nfloat.lisp
@@ -127,7 +127,7 @@
(acc 0) (err 0) (x) (q))
(cond ((and (integerp lo) (integerp hi))
- (maxima::while (<= lo hi)
+ (while (<= lo hi)
(setq q (maxima::$sublis `((maxima::mlist) ((maxima::mequal) ,v ,lo)) sumand))
(setq q (maxima::simplify q))
(setq x (running-error-eval q subs bits))
@@ -145,7 +145,7 @@
(acc 1) (err 0) (x))
(cond ((and (integerp lo) (integerp hi))
- (maxima::while (<= lo hi)
+ (while (<= lo hi)
(setq x (maxima::$sublis `((maxima::mlist) ((maxima::mequal) ,v ,lo)) prodand))
(setq x (maxima::simplify x))
(setq x (running-error-eval x subs bits))
diff --git a/src/numeric.lisp b/src/numeric.lisp
index b6f27507e..c9460960d 100644
--- a/src/numeric.lisp
+++ b/src/numeric.lisp
@@ -15,6 +15,14 @@
(in-package #:bigfloat)
+;; A while-loop macro for bigfloat-package code. Mirrors maxima::while
+;; but lives in the bigfloat package so callers don't need to qualify
+;; the symbol or worry about importing across packages.
+(defmacro while (cond &rest body)
+ `(do ()
+ ((not ,cond))
+ ,@body))
+
(defun intofp (re)
;; Kind of like Maxima's INTOFP, but we only handle numeric types.
;; We should return a Maxima bigfloat object (list of bigfloat
commit 73c36c9a0ffcc022256fe1aeca4942a521627539
Author: Raymond Toy <toy...@gm...>
Date: Sat Apr 25 17:05:27 2026 -0700
Update :depends-on for files in modules
We forgot to update the :depends-on for files in modules that have a
clean DAG. Add them now for the ones we know are clean DAGs.
diff --git a/src/maxima.system b/src/maxima.system
index b44239728..df33d81d7 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -762,8 +762,9 @@
(:module documentation :source-pathname ""
:depends-on ("globals" "defmfun" "fundamental-macros")
:components
- ((:file "macdes")
- (:file "verify-html-index")))
+ ((:file "verify-html-index")
+ (:file "macdes"
+ :depends-on ("verify-html-index"))))
(:module algebraic-database :source-pathname ""
:depends-on ("globals" "defmfun" "compatibility-macros1" "declarations"
"evaluator" "fundamental-macros" "other-macros"
@@ -884,6 +885,8 @@
"errset" "fundamental-macros"
"other-macros" "prerequisites"
"utilities" "utility-macros")
+ ;; These 2 files are coupled. Hard to separate out
+ ;; without moving lots and lots of things around.
:components ((:file "tlimit")
(:file "limit")))
(:module solve :source-pathname ""
@@ -947,7 +950,8 @@
"prerequisites")
:components
((:file "pois2")
- (:file "pois3")))
+ (:file "pois3"
+ :depends-on ("pois2"))))
(:module translated-packages :source-pathname ""
:depends-on ("globals" "maxima-language-compiler-macros"
"compatibility-macros1"
commit 9033050868ec90151a9fa444c6244035bd89644b
Author: Raymond Toy <toy...@gm...>
Date: Sat Apr 25 16:43:19 2026 -0700
Fix up dependencies for numerical-utilities module
diff --git a/src/maxima.system b/src/maxima.system
index 5f97f6a65..b44239728 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -288,6 +288,7 @@
(:module other-macros :source-pathname ""
:depends-on ("defmfun" "compatibility-macros1" "declarations"
"prerequisites" "utility-macros")
+ ;; These files appear to be independent of each other.
:components
((:file "mrgmac")
(:file "rzmac")
@@ -712,8 +713,12 @@
(:file "trprop")
(:file "mdefun")))
(:module numerical-utilities :source-pathname ""
- :components
- ((:file "numerical-utils")))
+ :depends-on ("simp-utilities" ; for add/mul/sub
+ "globals" ; $numer, errorsw
+ "utilities" ; merror
+ )
+ :components
+ ((:file "numerical-utils")))
(:module bessel-functions :source-pathname ""
:depends-on ("globals" "defmfun" "trigonometry" "algebraic-database"
"utility-macros" "reader"
-----------------------------------------------------------------------
Summary of changes:
src/hypergeometric.lisp | 7 -------
src/maxima.system | 20 +++++++++++++++-----
src/nfloat.lisp | 4 ++--
src/numeric.lisp | 8 ++++++++
4 files changed, 25 insertions(+), 14 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: kjak <kj...@us...> - 2026-04-25 18:28:59
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, master has been updated
via 1395beb5692e9c9f816bc45d068b56101f7cdeae (commit)
from f908ba9d3b72030a1c4505eef03289c6fa8ef3b8 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 1395beb5692e9c9f816bc45d068b56101f7cdeae
Author: Kris Katterjohn <kat...@gm...>
Date: Sat Apr 25 14:27:22 2026 -0400
Docs: add union as a nary function handled specially by xreduce
See also commit d4ea7212.
diff --git a/doc/info/Lists.texi b/doc/info/Lists.texi
index c5158b17b..54325d43b 100644
--- a/doc/info/Lists.texi
+++ b/doc/info/Lists.texi
@@ -2523,7 +2523,7 @@ The argument @var{s} is a list.
Functions known to be n-ary include
addition @code{+}, multiplication @code{*}, @code{and}, @code{or}, @code{max},
-@code{min}, and @code{append}.
+@code{min}, @code{append}, and @code{union}.
Functions may also be declared n-ary by @code{declare(@var{F}, nary)}.
For these functions,
@code{xreduce} is expected to be faster than either @code{rreduce} or @code{lreduce}.
-----------------------------------------------------------------------
Summary of changes:
doc/info/Lists.texi | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
hooks/post-receive
--
Maxima CAS
|
|
From: dauti <da...@us...> - 2026-04-25 08:10:38
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, master has been updated
via f908ba9d3b72030a1c4505eef03289c6fa8ef3b8 (commit)
from 8a9a99a7285e7766c30a5ac207ede5fca5e770e6 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit f908ba9d3b72030a1c4505eef03289c6fa8ef3b8
Author: Wolfgang Dautermann <da...@us...>
Date: Sat Apr 25 10:07:30 2026 +0200
Windows lispselector: Allow ECL as default Lisp (if enabled).
Also (theoretically) allow using it on non windows (mainly for
testing purposes), the enabled Lisp versions would need to be set manually,
if CMake is not used to set it (which only occurs in the crosscompiled
windows installer...)
Use the descriptions from the project web sites as description.
diff --git a/crosscompile-windows/lispselector.tcl b/crosscompile-windows/lispselector.tcl
index 5d05510ee..88659c5da 100644
--- a/crosscompile-windows/lispselector.tcl
+++ b/crosscompile-windows/lispselector.tcl
@@ -1,16 +1,25 @@
#!/usr/bin/wish
# SPDX-License-Identifier: GPL-2.0-or-later
-# Simple GUI for selecting the default Lisp for Windows users.
+# Simple GUI for selecting the default Lisp for Maxima.
-# @lispXY_ENABLED@ will be replaced by 0 or 1 in the final program.
+# @lispXY_ENABLED@ will be replaced by 0 or 1 in the final program.
set clisp @CLISP_ENABLED@
set sbcl @SBCL_ENABLED@
set abcl @ABCL_ENABLED@
set ccl @CCL_ENABLED@
+set ecl @ECL_ENABLED@
-proc selectclisp {} {
+# Allow use it on Unix too (if the variables above are set...)
+if {$tcl_platform(platform) eq "windows"} {
set maximarc [file join $::env(USERPROFILE) maxima maximarc]
- file mkdir [file dirname $maximarc]
+} else {
+ set maximarc [file join $::env(HOME) .maxima maximarc]
+}
+
+file mkdir [file dirname $maximarc]
+
+proc selectclisp {} {
+ global maximarc
set f [open $maximarc "w"]
puts $f "MAXIMA_LISP=clisp"
close $f
@@ -18,8 +27,7 @@ proc selectclisp {} {
}
proc selectsbcl {} {
- set maximarc [file join $::env(USERPROFILE) maxima maximarc]
- file mkdir [file dirname $maximarc]
+ global maximarc
set f [open $maximarc "w"]
puts $f "MAXIMA_LISP=sbcl"
close $f
@@ -27,8 +35,7 @@ proc selectsbcl {} {
}
proc selectabcl {} {
- set maximarc [file join $::env(USERPROFILE) maxima maximarc]
- file mkdir [file dirname $maximarc]
+ global maximarc
set f [open $maximarc "w"]
puts $f "MAXIMA_LISP=abcl"
close $f
@@ -36,14 +43,21 @@ proc selectabcl {} {
}
proc selectccl {} {
- set maximarc [file join $::env(USERPROFILE) maxima maximarc]
- file mkdir [file dirname $maximarc]
+ global maximarc
set f [open $maximarc "w"]
puts $f "MAXIMA_LISP=ccl64"
close $f
tk_messageBox -type ok -message "CCL was selected as default Lisp interpreter for Maxima." -icon info
}
+proc selectecl {} {
+ global maximarc
+ set f [open $maximarc "w"]
+ puts $f "MAXIMA_LISP=ecl"
+ close $f
+ tk_messageBox -type ok -message "ECL was selected as default Lisp interpreter for Maxima." -icon info
+}
+
set binpath [file dirname [file normalize [info script]]]
set documentation "One can use different LISP (the programming language, in which Maxima is (mostly) written) compilers for running Maxima.
@@ -55,44 +69,56 @@ if {$clisp == 1} { append documentation "- CLISP (https://www.clisp.org)\n" }
if {$sbcl == 1} { append documentation "- SBCL (https://www.sbcl.org)\n" }
if {$abcl == 1} { append documentation "- ABCL (https://www.abcl.org)\n" }
if {$ccl == 1} { append documentation "- CCL (https://ccl.clozure.com)\n" }
+if {$ecl == 1} { append documentation "- ECL (https://ecl.common-lisp.dev)\n" }
-append documentation "
-Which Lisp you select, may depend on your needs:
+append documentation "\n"
-SBCL is usually faster, but there were issues with DEP (data execution prevention) reported.
-It might be necessary to disable DEP for $binpath/sbcl.exe.
-Due to memory problems, some packages (e.g. Lapack) may not work.
+if {$sbcl == 1} { append documentation "Steel Bank Common Lisp (SBCL) is a high performance Common Lisp compiler.
+It is open source / free software, with a permissive license. In addition to the compiler and runtime system
+for ANSI Common Lisp, it provides an interactive environment including a debugger, a statistical profiler,
+a code coverage tool, and many other extensions.
-CLISP may be slower, but these problems do not occur there. In command line Maxima CLISP
-provides advanced editing features (a history of previous commands is accessible with the cursor keys).
+" }
-"
+if {$clisp == 1} { append documentation "GNU CLISP is a Common Lisp implementation.
+It conforms to the ANSI Common Lisp standard, and offers many extensions.
+It runs on all desktop operating systems (GNU and Unix systems, macOS,
+Windows) and is particularly memory-efficient.
-if {$abcl == 1} { append documentation "Armed Bear Common Lisp (ABCL) is a full implementation of the Common Lisp language running in the JVM.
+" }
+
+if {$abcl == 1} { append documentation "Armed Bear Common Lisp (ABCL) is a full implementation of the Common Lisp language running in the JVM.
Java must be installed, if you use ABCL.
" }
-if {$ccl == 1} { append documentation "Clozure Common Lisp (CCL) is a free Common Lisp implementation with a long history. CCL support is new in the crosscompiled Windows installer.
+if {$ccl == 1} { append documentation "Clozure Common Lisp (CCL) is a free Common Lisp implementation with a long history.
+
+" }
+
+if {$ecl == 1} { append documentation "Embeddable Common-Lisp (ECL) aims to produce an implementation of the Common-Lisp language which complies
+to the ANSI X3J13 definition of the language.
" }
-append documentation "If you select a Lisp, a configuration file 'maximarc' will be created
-in the 'maxima' directory of your user profile directory with your default Lisp selection.
+append documentation "If you select a Lisp, a configuration file '$maximarc' will be created
+with your default Lisp selection.
If the configuration file already exists, it will be overwritten.
"
-# Buttons (clisp, sbcl, exit)
+# Buttons (enabled Lisp versions, exit)
frame .toolbar
if {$clisp == 1} { button .toolbar.clisp -text "Select CLISP" -command "selectclisp" }
if {$sbcl == 1} { button .toolbar.sbcl -text "Select SBCL" -command "selectsbcl" }
if {$abcl == 1} { button .toolbar.abcl -text "Select ABCL" -command "selectabcl" }
if {$ccl == 1} { button .toolbar.ccl -text "Select CCL" -command "selectccl" }
+if {$ecl == 1} { button .toolbar.ecl -text "Select ECL" -command "selectecl" }
button .toolbar.exit -text "Exit" -command "exit"
if {$clisp == 1} { pack .toolbar.clisp -side left }
if {$sbcl == 1} { pack .toolbar.sbcl -side left }
if {$abcl == 1} { pack .toolbar.abcl -side left }
if {$ccl == 1} { pack .toolbar.ccl -side left }
+if {$ecl == 1} { pack .toolbar.ecl -side left }
pack .toolbar.exit -side right
# Documentation area
-----------------------------------------------------------------------
Summary of changes:
crosscompile-windows/lispselector.tcl | 72 ++++++++++++++++++++++++-----------
1 file changed, 49 insertions(+), 23 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-24 23:39:32
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via 41b7dfa26a34c7444afad1be9b6bb99b01146c06 (commit)
via 318e8b592a04090ec0e03c29766ab2ebd155970f (commit)
from c10d4b24de7a5794396a6b3100637f03d0f68788 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 41b7dfa26a34c7444afad1be9b6bb99b01146c06
Author: Raymond Toy <toy...@gm...>
Date: Fri Apr 24 16:37:41 2026 -0700
Reorder functions so that they're defined before use.
Claude says:
* Section 1 — Numeric type predicates (leaves of the dependency graph).
* float-or-rational-p — newly moved in
* bigfloat-or-number-p — newly moved in
* complex-number-p — structural shape predicate
* integer-representation-p — standalone
* Section 2 — Lisp-to-Maxima conversion.
* complexify — independent of everything in this file
* Section 3 — Rectform arithmetic helpers.
* cmul, cdiv, cpower — independent
* Section 4 — Numerical-evaluation tests (consumers of sections 1–2).
* float-numerical-eval-p — uses float-or-rational-p
* complex-float-numerical-eval-p — uses complex-number-p, add, mul
* bigfloat-numerical-eval-p — uses bigfloat-or-number-p
* complex-bigfloat-numerical-eval-p — uses complex-number-p, add, mul
* numerical-eval-p — uses all four above
* Section 5 — Error signaling.
* simp-domain-error — independent
diff --git a/src/numerical-utils.lisp b/src/numerical-utils.lisp
index 7b43b4feb..759e31dd9 100644
--- a/src/numerical-utils.lisp
+++ b/src/numerical-utils.lisp
@@ -23,6 +23,65 @@
;;; 2. One of the args is a float or a bigfloat. Evaluate numerically.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun float-or-rational-p (x)
+ (or (floatp x) ($ratnump x)))
+
+(defun bigfloat-or-number-p (x)
+ (or ($bfloatp x) (numberp x) ($ratnump x)))
+
+;; Is argument u a complex number with real and imagpart satisfying predicate ntypep?
+(defun complex-number-p (u &optional (ntypep 'numberp))
+ (let ((R 0) (I 0))
+ (labels ((a1 (x) (cadr x))
+ (a2 (x) (caddr x))
+ (a3+ (x) (cdddr x))
+ (N (x) (funcall ntypep x)) ; N
+ (i (x) (and (eq x '$%i) (N 1))) ; %i
+ (N+i (x) (and (null (a3+ x)) ; mplus test is precondition
+ (N (setq R (a1 x)))
+ (or (and (i (a2 x)) (setq I 1) t)
+ (and (mtimesp (a2 x)) (N*i (a2 x))))))
+ (N*i (x) (and (null (a3+ x)) ; mtimes test is precondition
+ (N (setq I (a1 x)))
+ (eq (a2 x) '$%i))))
+ (declare (inline a1 a2 a3+ N i N+i N*i))
+ (cond ((N u) (values t u 0)) ;2.3
+ ((atom u) (if (i u) (values t 0 1))) ;%i
+ ((mplusp u) (if (N+i u) (values t R I))) ;N+%i, N+N*%i
+ ((mtimesp u) (if (N*i u) (values t R I))) ;N*%i
+ (t nil)))))
+
+;;; Check for an integer or a float or bigfloat representation. When we
+;;; have a float or bigfloat representation return the integer value.
+
+(defun integer-representation-p (x)
+ (let ((val nil))
+ (cond ((integerp x) x)
+ ((and (floatp x) (= 0 (nth-value 1 (truncate x))))
+ (nth-value 0 (truncate x)))
+ ((and ($bfloatp x)
+ (eq ($sign (sub (setq val ($truncate x)) x)) '$zero))
+ val)
+ (t nil))))
+
+(defun complexify (x)
+ ;; Convert a Lisp number to a maxima number
+ (cond ((realp x) x)
+ ((complexp x) (add (realpart x) (mul '$%i (imagpart x))))
+ (t (merror (intl:gettext "COMPLEXIFY: argument must be a Lisp real or complex number.~%COMPLEXIFY: found: ~:M") x))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Helper functions for Bigfloat numerical evaluation.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun cmul (x y) ($rectform (mul x y)))
+
+(defun cdiv (x y) ($rectform (div x y)))
+
+(defun cpower (x y) ($rectform (power x y)))
+
;;; Test for numerically evaluation in float precision
(defun float-numerical-eval-p (&rest args)
@@ -97,65 +156,6 @@
(apply 'bigfloat-numerical-eval-p args)
(apply 'complex-bigfloat-numerical-eval-p args)))
-;;; Check for an integer or a float or bigfloat representation. When we
-;;; have a float or bigfloat representation return the integer value.
-
-(defun integer-representation-p (x)
- (let ((val nil))
- (cond ((integerp x) x)
- ((and (floatp x) (= 0 (nth-value 1 (truncate x))))
- (nth-value 0 (truncate x)))
- ((and ($bfloatp x)
- (eq ($sign (sub (setq val ($truncate x)) x)) '$zero))
- val)
- (t nil))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Helper functions for Bigfloat numerical evaluation.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun cmul (x y) ($rectform (mul x y)))
-
-(defun cdiv (x y) ($rectform (div x y)))
-
-(defun cpower (x y) ($rectform (power x y)))
-
-(defun complexify (x)
- ;; Convert a Lisp number to a maxima number
- (cond ((realp x) x)
- ((complexp x) (add (realpart x) (mul '$%i (imagpart x))))
- (t (merror (intl:gettext "COMPLEXIFY: argument must be a Lisp real or complex number.~%COMPLEXIFY: found: ~:M") x))))
-
-;; Is argument u a complex number with real and imagpart satisfying predicate ntypep?
-(defun complex-number-p (u &optional (ntypep 'numberp))
- (let ((R 0) (I 0))
- (labels ((a1 (x) (cadr x))
- (a2 (x) (caddr x))
- (a3+ (x) (cdddr x))
- (N (x) (funcall ntypep x)) ; N
- (i (x) (and (eq x '$%i) (N 1))) ; %i
- (N+i (x) (and (null (a3+ x)) ; mplus test is precondition
- (N (setq R (a1 x)))
- (or (and (i (a2 x)) (setq I 1) t)
- (and (mtimesp (a2 x)) (N*i (a2 x))))))
- (N*i (x) (and (null (a3+ x)) ; mtimes test is precondition
- (N (setq I (a1 x)))
- (eq (a2 x) '$%i))))
- (declare (inline a1 a2 a3+ N i N+i N*i))
- (cond ((N u) (values t u 0)) ;2.3
- ((atom u) (if (i u) (values t 0 1))) ;%i
- ((mplusp u) (if (N+i u) (values t R I))) ;N+%i, N+N*%i
- ((mtimesp u) (if (N*i u) (values t R I))) ;N*%i
- (t nil)))))
-
-(defun float-or-rational-p (x)
- (or (floatp x) ($ratnump x)))
-
-(defun bigfloat-or-number-p (x)
- (or ($bfloatp x) (numberp x) ($ratnump x)))
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Utilitye function to signal an error denoting a domain error for
commit 318e8b592a04090ec0e03c29766ab2ebd155970f
Author: Raymond Toy <toy...@gm...>
Date: Fri Apr 24 16:30:05 2026 -0700
Move float-or-rational-p/bigfloat-or-number-p to numerical-utils
These were in trigi, but seems more natural in numerical-utils.lisp.
Plus, this breaks one circular dependency between trigi and
numerical-utils.lisp because numerical-utils.lisp used these
functions.
diff --git a/src/maxima.system b/src/maxima.system
index c5058ac88..5f97f6a65 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -731,10 +731,9 @@
:components
((:file "ellipt")))
(:module numerical-functions :source-pathname ""
- :depends-on ("globals" "defmfun" "trigonometry" "algebraic-database"
+ :depends-on ("globals" "defmfun" "algebraic-database"
"utility-macros" "reader"
- "fundamental-macros" "other-macros" "prerequisites"
- "numerical-utilities")
+ "fundamental-macros" "other-macros" "prerequisites")
:components
((:file "intpol")))
(:module display :source-pathname ""
diff --git a/src/numerical-utils.lisp b/src/numerical-utils.lisp
index 98a7a74e3..7b43b4feb 100644
--- a/src/numerical-utils.lisp
+++ b/src/numerical-utils.lisp
@@ -150,6 +150,12 @@
((mtimesp u) (if (N*i u) (values t R I))) ;N*%i
(t nil)))))
+(defun float-or-rational-p (x)
+ (or (floatp x) ($ratnump x)))
+
+(defun bigfloat-or-number-p (x)
+ (or ($bfloatp x) (numberp x) ($ratnump x)))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Utilitye function to signal an error denoting a domain error for
diff --git a/src/trigi.lisp b/src/trigi.lisp
index 588b77b38..7e335fa7e 100644
--- a/src/trigi.lisp
+++ b/src/trigi.lisp
@@ -386,12 +386,6 @@
(if ($taylorp x)
(mfuncall '$apply '$taylor `((mlist) ((,op) ,($ratdisrep x)) ,@(cdr ($taylorinfo x)))) nil))
-(defun float-or-rational-p (x)
- (or (floatp x) ($ratnump x)))
-
-(defun bigfloat-or-number-p (x)
- (or ($bfloatp x) (numberp x) ($ratnump x)))
-
;; When z is a Maxima complex float or when 'numer' is true and z is a
;; Maxima complex number, evaluate (op z) by applying the mapping from
;; the Maxima operator 'op' to the operator in the hash table
-----------------------------------------------------------------------
Summary of changes:
src/maxima.system | 5 +--
src/numerical-utils.lisp | 112 +++++++++++++++++++++++++----------------------
src/trigi.lisp | 6 ---
3 files changed, 61 insertions(+), 62 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-24 23:16:33
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via c10d4b24de7a5794396a6b3100637f03d0f68788 (commit)
from d0701a957e157541fbe4f91bef3864766366066e (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit c10d4b24de7a5794396a6b3100637f03d0f68788
Author: Raymond Toy <toy...@gm...>
Date: Fri Apr 24 16:14:44 2026 -0700
New modules for bessel/airy/ellipt
Since we've determined the files are independent, lets move bessel and
airy into the new module bessel-functions. ellipt is in the new
module elliptic-functions. plasma is moved to gamma-expint since
plasma is related to erf, but it doesn't actually use erf from
gamma.lisp.
Then numerical-functions module only has intpol which is a numerical
function.
diff --git a/src/maxima.system b/src/maxima.system
index 029c87f69..c5058ac88 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -714,7 +714,7 @@
(:module numerical-utilities :source-pathname ""
:components
((:file "numerical-utils")))
- (:module numerical-functions :source-pathname ""
+ (:module bessel-functions :source-pathname ""
:depends-on ("globals" "defmfun" "trigonometry" "algebraic-database"
"utility-macros" "reader"
"fundamental-macros" "other-macros" "prerequisites"
@@ -722,10 +722,21 @@
;; These files are mutually independent.
:components
((:file "bessel")
- (:file "ellipt")
- (:file "airy")
- (:file "plasma")
- (:file "intpol")))
+ (:file "airy")))
+ (:module elliptic-functions :source-pathname ""
+ :depends-on ("globals" "defmfun" "trigonometry" "algebraic-database"
+ "utility-macros" "reader"
+ "fundamental-macros" "other-macros" "prerequisites"
+ "numerical-utilities")
+ :components
+ ((:file "ellipt")))
+ (:module numerical-functions :source-pathname ""
+ :depends-on ("globals" "defmfun" "trigonometry" "algebraic-database"
+ "utility-macros" "reader"
+ "fundamental-macros" "other-macros" "prerequisites"
+ "numerical-utilities")
+ :components
+ ((:file "intpol")))
(:module display :source-pathname ""
:depends-on ("globals" "defmfun" "compatibility-macros1" "declarations"
"fundamental-macros" "prerequisites"
@@ -894,7 +905,8 @@
:depends-on ("numerical-utilities" "m2-pattern-matcher")
:components
((:file "expintegral")
- (:file "gamma")))
+ (:file "gamma")
+ (:file "plasma")))
(:module miscellaneous :source-pathname ""
:depends-on ("globals" "defmfun" "compatibility-macros1"
"reader" "utility-macros" "commands"
-----------------------------------------------------------------------
Summary of changes:
src/maxima.system | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-24 23:10:55
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via d0701a957e157541fbe4f91bef3864766366066e (commit)
from b8498170b991939e9026a0f60a6b0abaccf79791 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit d0701a957e157541fbe4f91bef3864766366066e
Author: Raymond Toy <toy...@gm...>
Date: Fri Apr 24 16:06:53 2026 -0700
Remove dependency of airy to ellipt.
The only function needed by other files in the numerical-functions
module (that is a bad name!) was the function complex-number-p. Move
that to numerical-util.lisp. Then all the files are completely
independent of each other.
It would probably make sense to groupl bessel and airy into its own
module. ellipt can be another as well. plasma is related to erf, so
it should go with gamma, but it doesn't seem to all any erf functions.
intpol can stay. It really is a numerical function.
diff --git a/src/ellipt.lisp b/src/ellipt.lisp
index 49fc18c59..7127b592c 100644
--- a/src/ellipt.lisp
+++ b/src/ellipt.lisp
@@ -862,34 +862,6 @@
;;
-;; Is argument u a complex number with real and imagpart satisfying predicate ntypep?
-(defun complex-number-p (u &optional (ntypep 'numberp))
- (let ((R 0) (I 0))
- (labels ((a1 (x) (cadr x))
- (a2 (x) (caddr x))
- (a3+ (x) (cdddr x))
- (N (x) (funcall ntypep x)) ; N
- (i (x) (and (eq x '$%i) (N 1))) ; %i
- (N+i (x) (and (null (a3+ x)) ; mplus test is precondition
- (N (setq R (a1 x)))
- (or (and (i (a2 x)) (setq I 1) t)
- (and (mtimesp (a2 x)) (N*i (a2 x))))))
- (N*i (x) (and (null (a3+ x)) ; mtimes test is precondition
- (N (setq I (a1 x)))
- (eq (a2 x) '$%i))))
- (declare (inline a1 a2 a3+ N i N+i N*i))
- (cond ((N u) (values t u 0)) ;2.3
- ((atom u) (if (i u) (values t 0 1))) ;%i
- ((mplusp u) (if (N+i u) (values t R I))) ;N+%i, N+N*%i
- ((mtimesp u) (if (N*i u) (values t R I))) ;N*%i
- (t nil)))))
-
-(defun complexify (x)
- ;; Convert a Lisp number to a maxima number
- (cond ((realp x) x)
- ((complexp x) (add (realpart x) (mul '$%i (imagpart x))))
- (t (merror (intl:gettext "COMPLEXIFY: argument must be a Lisp real or complex number.~%COMPLEXIFY: found: ~:M") x))))
-
(defun kc-arg (exp m)
;; Replace elliptic_kc(m) in the expression with sym. Check to see
;; if the resulting expression is linear in sym and the constant
diff --git a/src/maxima.system b/src/maxima.system
index 3541ae7fa..029c87f69 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -719,11 +719,11 @@
"utility-macros" "reader"
"fundamental-macros" "other-macros" "prerequisites"
"numerical-utilities")
+ ;; These files are mutually independent.
:components
((:file "bessel")
(:file "ellipt")
- (:file "airy"
- :depends-on ("ellipt"))
+ (:file "airy")
(:file "plasma")
(:file "intpol")))
(:module display :source-pathname ""
diff --git a/src/numerical-utils.lisp b/src/numerical-utils.lisp
index d01983607..98a7a74e3 100644
--- a/src/numerical-utils.lisp
+++ b/src/numerical-utils.lisp
@@ -122,6 +122,34 @@
(defun cpower (x y) ($rectform (power x y)))
+(defun complexify (x)
+ ;; Convert a Lisp number to a maxima number
+ (cond ((realp x) x)
+ ((complexp x) (add (realpart x) (mul '$%i (imagpart x))))
+ (t (merror (intl:gettext "COMPLEXIFY: argument must be a Lisp real or complex number.~%COMPLEXIFY: found: ~:M") x))))
+
+;; Is argument u a complex number with real and imagpart satisfying predicate ntypep?
+(defun complex-number-p (u &optional (ntypep 'numberp))
+ (let ((R 0) (I 0))
+ (labels ((a1 (x) (cadr x))
+ (a2 (x) (caddr x))
+ (a3+ (x) (cdddr x))
+ (N (x) (funcall ntypep x)) ; N
+ (i (x) (and (eq x '$%i) (N 1))) ; %i
+ (N+i (x) (and (null (a3+ x)) ; mplus test is precondition
+ (N (setq R (a1 x)))
+ (or (and (i (a2 x)) (setq I 1) t)
+ (and (mtimesp (a2 x)) (N*i (a2 x))))))
+ (N*i (x) (and (null (a3+ x)) ; mtimes test is precondition
+ (N (setq I (a1 x)))
+ (eq (a2 x) '$%i))))
+ (declare (inline a1 a2 a3+ N i N+i N*i))
+ (cond ((N u) (values t u 0)) ;2.3
+ ((atom u) (if (i u) (values t 0 1))) ;%i
+ ((mplusp u) (if (N+i u) (values t R I))) ;N+%i, N+N*%i
+ ((mtimesp u) (if (N*i u) (values t R I))) ;N*%i
+ (t nil)))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Utilitye function to signal an error denoting a domain error for
-----------------------------------------------------------------------
Summary of changes:
src/ellipt.lisp | 28 ----------------------------
src/maxima.system | 4 ++--
src/numerical-utils.lisp | 28 ++++++++++++++++++++++++++++
3 files changed, 30 insertions(+), 30 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-24 20:44:03
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via b8498170b991939e9026a0f60a6b0abaccf79791 (commit)
from 978ecdbac88d6fc17c461b2978fccc2e7583a6b5 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit b8498170b991939e9026a0f60a6b0abaccf79791
Author: Raymond Toy <toy...@gm...>
Date: Fri Apr 24 13:43:17 2026 -0700
Update file header info
Use the new header style proposed by Stavros on the mailing list, Apr
24, 2024.
diff --git a/src/basic-util.lisp b/src/basic-util.lisp
index f39685542..7576f2e54 100644
--- a/src/basic-util.lisp
+++ b/src/basic-util.lisp
@@ -1,10 +1,12 @@
;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
;;;
-;;; This file is part of the Maxima computer algebra system
-;;; (https://sourceforge.net/projects/maxima/)
+;;; This file is part of the Maxima computer algebra project
+;;; (https://sourceforge.net/projects/maxima/)
+;;; SPDX-License-Identifier: GPL-2.0-or-later
;;;
;;; Maxima is copyrighted by its authors and licensed under the GNU
-;;; General Public License. See COPYING and AUTHORS for details.
+;;; General Public License. This program is distributed WITHOUT ANY
+;;; WARRANTY. See COPYING and AUTHORS for details.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(in-package :maxima)
diff --git a/src/mgrind.lisp b/src/mgrind.lisp
index d43908656..15d1a3059 100644
--- a/src/mgrind.lisp
+++ b/src/mgrind.lisp
@@ -1,10 +1,12 @@
;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
;;;
-;;; This file is part of the Maxima computer algebra system
-;;; (https://sourceforge.net/projects/maxima/)
+;;; This file is part of the Maxima computer algebra project
+;;; (https://sourceforge.net/projects/maxima/)
+;;; SPDX-License-Identifier: GPL-2.0-or-later
;;;
;;; Maxima is copyrighted by its authors and licensed under the GNU
-;;; General Public License. See COPYING and AUTHORS for details.
+;;; General Public License. This program is distributed WITHOUT ANY
+;;; WARRANTY. See COPYING and AUTHORS for details.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(in-package :maxima)
diff --git a/src/mutils-fn.lisp b/src/mutils-fn.lisp
index 6a5712f93..483fa9858 100644
--- a/src/mutils-fn.lisp
+++ b/src/mutils-fn.lisp
@@ -1,10 +1,12 @@
;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
;;;
-;;; This file is part of the Maxima computer algebra system
-;;; (https://sourceforge.net/projects/maxima/)
+;;; This file is part of the Maxima computer algebra project
+;;; (https://sourceforge.net/projects/maxima/)
+;;; SPDX-License-Identifier: GPL-2.0-or-later
;;;
;;; Maxima is copyrighted by its authors and licensed under the GNU
-;;; General Public License. See COPYING and AUTHORS for details.
+;;; General Public License. This program is distributed WITHOUT ANY
+;;; WARRANTY. See COPYING and AUTHORS for details.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(in-package :maxima)
diff --git a/src/opr-util.lisp b/src/opr-util.lisp
index 66f82b7da..eab99b369 100644
--- a/src/opr-util.lisp
+++ b/src/opr-util.lisp
@@ -1,10 +1,12 @@
;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
;;;
-;;; This file is part of the Maxima computer algebra system
-;;; (https://sourceforge.net/projects/maxima/)
+;;; This file is part of the Maxima computer algebra project
+;;; (https://sourceforge.net/projects/maxima/)
+;;; SPDX-License-Identifier: GPL-2.0-or-later
;;;
;;; Maxima is copyrighted by its authors and licensed under the GNU
-;;; General Public License. See COPYING and AUTHORS for details.
+;;; General Public License. This program is distributed WITHOUT ANY
+;;; WARRANTY. See COPYING and AUTHORS for details.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(in-package :maxima)
diff --git a/src/simp-fn.lisp b/src/simp-fn.lisp
index 0e099e5e8..b257c8e79 100644
--- a/src/simp-fn.lisp
+++ b/src/simp-fn.lisp
@@ -1,10 +1,12 @@
;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
;;;
-;;; This file is part of the Maxima computer algebra system
-;;; (https://sourceforge.net/projects/maxima/)
+;;; This file is part of the Maxima computer algebra project
+;;; (https://sourceforge.net/projects/maxima/)
+;;; SPDX-License-Identifier: GPL-2.0-or-later
;;;
;;; Maxima is copyrighted by its authors and licensed under the GNU
-;;; General Public License. See COPYING and AUTHORS for details.
+;;; General Public License. This program is distributed WITHOUT ANY
+;;; WARRANTY. See COPYING and AUTHORS for details.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(in-package :maxima)
-----------------------------------------------------------------------
Summary of changes:
src/basic-util.lisp | 8 +++++---
src/mgrind.lisp | 8 +++++---
src/mutils-fn.lisp | 8 +++++---
src/opr-util.lisp | 8 +++++---
src/simp-fn.lisp | 8 +++++---
5 files changed, 25 insertions(+), 15 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-24 20:39:38
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via 978ecdbac88d6fc17c461b2978fccc2e7583a6b5 (commit)
from 6b355aa746de09f649378c78680d156cf52e8f52 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 978ecdbac88d6fc17c461b2978fccc2e7583a6b5
Author: Raymond Toy <toy...@gm...>
Date: Fri Apr 24 13:36:01 2026 -0700
Fix up dependencies in definite-integration
We used xref data to determine the dependencies of all the functions
between the files. With this data there are no circular dependencies
between the files and residu and hypgeo are basically independent
files that other files depend on. That's nice.
A rough summary:
* Independent Service Providers:
* hypgeo - Special function integration (229 functions)
* residu - Complex analysis & residue calculations (22 functions)
* Dependent Modules:
* laplac (32 functions) depends on:
* defint for general definite integration fallback
* hypgeo for special function integration fallback
* defint (161 functions) depends on:
* residu for complex analysis methods (contour integration, pole
analysis)
diff --git a/src/maxima.system b/src/maxima.system
index b4d08689e..3541ae7fa 100644
--- a/src/maxima.system
+++ b/src/maxima.system
@@ -806,11 +806,17 @@
"hypergeometric"
"m2-pattern-matcher"
"variable-predicates")
- :components
- ((:file "defint")
- (:file "residu")
- (:file "laplac")
- (:file "hypgeo")))
+ ;; An analysis using xref data shows that these files have
+ ;; no circular dependencies. residu.lisp and hypeo.lisp
+ ;; are independent of the other files, and the
+ ;; dependencies listed below are correct.
+ :components
+ ((:file "residu")
+ (:file "defint"
+ :depends-on ("residu"))
+ (:file "hypgeo")
+ (:file "laplac"
+ :depends-on ("defint" "hypgeo"))))
(:module trigonometry :source-pathname ""
:depends-on ("globals" "defmfun"
"compatibility-macros" "declarations"
-----------------------------------------------------------------------
Summary of changes:
src/maxima.system | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
hooks/post-receive
--
Maxima CAS
|
|
From: vttoth <vt...@us...> - 2026-04-24 20:08:16
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, master has been updated
via 8a9a99a7285e7766c30a5ac207ede5fca5e770e6 (commit)
from 8455cf8d814fdea76848ef748ee34f0dbdd80846 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 8a9a99a7285e7766c30a5ac207ede5fca5e770e6
Author: Viktor T. Toth <vt...@vt...>
Date: Fri Apr 24 16:08:03 2026 -0400
Prevent simplification mangling indices in itensor/tentex
diff --git a/share/tensor/tentex.lisp b/share/tensor/tentex.lisp
index 3b074111a..6f5b1506a 100644
--- a/share/tensor/tentex.lisp
+++ b/share/tensor/tentex.lisp
@@ -59,7 +59,12 @@
(defprop $levi_civita "\\varepsilon" texword)
(defprop %levi_civita "\\varepsilon" texword)
-(defun $tentex (x) (meval (list '$tex (tenreform x))))
+;(defun $tentex (x) (meval (list '$tex (tenreform x))))
+; Turn off simplification to avoid meval mangling indices
+(defun $tentex (x)
+(let (($simp $simp))
+ (setq $simp nil)
+ (meval (list '$tex (tenreform x)))))
(defun tenreform (x)
(cond
-----------------------------------------------------------------------
Summary of changes:
share/tensor/tentex.lisp | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
hooks/post-receive
--
Maxima CAS
|
|
From: rtoy <rt...@us...> - 2026-04-24 14:54:54
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Maxima CAS".
The branch, rtoy-break-dependency-cycles-2 has been updated
via 6b355aa746de09f649378c78680d156cf52e8f52 (commit)
from b0ff042bf7d0c2ef3ba5e0a469677915ef718d67 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 6b355aa746de09f649378c78680d156cf52e8f52
Author: Raymond Toy <toy...@gm...>
Date: Fri Apr 24 07:53:23 2026 -0700
Reorder moved functions
Since we moved these functions from mmacro, let's reorder them so that
they're defined before use. This also means we should just put them
all at the end since mmacro-apply calls mapply1.
diff --git a/src/mlisp.lisp b/src/mlisp.lisp
index 875c0472b..6c19b110b 100644
--- a/src/mlisp.lisp
+++ b/src/mlisp.lisp
@@ -58,93 +58,6 @@ or if apply is being used are printed.")
"Holds the value to which a variable is about to be set when a
'setcheckbreak' occurs.")
-(defun displace (x y)
- (setf (car x) (car y))
- (setf (cdr x) (cdr y))
- x)
-
-;;; EVALUATING A MACRO CALL ;;;
-
-
-(defun mmacro-apply (defn form)
- (mmacroexpansion-check form
- (if (and (atom defn)
- (not (symbolp defn)))
- ;; added this clause for NIL. MAPPLY
- ;; doesn't really handle applying interpreter
- ;; closures and subrs very well.
- (apply defn (cdr form))
- (mapply1 defn (cdr form) (caar form) form))))
-
-;;; MACROEXPANSION HACKERY ;;;
-
-
-;; does any reformatting necessary according to the current setting of
-;; $MACROEXPANSION. Note that it always returns the expansion returned
-;; by displace, for future displacing.
-
-(defun mmacroexpansion-check (form expansion)
- (case $macroexpansion
- (( () )
- (cond ((eq (caar form) 'mmacroexpanded)
- (mmacro-displace form expansion))
- (t expansion)))
- (($expand)
- (cond ((not (eq (caar form) 'mmacroexpanded))
- (displace form `((mmacroexpanded)
- ,expansion
- ,(copy1cons form)))))
- expansion)
- (($displace)
- (mmacro-displace form expansion))
- (t (mtell (intl:gettext "warning: unrecognized value of 'macroexpansion'.")))))
-
-
-(defun mmacro-displace (form expansion)
- (displace form (cond ((atom expansion) `((mprogn) ,expansion))
- (t expansion))))
-
-
-;; Handles memo-ized forms. Reformats them if $MACROEXPANSION has changed.
-;; Format is ((MMACROEXPANDED) <expansion> <original form>)
-
-(defmspec mmacroexpanded (form)
- (meval (mmacroexpansion-check form (cadr form))))
-
-;; Expands the top-level form repeatedly until it is no longer a macro
-;; form. Has to copy the form each time because if macros are displacing
-;; the form given to mmacroexpand1 will get bashed each time. Recursion
-;; is used instead of iteration so the user gets a pdl overflow error
-;; if he tries to expand recursive macro definitions that never terminate.
-
-(defun mmacroexpand (form)
- (let ((test-form (if (atom form) form (copy1cons form)))
- (expansion (mmacroexpand1 form)))
- (cond ((equal expansion test-form)
- expansion)
- (t (mmacroexpand expansion)))))
-
-
-;; only expands the form once. If the form is not a valid macro
-;; form it just gets returned (eq'ness is preserved). Note that if the
-;; macros are displacing, the returned form is also eq to the given
-;; form (which has been bashed).
-
-(defun mmacroexpand1 (form)
- (let ((funname) (macro-defn))
- (cond ((or (atom form)
- (atom (car form))
- (member 'array (cdar form) :test #'eq)
- (not (symbolp (setq funname (mop form)))))
- form)
- ((eq funname 'mmacroexpanded)
- (mmacroexpansion-check form (cadr form)))
- ((setq macro-defn
- (or (and $transrun
- (get (caar form) 'translated-mmacro))
- (mget (caar form) 'mmacro)))
- (mmacro-apply macro-defn form))
- (t form))))
(defun mapply1 (fn args fnname form)
(cond ((atom fn)
@@ -2534,3 +2447,91 @@ wrapper for this."
(:compile-toplevel :execute)
(setq *read-base* *old-read-base*))
+
+(defun displace (x y)
+ (setf (car x) (car y))
+ (setf (cdr x) (cdr y))
+ x)
+
+(defun mmacro-displace (form expansion)
+ (displace form (cond ((atom expansion) `((mprogn) ,expansion))
+ (t expansion))))
+
+
+;;; MACROEXPANSION HACKERY ;;;
+
+
+;; does any reformatting necessary according to the current setting of
+;; $MACROEXPANSION. Note that it always returns the expansion returned
+;; by displace, for future displacing.
+
+(defun mmacroexpansion-check (form expansion)
+ (case $macroexpansion
+ (( () )
+ (cond ((eq (caar form) 'mmacroexpanded)
+ (mmacro-displace form expansion))
+ (t expansion)))
+ (($expand)
+ (cond ((not (eq (caar form) 'mmacroexpanded))
+ (displace form `((mmacroexpanded)
+ ,expansion
+ ,(copy1cons form)))))
+ expansion)
+ (($displace)
+ (mmacro-displace form expansion))
+ (t (mtell (intl:gettext "warning: unrecognized value of 'macroexpansion'.")))))
+
+
+;;; EVALUATING A MACRO CALL ;;;
+
+
+(defun mmacro-apply (defn form)
+ (mmacroexpansion-check form
+ (if (and (atom defn)
+ (not (symbolp defn)))
+ ;; added this clause for NIL. MAPPLY
+ ;; doesn't really handle applying interpreter
+ ;; closures and subrs very well.
+ (apply defn (cdr form))
+ (mapply1 defn (cdr form) (caar form) form))))
+
+;; only expands the form once. If the form is not a valid macro
+;; form it just gets returned (eq'ness is preserved). Note that if the
+;; macros are displacing, the returned form is also eq to the given
+;; form (which has been bashed).
+
+(defun mmacroexpand1 (form)
+ (let ((funname) (macro-defn))
+ (cond ((or (atom form)
+ (atom (car form))
+ (member 'array (cdar form) :test #'eq)
+ (not (symbolp (setq funname (mop form)))))
+ form)
+ ((eq funname 'mmacroexpanded)
+ (mmacroexpansion-check form (cadr form)))
+ ((setq macro-defn
+ (or (and $transrun
+ (get (caar form) 'translated-mmacro))
+ (mget (caar form) 'mmacro)))
+ (mmacro-apply macro-defn form))
+ (t form))))
+
+;; Expands the top-level form repeatedly until it is no longer a macro
+;; form. Has to copy the form each time because if macros are displacing
+;; the form given to mmacroexpand1 will get bashed each time. Recursion
+;; is used instead of iteration so the user gets a pdl overflow error
+;; if he tries to expand recursive macro definitions that never terminate.
+
+(defun mmacroexpand (form)
+ (let ((test-form (if (atom form) form (copy1cons form)))
+ (expansion (mmacroexpand1 form)))
+ (cond ((equal expansion test-form)
+ expansion)
+ (t (mmacroexpand expansion)))))
+
+;; Handles memo-ized forms. Reformats them if $MACROEXPANSION has changed.
+;; Format is ((MMACROEXPANDED) <expansion> <original form>)
+
+(defmspec mmacroexpanded (form)
+ (meval (mmacroexpansion-check form (cadr form))))
+
-----------------------------------------------------------------------
Summary of changes:
src/mlisp.lisp | 175 +++++++++++++++++++++++++++++----------------------------
1 file changed, 88 insertions(+), 87 deletions(-)
hooks/post-receive
--
Maxima CAS
|