2010-11-23 5 views
4

J'ai souvent besoin de déboguer en empêchant certaines définitions d'évaluer et de vérifier les résultats intermédiaires. J'accomplis cela en faisant initAll;clearAll[f,g,h]. Cela ne me plaît pas parce queNe pas évaluer certains modèles

  1. Il vous oblige à tout mettre dans un seul bloc init
  2. Il est pas assez souple pour ne garder que certains modèles comme f[1] non évalué

Au lieu de cela, je voudrais pour avoir une liste forbidden les modèles et ont un motif qui correspond à gauche non évalué. Comment puis-je atteindre cet objectif?

Modifier Jusqu'à présent, je trouve ce modèle le plus utile (c'est la réponse de Michael Pilat sauf HoldForm et BlankNullSequence)

eh[expr_, symbols : {___Symbol}] := Block[symbols, [email protected][expr]]

+0

initAll ...? <6 plus à faire> –

+0

ie, initAll: = (f [x _]: = x^2; p [x _]: = x^3) –

+0

Peut-être quelque chose comme l'évaluateur personnalisé de Leonid Shifrin https://groups.google.com /group/comp.soft-sys.math.mathematica/msg/5a8711111d4b8fee est ce que vous voulez? – Simon

Répondre

3

Block peut aider à ce que vous voulez:

f[x_] := x + 1; 
g[x_] := x - 1; 

In[13]:= Block[{f}, 
[email protected][(f[g[a]]^2)] 
] 

Out[13]= Hold[f[-1 + a]^2] 

Voulez-vous empêcher l'évaluation de certains modèles de valeur de base de f? (Par exemple, bloquer f[x_] mais autoriser f[x_, y_])?

MISE À JOUR

est ici une forme fonctionnelle:

SetAttributes[EvaluateHeld, HoldAll]; 
EvaluateHeld[expr_, symbols : {__Symbol}] := 
    Block[symbols, [email protected][expr] 
] 

In[7]:= EvaluateHeld[f[g[a]]^2, {f}] 

Out[7]= Hold[f[-1 + a]^2] 
+1

Les constructions de blocs sont magiques ... mais elles me font mal à la tête. Cette version 'Block [{f = Hold [f [#]] &}, f [g [a]]^2]' me fait un peu plus de sens. – Simon

+0

Michael, idéalement oui, mais pas si c'est plus difficile que de modifier manuellement la définition de f à chaque fois que je veux essayer de le garder non évalué pour un type particulier d'entrée –

+0

Est-il possible d'envelopper une fonction? IE, donc on pourrait faire 'evalHeld [(f [g [a]]^2), {f}]', et obtenir le résultat ci-dessus? –

Questions connexes