MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

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

> 




  • Prev by Date: Re: 64-bit problems with Mac version
  • Next by Date: Re: Manipulate
  • Previous by thread: Writing a HoldAll function that evaluates its arguments
  • Next by thread: Re: Writing a HoldAll function that evaluates its arguments