我想在Maxima
中创建一个类似于Mathematica
中的ConstantArray的函数。所以我尝试在make-array
周围放置一个包装器,但是make_array(fixnum,2,3,4)
将最后一个参数作为一系列参数而不是列表,而如果一个参数调用ConstantArray(a,b,c,d..)
的参数可变,那么我无法将它传递给make-array没有把它全部列为列表。
为了解决从作为参数传递的列表中提取元素并放入make-array函数的问题,我试过了,
constantarray((l)):=block([eq:'make_array(fixnum)],
map(lambda([x],eq:endcons(x,eq)),l),eq);
在调用时
constantarray([1,2,3,5,3]);
返回
make_array(Fixnum对象,1,2,3,5,3)
如果我复制此输出,将其粘贴到控制台并运行它,因为它返回Lisp array [1,2,3,5,3]
。
我尝试使用''%
& ev(constantarray(1,2,3,5,3),nouns)
等但它只是不起作用。我想知道是否有人知道如何强制进行评估,或者我正在做一些不可能的事情。
答案 0 :(得分:2)
试试这个。
constant_array ([L]) := block ([x : first (L), d : rest (L)],
apply (make_array, cons ('any, d)),
fillarray (%%, [x]));
函数定义foo([L]) := ...
表示函数接受可变数量的参数,L
是实际提供的参数列表。 apply (make_array, cons ('any, d))
就像调用make_array('any, d[1], d[2], d[3], ...)
一样。此外,在块中,%%
是前一个表达式的值。
示例:
constant_array (1234, 4, 3, 2);
=> {Lisp Array:
#3A(((1234 1234) (1234 1234) (1234 1234))
((1234 1234) (1234 1234) (1234 1234))
((1234 1234) (1234 1234) (1234 1234))
((1234 1234) (1234 1234) (1234 1234)))}