记忆功能是记住他们发现的值的功能.如有必要,请在文档中心查看Mathematica中的一些背景知识.
假设您有以下定义
f[0] = f[1] = 1
f[x_] := f[x] = f[x - 1] + f[x - 2]
Run Code Online (Sandbox Code Playgroud)
在你的一个包中.用户可以加载包并立即开始询问f [1000].这将触发$ RecursionLimit :: reclim错误消息并中止.即使用户然后尝试更小的东西,说F [20],现在f的定义是腐败的结果并不好anymore.Of课程包开发者可能会增加递归限制和警告用户,但我的问题是:
如何改进f定义,以便如果用户要求f [1000]他/她得到答案没有任何问题?我感兴趣的是捕获用户输入,分析它并采取评估f [1000]所需的任何步骤的方法.
我可以很容易想象,如果输入超过255(然后将其恢复到原始级别),可以更改递归限制,但我真正希望看到的是,如果有找到f的方法输出有多少值"知道"(fknownvalues)并接受任何输入<= fknownvalues + $ RecursionLimit没有问题,或者如果输入更高则增加$ RecursionLimit.
谢谢您的帮助
我正在开发一个(大)包,不再正常加载.这发生在我更改了一行代码之后.当我尝试加载包(使用Needs)时,包开始加载,然后其中一个setdelayed定义"活跃起来"(即以某种方式进行评估),被困在错误捕获例程之前加载几行和包加载中止.
带有中止的错误捕获例程正在执行其工作,除了在包加载阶段不应该首先调用它.错误消息显示错误的参数实际上是一个模式表达式,我在setdelayed定义的lhs上使用了几行.
像这样的东西:
……Some code lines
Changed line of code
g[x_?NotGoodQ]:=(Message[g::nogood, x];Abort[])
……..some other code lines
g/: cccQ[g[x0_]]:=True
Run Code Online (Sandbox Code Playgroud)
当我尝试加载包时,我得到:
g::nogood: Argument x0_ is not good
Run Code Online (Sandbox Code Playgroud)
如您所见,传递的参数是一个模式,它只能来自上面的代码行.
我试图找到这种行为的原因,但到目前为止我还没有成功.所以我决定使用功能强大的Workbench调试工具.
我想逐步(或断点)看到加载包时会发生什么.我还不太熟悉WB,但似乎使用Debug as ...,首先加载包,然后最终使用断点调试,等等.我的问题是包装甚至没有完全加载!在加载包之前设置的任何断点似乎都没有效果.
所以... 2个问题:
感谢您的任何帮助.
编辑
根据列昂尼德的回答并使用他的EvenQ例子:我们可以避免使用Holdpattern简单地通过定义up值来获得g之前的下行值
notGoodQ[x_] := EvenQ[x];
Clear[g];
g /: cccQ[g[x0_]] := True
g[x_?notGoodQ] := (Message[g::nogood, x]; Abort[])
Run Code Online (Sandbox Code Playgroud)
现在
?g
Global`g
cccQ[g[x0_]]^:=True
g[x_?notGoodQ]:=(Message[g::nogood,x];Abort[])
In[6]:= cccQ[g[1]]
Out[6]= True
Run Code Online (Sandbox Code Playgroud)
而
In[7]:= cccQ[g[2]]
During evaluation of In[7]:= g::nogood: -- Message text not found -- (2)
Out[7]= $Aborted
Run Code Online (Sandbox Code Playgroud)
所以...一般规则: …
我正在使用Workbench开发包的文档.到目前为止我已经习惯了
Quit[]
Needs["mypackage`"]
Run Code Online (Sandbox Code Playgroud)
在每个教程的开头.这是因为我想要一个干净的全局环境和包装同时加载.
我运行了一些构建,一切都按预期工作,但我想知道:有没有更好的方法来获得一个干净的全局上下文,并且每次使用MMA启动我的软件包教程时"自动"加载包上下文?
换句话说:从一个教程到下一个教程,或从教程回到常规MMA笔记本,教程示例中定义的所有符号都可能被"遗忘"吗?在标准的MMA教程页面中,这似乎就是这样.
我想这可以通过本地/笔记本上下文完成.
但是这在实践中如何运作?
谢谢您的帮助