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

在Julia中,typeof 可以获取对象类型,但和C++中的 decltype 不同,它获取的是对象的运行时类型,需要对表达式完成求值才能得到。然而有时我们可能希望不求值就得到表达式的类型,这在Julia中并没有直接提供内置方法来实现。

C# 9 引入了仅初始化的属性设置器,这使我们可以定义一个只能在构造函数或者初始化设定项中进行设置的属性:

苦于 Wolfram LibraryLink 原本的接口使用起来过于繁琐,又受 wll-interface 的启发,近期开了一个新坑,尝试为 Wolfram LibraryLink 封装一套 Rust 的接口 wll-rs

阅读本文需要一定 Rust 以及 Wolfram LibraryLink 的基础。

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

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

GeneralUtilities` 是Mathematica从版本10开始新加入的一个上下文。其中提供了大量的实用函数,包括代码生成、调试、静态分析、迭代器对象等各个领域,一定程度上弥补了Mathematica基础设施不足的状况。

背景和问题的引入

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

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

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

众所周知,Mathematica中虽然使用下标形式非常方便,但如果对下标结构进行直接赋值,它将关联到内部符号Subscript上。这样,在我们大量清理符号定义的时候可能会漏掉一些定义。类似地,导数Derivative有同样的问题,比如对于

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

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