抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

最近在做 ComputationalOptics包 的时候为了把 LightField 实现为一个比较典型的Wolfram语言风格的对象,使用了很多undocumented方法,这里主要是做一下记录。

需要注意的是,这里的“对象”不是指“面向对象”里所说的对象(虽然也有点关系),而是类似于 Entity 或者 TemporalData 这类的对象。

背景和问题的引入

众所周知,Wolfram语言作为一个极为“高级”的编程语言,并没有提供指针这类较为底层的内存管理手段。而符号本身几乎总是充当了类似引用的作用,比如

1
2
3
4
set[sym_Symbol]:=sym=1
b=a;
set[b];
a

可以看到符号a的值通过set[b]赋为了1。在这里b形式上充当了类似其它语言中的引用的作用。但这种方式并不通用,只要a已经具有值了,这种平凡的方式就不能起作用了。有的读者可能会想到:=或者Hold封装,不过单靠这些也不能简单地对已具有本值的符号进行修改。因此,本文试图提出一种具有类似其它语言中指针语义的封装,实现对符号的间接操作。

Mathematica 通常被宣传为 符号式函数式 的编程语言,不过 维基百科 宣称它支持 13种编程范式,其中还包括 面向对象 编程。尽管大家似乎都不把 Mathematica 当编程语言,不过出于兴趣,也为了提升对 Mathematica 语言特性和面向对象的理解,于是有了这篇文章。

比较理想的情况是能够以类似 C++ 或者 Java 那样的形式来创建和使用类与对象,以此为目标进行设计。

在我的常用软件中,Google Chrome 和 Notepad++ 都可以做到拖拽标签页在标签栏移动,在两个窗口间移动,以及创建新的窗口。作为 这个项目 的一部分,打算实现一个功能类似的 Tab Widget 。

在红色警戒2中模拟泰伯利亚矿石效果的方法