access to $display from Lisp REPL?



Am Samstag, den 23.07.2011, 11:06 -0700 schrieb Edwin Woollett:
> On July 22, 2011, Dieter Kaiser wrote:
> 
> **************************
> The macro defmspec defines a special form of a Maxima function. One
> possibility to use the function is to call Maximas evaluator directly:
> .......
> MAXIMA> (setq $form "This is my string")
> 
> "This is my string"
> 
> MAXIMA> (meval '(($display) $form))
> 
> form = "This is my string"
> 
> $DONE
> **************************
> Thanks for the suggestion. My actual goal is to  create a
> debug printout of selected local lisp variables 
> ( and perhaps global Maxima level parameters?)
> inside a lisp function, and have, for each variable or parameter,
> the screen output  ' name = current-value',  as the maxima function
> display does at the Maxima level. So instead of creating such
> a lisp function from scratch, perhaps using displa, I thought
> of trying to somehow use $display from the lisp level.
> 
> Your method produces a lisp error (shown below)
> if used with a lisp parameter bound to a lisp list.
> 
> Also, I try to define  a function with one argument which
> uses your approach, but the attempt fails so far, even
> when used with the lisp string variable.
> 
> --------
> Maxima 5.24.0
> using Lisp GNU Common Lisp (GCL) GCL 2.6.8 (a.k.a. GCL)
> 
> (%i1) display2d:false$
> (%i2) a1 : aa1;
> (%o2) aa1
> (%i3) a2 : 10;
> (%o3) 10
> (%i4) to_lisp();
> Type (to-maxima) to restart, ($quit) to quit Maxima.
> 
> MAXIMA> (setq s1 "My string")
> 
> "My string"
> MAXIMA> (setq l1 '(1 2 3))
> 
> (1 2 3)
> MAXIMA> (meval '(($display) $a1))
> 
> a1 = aa1
> 
> $DONE
> MAXIMA> (meval '(($display) $a2))
> 
> a2 = 10
> 
> $DONE
> MAXIMA> (meval '(($display) s1))
> 
> ?s1 = "My string"
> 
> $DONE
> MAXIMA> (meval '(($display) l1))
> 
> Maxima encountered a Lisp error:
> 
>  Error in EVAL [or a callee]: Caught fatal error [memory may be damaged]
> 
> Automatically continuing.
> To reenable the Lisp debugger set *debugger-hook* to nil.
> 
> MAXIMA> s1
> 
> "My string"
> MAXIMA> (defun ldisplay1 (arg) (meval '(($display) arg)))
> LDISPLAY1
> MAXIMA> (ldisplay1 s1)
> ?arg = ?arg
> 
> $DONE
> 
> -----------------------------------
> 
> so clearly this function def doesn't work. 
> Can I finetune this approach to work, or
> is their an easier way, or is there a lisp
> analog to display2d which will do what I need
> for quick debugging looks at current variable values
> inside a lisp function. (I don't want to use
> the debugger).

At first, you have to ensure that only valid Maxima expressions are
passed to the function $display. The Lisp list '(1 2 3) is not a Maxima
expressions, but '((mlist) 1 2 3), e.g.

MAXIMA> (setq s1 '((mlist) 1 2 2))

((MLIST) 1 2 2)
MAXIMA> (meval '(($display) s1))
                                s1 = [1, 2, 2]

$DONE

Second, the syntax of your function ldisplay1 is not correct. The
argument of the function has to be spliced into a valid Maxima form,
e.g.

MAXIMA> (defun ldisplay1 (arg) (meval `(($display) ,arg)))
LDISPLAY1

With this definition your get for your example.

MAXIMA> (setq s1 "My string")
"My string"

MAXIMA> (ldisplay1 's1)
s1 = My string
$DONE
MAXIMA> 

It is important to quote the argument to the function ldisplay1, because
ldisplay1 is a Lisp function and evaluates its argument.

There might be more simple and more easy approaches. I will have a look
at your problem.

Dieter Kaiser