|
From: Stavros M. <mac...@al...> - 2020-07-07 07:02:51
|
I think you want
block ( [ n:3 ], ... )
not sublis.
On Tue, Jul 7, 2020, 02:32 Eli Damon <pu...@el...> wrote:
> Hi, Robert. Thanks. I feel stupid now. Maybe it's because I was writing
> R code recently, where you have "quoting functions".
>
> Anyway, I was just using print to demonstrate. The function I was
> actually using was makelist. I was trying to do something like
>
> sublis([ n = a.bunch.of.stuff ], makelist(
> a.bunch.of.stuff.with.an.n.in.it, i, 0, n-1 ));
>
> and I was getting an error because n-1 didn't evaluate to a number. I
> suppose I could use a temporary variable or a utility function, but this
> seemed like the tidiest way to do it.
>
> Eli
>
> On 7/7/20 12:53 AM, Robert Dodier wrote:
>
> > On Mon, Jul 6, 2020 at 8:43 PM Eli Damon <pu...@el...> wrote:
> >
> >> (%i1) sublis([n=3],print("f(n)","=",f(n)));
> >> f(n) = f(n)
> >> (%o1) f(3)
> > Eli, it turns out this is exactly the behavior one should expect.
> > sublist is an ordinary function, i.e. one which evaluates its
> > arguments. So print("f(n)","=",f(n)) is evaluated, and it evaluates to
> > f(n), and has the side effect of printing "f(n) = f(n)". Now sublis is
> > called with arguments [n = 3] and f(n), so it returns f(3), which you
> > see as %o1.
> >
> > I guess that you want to print an expression without evaluating it and
> > also print it evaluated. The built-in functions display and ldisplay
> > are a little bit like that, but not exactly. Here is an attempt to do
> > just that.
> >
> > mydisplay (e, [vv]) ::= buildq ([e, e1: sublis (vv, e)], print ('e =
> > 'e1));
> >
> > It's a little delicate to get just the right amount of evaluation ...
> > note that mydisplay is a macro, defined by ::= , which is a function
> > which quotes its arguments, and its return value is evaluated by the
> > caller. Note also the presence of single quotes in print('e = 'e1),
> > that prevents e and e1 from being evaluated by the caller. Here's what
> > I get for the above input.
> >
> > (%i35) mydisplay (f(n), n = 3);
> > f(n) = f(3)
> > (%o35) f(n) = f(3)
> >
> > mydisplay collects any arguments aside from e and puts them all in the
> > list vv.
> >
> > (%i36) mydisplay (g(m, n), n = a, m = 2*a);
> > g(m, n) = g(2 a, a)
> > (%o36) g(m, n) = g(2 a, a)
> >
> > I don't know whether mydisplay should print e = e1 or just return it.
> > I guess which one is more useful depends on what you need to do. Maybe
> > you can say more about what your goal is.
> >
> > There are probably other variations which are useful in some context.
> > E.g. f(n) = f(3) = 1234 or whatever depending on the definition of f.
> >
> > Hope this helps,
> >
> > Robert Dodier
>
>
> _______________________________________________
> Maxima-discuss mailing list
> Max...@li...
> https://lists.sourceforge.net/lists/listinfo/maxima-discuss
>
|