将参数传递给Maxima CAS中的函数

时间:2018-04-06 15:32:09

标签: list grep syntax-error locale maxima

我有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(好)。

问题的原因是什么?

1 个答案:

答案 0 :(得分:2)

问题似乎是

GivePart(n):=(
    [Part, iMax],

哪个不正确,应该是

GivePart(n):=block(
    [Part, iMax],

block之外,[Part, iMax]未被识别为局部变量列表,而iMax具有在调用GiveList时绑定的值(这是一个Maxima"动态范围"政策的结果。

我发现GiveList也缺少block,需要更正。