Como esconder a saída de depuração no Mathematica?

2

Eu quero ocultar todas as saídas criadas pelo comando Imprimir da função do usuário definida em module .m .

Mais precisamente, o problema é o seguinte:

Eu tenho um módulo que resolve alguma tarefa específica (não é necessário conhecer a tarefa para entender a questão). Eu uso o comando Imprimir dentro do módulo para o processo de saída de avaliação. É útil para depuração, mas não para uso (toda saída interna deve estar oculta quando o usuário chamar uma função declarada no módulo).

Então, em toda versão estável do módulo eu tenho que colocar comentários ( * * ) e deletá-los para o gebugging. Eu suponho que este caminho é incivilizado, e o Mathematica deveria ter uma maneira regular de esconder as saídas internas.

Por exemplo, temos 3 arquivos no mesmo diretório. Você pode me sugerir uma maneira simples de esconder todas as saídas por padrão e imprimir todas as saídas no modo de depuração?

modul.m :

f[x_]:=Module[{y}, y=Cos[x]*Sin[x];
Print["modul.m: y=",y];
Return[y]];

debugging.nb :

SetDirectory[NotebookDirectory[]];
<< modul.m;
x=10;
f[x] (* print all inner output generated while f is evaluating*)
x=20;
f[x](* print all inner output generated while f is evaluating*)

application.nb :

<< modul.m
y=f[10]+f[20];
(* Hide all outputs of f during evaluation. Command ; doesn't work for this issue. *) 
    
por Anonimous 10.01.2012 / 08:09

1 resposta

4

A resposta curta para isso é que um simples Print[] não é uma boa maneira de depurar um pacote grande. Não é possível desativá-lo (de uma maneira robusta) somente para o seu pacote, mas não em outros lugares (ele pode ser desativado globalmente, a maneira mais simples é Print; Unprotect[Print]; Print = Null & , mas isso irá irritar severamente seus usuários)

Para formas muito melhores de emitir mensagens de depuração e desativá-las, veja aqui:

link

Eu vou resumir Brett Champion e minhas próprias respostas, como pessoalmente (e subjetivamente) eu considero essas as melhores soluções, mas por favor leia o tópico completo lá.

Resposta de Brett Champion:

Use um símbolo personalizado para mensagens de depuração (assim como suas funções de pacote, você pode querer colocá-lo em um contexto separado para evitar colisões), assim:

...
debugPrint[expr]
...

Em seguida, defina uma função PrintDebug como esta:

Attributes[PrintDebug]={HoldAll}

PrintDebug[expr_] := Block[{debugPrint = Print}, expr]

Qualquer código envolto em PrintDebug imprimirá mensagens. Se não houver invólucro PrintDebug , a impressão de mensagens será desativada.

MyFunction[1,2,3] // PrintDebug

Como alternativa, você pode definir um valor para debugPrint globalmente para ativar a impressão de mensagens para tudo ou apenas $Pre = PrintDebug .

Minha resposta:

Também podemos usar a funcionalidade Message integrada para depuração:

debugPrint::msg = "Debug message: '1'";    
debugPrint[msg_] := Message[debugPrint::msg, msg]

Use a função assim:

debugPrint["hello"]

Desativar ou ativar mensagens como esta:

Off[debugPrint::msg]

On[debugPrint::msg]
    
por 10.01.2012 / 08:49