Je voudrais une fonction AnyTrue[expr,{i,{i1,i2,...}}]
qui vérifie si expr
est True
pour l'une des i1,i2...
Il devrait être comme si AnyTrue
a été Table
suivie [email protected]@%
, avec la différence qu'il ne évalue expr
jusqu'à trouver le premier True
.fonction personnalisée avec une évaluation non standard (se comporte comme le tableau)
La mise en court-circuit est optionnelle, ce que j'aimerais vraiment savoir, c'est la bonne façon d'émuler la séquence d'évaluation non-standard de Table
.
Mise à jour 11/14
Voici une solution en raison de Michael, vous pouvez l'utiliser à la chaîne "pour tous" et "il existe" contrôles
SetAttributes[AllTrue, HoldAll];
SetAttributes[AnyTrue, HoldAll];
AllTrue[{var_Symbol, lis_List}, expr_] :=
LengthWhile[lis,
TrueQ[ReleaseHold[Hold[expr] /. HoldPattern[var] -> #]] &] ==
Length[lis];
AnyTrue[{var_Symbol, lis_List}, expr_] :=
LengthWhile[lis,
Not[TrueQ[ReleaseHold[Hold[expr] /. HoldPattern[var] -> #]]] &] <
Length[lis];
AllTrue[{a, {1, 3, 5}}, AnyTrue[{b, {2, 4, 5}}, EvenQ[a + b]]]
AnyTrue[{a, {1, 3, 5}}, AllTrue[{b, {2, 4, 5}}, EvenQ[a + b]]]
yup, travaille perfe ct –
venant en retard, je voudrais juste souligner que les détails excessifs dans les modèles d'arguments ne vont pas souvent bien avec les attributs Hold. Par exemple, l'appel suivant échoue: AnyTrue [i <10, {i, Range [5]}], alors qu'en principe il ne devrait pas (le motif ne correspond pas car au moment de l'appariement de pattern il ne connait pas cette plage [ 5] est Liste). Cette signature légèrement plus générale va supprimer ce problème: AnyTrue [expr_, {var_Symbol, lis_}]. En outre, AnyTrue ne fonctionne pas dans M8 sur les listes emballées - il semble y avoir un bug dans LengthWhile: LengthWhile [Range [5],! TrueQ [# <10] &] donne 5, je vais le signaler. –
Oui, bon point Leonid. Il vaudrait mieux avoir un modèle plus général et valider l'argument après l'avoir évalué. 'HoldAll' au lieu de' HoldFirst' est nécessaire car nous voulons conserver 'var' en plus de' expr', sinon il n'y aurait pas de problème avec le motif le plus exigeant. –