Re: Writing a HoldAll function that evaluates its arguments
- To: mathgroup at smc.vnet.net
- Subject: [mg86243] Re: Writing a HoldAll function that evaluates its arguments
- From: dh <dh at metrohm.ch>
- Date: Fri, 7 Mar 2008 02:23:59 -0500 (EST)
- References: <fqo8h1$sq9$1@smc.vnet.net>
Hi here is an simple example of a function that evaluates its arguments sequentially, stopping if some condition is met: SetAttributes[myAnd,HoldAll]; myAnd[x__]:=Module[{i,par=Hold[x]}, t=par[[1]]; Do[ If[!(t=And[t,par[[i]]]),t=False;Return[]]; ,{i,2,Length[{x}]}]; t ] myAnd[1==1,2==2,3==2,3==3] hope this helps, Daniel Szabolcs Horvát wrote: > What is the simplest and most elegant way of implementing a function > that has HoldAll, but it still evaluates each of its arguments exactly > once (and does not go into infinite evaluation)? > > I can come up with some ways (explicitly checking whether evaluation > changes the arguments), but neither of them are particularly elegant. > > The function should evaluate like this: > > Attributes[f] === {HoldAll} > f[] --> f[] > f[3] --> f[3] > f[1+2] --> f[3] > f[1,2] --> f[1,2] > f[0+1,1+1] --> f[1,2] > etc. > > > Let me explain my motivation for asking this seemingly absurd question > with an example: > > One built-in function that has this behaviour is And[]. This special > behaviour was needed to make And[] a "short-circuiting" function: it > evaluates the arguments one by one, and it returns False *immediately* > when one argument evaluates to False, without evaluating any further > arguments. > > Szabolcs >