如何在最大值中取消引用和使用本地数组不使用 listarray?

问题描述

我认为有两个问题是密切相关的。

我试图在两个不同的函数中重用相同的本地 (!) 变量名 (=SUMPRODUCT(--(Values<OFFSET(Values,E$2,0))*(Labels=$D7))&"/"&SUMPRODUCT(--(Labels=$D7)*--(OFFSET(Labels,0)=OFFSET($D7,0))) )。在这两种情况下,res 都是一个未声明的数组,用于存储其各自函数的返回值。令我惊讶的是,调用 res 然后调用 function1 将覆盖 function2 的结果 - 现在,两个函数都指向 function1res

function2

我的问题是:

  1. 为什么 function1(myList):= block( [res],for i in myList do res[i]: i+2,res ) ; function2(myList):= block( [res],for i in myList do res[i]: i+4,res ) ; aList: [0,1,2,3]; [0,3] output1: function1(aList); res output2: function2(aList); res; listarray(output1); [4,5,6,7] listarray(output2); [4,7] 不是我期望的局部变量?
  2. 是否有使用 res 的替代方法?我知道我可以直接在每个函数的 return 语句中使用它,但我正在使用的系统的管理员出于某种原因将 listarray 列入黑名单。

解决方法

嗯,这里有几件事情正在发生。一是 block 中的局部变量(对于函数参数也是如此)实际上是全局符号,它们的值由动态绑定(与词法绑定相反)管理。在这种情况下,重要的一点是 res 在两个函数中是相同的全局符号,因此一个发生的情况会对另一个产生影响。

(我在为 Maxima 实现词法符号方面取得了进展,我认为它可能会在今年推出。但是,仅仅有词法符号并不能解决问题;请继续阅读。)

>

另一个问题是未声明的数组是符号属性,而不是值。 Maxima 是所谓的 Lisp-2:符号在概念上是一个包含若干项的小表,其中一项称为值,其他项可以是函数定义或其他任意项,统称为属性。特别是您看到的是数组不是符号值。

你想要的返回值是一个列表而不是一个数组。区别在于列表是一个值,而未声明的数组是一个属性。是的,我知道这很晦涩。但好消息是它很容易实现:

(%i2) function1 (aList) := makelist (aList[i] + 2,i,1,length (aList)) $
(%i3) function2 (aList) := makelist (aList[i] + 4,length (aList)) $
(%i4) aList: [0,2,3];
(%o4)                     [0,3]
(%i5) output1: function1 (aList);
(%o5)                     [2,3,4,5]
(%i6) output2: function2 (aList);
(%o6)                     [4,5,6,7]
(%i7) output1;
(%o7)                     [2,5]
(%i8) output2;
(%o8)                     [4,7]

有更简洁的方式来表达“将 nnn 添加到列表中”。试试这些:

function1 (aList) := makelist (x + 2,x,aList);

或者只是

function1 (aList) := aList + 2;

最后一个要求 listarithtrue(这是默认值)。

编辑:我在重读这篇文章时看到我没有使用局部变量。你可以这样说:

function1 (aList) := block ([res],res: makelist (<previous stuff here>),res);

对于 function2 也是如此。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...