Maxima: Возврат функции из функции и ее последующая оценка

Я хочу создать функцию в Maxima, аналогичную ConstantArray в Mathematica. Итак, я попытался поместить оболочку вокруг make-array, но make_array(fixnum,2,3,4) принимает последние аргументы как последовательность параметров, а не список, в то время как если кто-то вызывает ConstantArray(a,b,c,d..) с переменным количеством аргументов, я не могу передать его в make-массив, не помещая все это как список.

Чтобы обойти проблему извлечения элементов из списка, переданного в качестве параметра, и добавления функции 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 (фиксированное число, 1,2,3,5,3)

Эта функция выполняется хорошо, если я скопирую этот вывод, вставлю его в консоль и запущу, так как он возвращает мне Lisp array [1,2,3,5,3].

Я пытался оценить его, используя ''% и ev(constantarray(1,2,3,5,3),nouns) и т. д., но он просто не работает. Я хочу знать, знает ли кто-нибудь, как заставить эту оценку или я делаю что-то невозможное.


person Sejwal    schedule 05.03.2014    source источник


Ответы (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)))}
person Robert Dodier    schedule 05.03.2014
comment
это, кажется, работает просто отлично, и я также благодарен за это предложение. Но мне просто было интересно, возможно ли то, как я это делаю. - person Sejwal; 06.03.2014
comment
@Rorschach в результате, который вы получили, вы можете написать ev(%, nouns), чтобы оценить выражение существительного make_array. - person Robert Dodier; 06.03.2014