【问题标题】:Maxima: Returning function from function and evaluating it aftewardsMaxima:从函数返回函数并随后对其进行评估
【发布时间】:2023-03-23 21:12:01
【问题描述】:

我想在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) 等对其进行评估,但它只是不起作用。我想知道是否有人知道如何强制执行此评估,或者我正在做一些不可能的事情。

【问题讨论】:

    标签: lisp common-lisp maxima computer-algebra-systems


    【解决方案1】:

    试试这个。

    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)))}
    

    【讨论】:

    • 这似乎工作得很好,我也很感谢这个建议。但我也想知道我这样做的方式是否可行。
    • @Rorschach 在你得到的结果中,你可以写ev(%, nouns) 来评估make_array 名词表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    相关资源
    最近更新 更多