我想知道如何一般地做到这一点,最好的策略是什么等等.我已经看到了一些解决方案,其中一些看起来非常难/乏味.我工作的那个使用纯函数来实现对象函数和头像OBJECT [].在类编码方面使用起来非常困难.在定义函数和构造函数时(特别是继承部分很难),我感到头晕目眩.
因此,我的问题的编码是关于类的编码部分的优点.理想情况下,我正在寻找可以如下工作的东西.首先,我们定义一个类,例如汽车如下:
beginClass["vehicle"];
public startTheEngine;
private fuel;
vehicle[args_]:=Block[{},...];
startTheEngine[thrust_]:=Block[{}...];
endClass
beginClass["car", "vehicle"];
public TurnTheRadioOn;
private frequency;
car[args_] := Block[{...},];
TurnTheRadioOn[]:=
Block[{},
use private variable frequency
]
endClass;
Run Code Online (Sandbox Code Playgroud)
请注意,私有/公共函数的定义几乎与"普通"mathematica代码一样非常重要.这就是主要要求.
该课程将被用作
car1 = newObject["car", args];
car1.StartTheEngine[];
car1.TurnOnTheRadio[];
Run Code Online (Sandbox Code Playgroud)
我很好奇那个人要考虑什么?为了构建像上面这样的东西可能涉及Mathematica的许多方面,例如如何修复".".语法等.如果您建议现有的软件包,我将不胜感激,如果您可以原则上评论它是如何工作的.
我天真的期望是封装部分可以通过BeginPackage结构修复.所有对象都可以存储在专门为每个类设计的名称空间中.我认为对象看起来像
car1 = OBJECT["car"][fuel$1,frequency$1,....];
car2 = OBJECT["car"][fuel$2,frequency$2,....];
Run Code Online (Sandbox Code Playgroud)
我认为必须构建类似编译器的东西,将上面的类定义代码转换为类.m文件.此外,在某种程度上,第二个主要问题是如何构建这样的编译器.
关心佐兰
ps我之所以问这个问题,是因为我真的需要多次这样的东西.
我有以下问题.
我正在开发一个随机模拟器,它随机对系统的配置进行采样,并存储在某些时间点访问每个配置的次数的统计数据.大致代码就像这样工作
f[_Integer][{_Integer..}] :=0
...
someplace later in the code, e.g.,
index = get index;
c = get random configuration (i.e. a tuple of integers, say a pair {n1, n2});
f[index][c] = f[index][c] + 1;
which tags that configuration c has occurred once more in the simulation at time instance index.
Run Code Online (Sandbox Code Playgroud)
一旦代码完成,就会有一个f的定义列表,看起来像这样(我手工输入它只是为了强调最重要的部分)
?f
f[1][{1, 2}] = 112
f[1][{3, 4}] = 114
f[2][{1, 6}] = 216
f[2][{2, 7}] = 227
...
f[index][someconfiguration] = some value
...
f[_Integer][{_Integer..}] :=0
Run Code Online (Sandbox Code Playgroud)
请注意,首先出现的无模式定义可能相当稀疏.也无法知道将挑选哪些值和配置.
问题是有效地提取所需索引的值,例如问题
result …Run Code Online (Sandbox Code Playgroud)