我有a program im Maxima CAS:
kill(all);
remvalue(all);
GivePart(n):=(
[Part, iMax],
if (n>20) then iMax:10
else iMax : 250,
Part : makelist(i, i, 0, iMax) )$
GiveList(iMax):=(
[Part, PartList ],
PartList:[],
for i:1 thru iMax step 1 do (
Part: GivePart(i),
PartList : cons(Part, PartList)
),
PartList
)$
pp:GiveList(60)$
length(pp);
它创建了一个列表页。
pp的长度应为60,但为21。
程序有2个功能,iMax是
程序运行时没有任何错误消息。
我已检查过Maxima CAS的源代码
grep -wnR "iMax"
和iMax未在Maxima CAS代码中使用
我知道如何解决问题:在第一个函数中更改局部变量的名称:
kill(all);
remvalue(all);
GivePart(n):=(
[Part, i_Max],
if (n>20) then i_Max:10
else i_Max : 250,
Part : makelist(i, i, 0, i_Max) )$
GiveList(iMax):=(
[Part, PartList ],
PartList:[],
for i:1 thru iMax step 1 do (
Part: GivePart(i),
PartList : cons(Part, PartList)
),
PartList
)$
pp:GiveList(60)$
length(pp);
现在pp的长度是60(好)。
问题的原因是什么?
答案 0 :(得分:2)
问题似乎是
GivePart(n):=(
[Part, iMax],
哪个不正确,应该是
GivePart(n):=block(
[Part, iMax],
在block
之外,[Part, iMax]
未被识别为局部变量列表,而iMax
具有在调用GiveList
时绑定的值(这是一个Maxima"动态范围"政策的结果。
我发现GiveList
也缺少block
,需要更正。