Maxima中如何让主函数内定义的子函数像局部变量一样仅作用于内部
Maxima block内定义局部子函数的实现方法
Maxima中普通:=定义的函数默认全局生效,block的局部变量列表默认仅隔离符号的值属性,不会隔离符号的函数属性,这就是你观察到子函数DfDx泄露到全局作用域的原因。
以下是两种不需要手动kill的优雅实现方案:
方案1:使用local()显式声明局部函数
这种方案适配你原有的数组函数写法,仅需要在block开头用local()标记要局部化的函数名,block执行结束后会自动清除对应函数定义,无全局残留:
grad(var,f) := block([gradient, DfDx], /* 声明DfDx的函数属性仅在当前block内生效 */ local(DfDx), gradient : [], DfDx[i] := diff(f(x_1,x_2,x_3),var[i],1), for i in [1,2,3] do ( gradient : append(gradient, [DfDx[i]]) ), return(gradient) )$
方案2:使用lambda表达式赋值给局部变量
你也可以将函数逻辑封装为匿名lambda表达式赋值给局部变量,完全不会生成全局函数绑定,写法更简洁:
grad(var,f) := block([gradient, DfDx], DfDx : lambda([i], diff(f(x_1,x_2,x_3),var[i],1)), gradient : [], for i in [1,2,3] do ( gradient : append(gradient, [DfDx(i)]) ), return(gradient) )$
- 补充说明:你原代码中将变量放入aux列表的操作是多余的,直接把需要局部隔离的变量写在
block后的方括号[]内,即可自动实现变量值的局部隔离,不需要额外处理。
内容的提问来源于stack exchange,提问作者User1234321
相关产品推荐
相关产品推荐

