Нежелательная оценка в заданиях в Mathematica: почему это происходит и как отлаживать это во время загрузки пакета?

Я разработка (большого) пакета, который больше не загружается должным образом. Это произошло после того, как я изменил одну строку кода. Когда я пытаюсь загрузить пакет (с запросами), пакет начинает загружаться а затем одно из отложенных определений «оживает» (т.е.Каким-то образом оценивается), попадает в ловушку процедуры перехвата ошибок, загруженной несколькими строками раньше, и загрузка пакета прерывается.
Подпрограмма перехвата ошибок с прерыванием выполняет свою работу, за исключением того, что она не должна была вызываться в первую очередь на этапе загрузки пакета. Сообщение об ошибке показывает, что неправильный Аргумент на самом деле является выражением шаблона, которое я использую в левой части определения setdelayed несколькими строками позже.

Примерно так:

……Some code lines

Changed line of code 

g[x_?NotGoodQ]:=(Message[g::nogood, x];Abort[])

……..some other code lines

g/: cccQ[g[x0_]]:=True

Когда я пытаюсь загрузить пакет, я получаю:

g::nogood: Argument x0_ is not good

Как вы видите, переданный аргумент является шаблоном и может быть получен только из строки кода выше.

Я попытался найти причину такого поведения, но пока мне это не удалось. Поэтому я решил использовать мощные инструменты отладки Workbench.

Я хотел бы увидеть шаг за шагом (или с точками останова), что происходит, когда я загружаю пакет. Я еще не слишком хорошо знаком с WB, но кажется, что, используя Debug как…, пакет сначала загружается, а затем в конечном итоге отлаживается с помощью точек останова и т. д. Моя проблема в том, что пакет даже не загружается полностью! И любая точка останова, установленная перед загрузкой пакета, не кажется эффективной.

Итак… 2 вопроса:

  1. Кто-нибудь, пожалуйста, объясните, почему эти строки кода «оживают» во время загрузки пакета? (насколько я могу судить, в пакете не осталось явных синтаксических ошибок или фрагментов кода)
  2. Кто-нибудь может объяснить, как (если) можно проверить / отладить код пакета при загрузке в WB ?

Спасибо за любую помощь.

Править

В свете ответа Леонида и использования его примера EvenQ: Мы можем избежать использования Holdpattern , просто определив повышающие значения для g ПЕРЕД понижением для g

notGoodQ[x_] := EvenQ[x];
Clear[g];
g /: cccQ[g[x0_]] := True
g[x_?notGoodQ] := (Message[g::nogood, x]; Abort[])

Теперь

?g

Global`g

cccQ[g[x0_]]^:=True



g[x_?notGoodQ]:=(Message[g::nogood,x];Abort[])



In[6]:= cccQ[g[1]]

Out[6]= True

while

In[7]:= cccQ[g[2]]

During evaluation of In[7]:= g::nogood: -- Message text not found -- (2)

Out[7]= $Aborted

Итак ... общее правило:

При написании функции g сначала определите повышающие значения для g, затем определите понижающие значения для g, в противном случае используйте Holdpattern

Можете ли вы подписаться на это правило?

Леонид говорит, что использование Holdpattern может указывать на улучшение дизайна. Помимо решения, указанного выше, как можно улучшить дизайн небольшого кода, приведенного выше, или, лучше, в целом при работе с повышающими значениями?

Спасибо за вашу помощь

10
задан magma 15 September 2011 в 16:13
поделиться