2010-11-23 6 views
4

일부 정의가 중간 결과를 평가하고 확인하지 못하도록하여 디버그해야하는 경우가 있습니다. 나는 initAll;clearAll[f,g,h]을 해 이것을 수행한다.특정 패턴을 평평하게 유지하지 않음

  1. 그것은 하나의 초기화 블록 그것은 단지 대신 내가 좋아하는 것 f[1] 평가되지 않은

같은 특정 패턴을 유지할 수있을만큼 유연 아니다

  • 에 모든 것을 넣어 당신을 강제 때문에 나는 그것을 좋아하지 않아 목록이 forbidden이고 왼쪽과 일치하지 않는 모든 패턴이 있습니다. 이것을 어떻게 할 수 있습니까?

    지금까지이 패턴을 발견 편집 (가 HoldForm 및 BlankNullSequence 제외 마이클 PILAT의 답변을의) 가장 유용한

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

  • +0

    INITALL ...이?

    +0

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

    +0

    아마도 Leonid Shifrin의 맞춤 평가 도구 https://groups.google.com과 같은 것일 수 있습니다. /group/comp.soft-sys.math.mathematica/msg/5a8711111d4b8fee가 원하는 것입니까? – Simon

    답변

    3

    Block 당신이 원하는 도움을 줄 수 :

    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] 
    

    f의 특정 다운 값 패턴에 대한 평가를 방지 하시겠습니까? (예 : f[x_] 블록을 허용하지만 f[x_, y_] 허용)?

    UPDATE

    다음은 함수 형태이다 :

    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

    블록 구조는 마술이지만 ... 그들은 내 머리를 아프게한다. 이 버전'Block [{f [#]] & f, [g [a]]^2]'는 나에게 조금 더 의미가 있습니다. – Simon

    +0

    Michael, 이상적으로 그렇습니다. 그러나 f의 정의를 수동으로 수정하는 것보다 어렵다면, 입력의 특정 종류에 대해 평가되지 않도록 유지하려고 할 때마다 –

    +0

    이것을 함수로 묶을 수 있습니까? IE, 그래서 evalHeld [(f [g [a]]^2), {f}]'를 수행하고 위의 결과를 얻을 수 있습니까? –