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