Maxima:如何在自定义输出显示时保留给用户的提示信息(例如 asksign())?

Maxima: How to preserve prompt message to user (e.g. asksign()) when customizing output display?

我正在开发 Maxima 的接口(来自 R),它通过初始化文件更改启动时 maxima 的输出显示:

load("mactex-utilities")$
load("alt-display.mac")$
set_prompt('prefix, "prompt;>>")$
set_prompt('suffix, "<<prompt;")$
my_display(x):=(?princ("out;>>"), ?princ("(%o"), ?princ(linenum), ?princ(") "), tex(?caddr(x)), ?princ("<<out;"))$
set_alt_display(2, my_display)$

现在我正在尝试处理 Maxima 提示用户声明关于变量的假设的情况,如本例所示:

(%i1) L: sqrt(1 - 1/(R^2));
                                          1
(%o1)                            sqrt(1 - --)
                                           2
                                          R
(%i2) integrate(x, x, 0, L);
Is R positive or negative?

positive;
                                     2
                                    R  - 1
(%o2)                               ------
                                        2
                                     2 R
(%i3) 

因此默认显示屏会显示提示消息“R 是正数还是负数?”。但是,当我使用上面的初始化文件时,不会打印此消息。但是,控制台等待用户输入。所以我的问题是,如果有办法,我可以将它包含在我的自定义输出中。最好,我认为也应该可以将它包装在 pre-/suffix 字符串中,以便我的界面正确捕获它,但我不太精通 maxima 内部结构。

仅作记录,我的界面的 repo 是 https://www.github.com/rcst/rmaxima

此主题已在 maxima 邮件列表 (here) 上得到解决

本质上这似乎是 alt-display.lisp 代码中的错误

感谢 Leo Butler,这是初始化脚本的重写版本,此外还自定义了用户提示消息以规避问题。

(load("mactex-utilities"), load("alt-display.mac"));
(set_prompt('prefix, "prompt;>>",'suffix, "<<prompt;"),
my_display(x):=block([type], type:?caar(x),
if type=?mtext then printf(true,"~%TEXT;>>~%~a~%<<TEXT;~%",?cadr(x))
else if type=?mlabel then printf(true,"~%out;>>~%(~a) ~a~a~a~%<<out;~%",?cadr(x),"$$",tex1(?caddr(x)),"$$")
else block([alt_display1d:false, alt_display2d:false], displa(x))),
set_alt_display(2,my_display)) $

当使用它来初始化最大值时,上面例子的输出是

prompt;>>(%i1) <<prompt;L: sqrt(1 - 1/(R^2));

out;>>
(%o1) $$\sqrt{1-\frac{1}{R^2}}$$
<<out;
prompt;>>(%i2) <<prompt;integrate(x, x, 0, L);
prompt;>>
TEXT;>>Is R positive or negative?<<TEXT;
<<prompt;
p;

out;>>
(%o2) $$\frac{R^2-1}{2\,R^2}$$
<<out;
prompt;>>(%i3) <<prompt;