lisp - Maxima:从函数返回函数并在之后对其进行评估

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

我想在 Maxima 中创建一个类似于 ConstantArray 的函数在 Mathematica 中。所以我尝试在 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 数组 [1,2,3,5,3]

我已经尝试使用 ''% & ev(constantarray(1,2,3,5,3),nouns) 等对其进行评估,但它只是不起作用.我想知道是否有人知道如何强制进行此评估,或者我正在做一些不可能的事情。

最佳答案

试试这个。

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], ...)。此外,在一个 block 中,%% 是前一个表达式的值。

例子:

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

关于lisp - Maxima:从函数返回函数并在之后对其进行评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22196243/

相关文章:

lisp - 如何从 Lisp 类导出槽和访问器?

function - 获取等式的右侧

lisp - 在 common-lisp 中,我如何覆盖/更改特定类型对象的评估行为?

scheme - 如何从 Racket 列表中过滤掉错误值

lisp - 使用 ASDF 启动 Hunchentoot

lisp - defun 以列表作为参数

format - 漂亮地打印固定宽度字段中的值

common-lisp - 在 common lisp 中使用 &allow-other-keys

gnuplot - 在 WXMaxima GUI 中绘制图形

math - 我如何评估对数字的整合?