|
From: Eli D. <pu...@el...> - 2020-07-07 19:54:47
|
That's exactly what I want. Thank you. Eli On 7/7/20 3:02 AM, Stavros Macrakis wrote: > 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 >> |