去年 GitHub 推出了 Actions,以提供内置的持续集成能力。同样是在去年,Wolfram Research 也推出了免费的开发者 Wolfram 引擎,让我们有机会免费运行 Wolfram 语言代码。那么,两件快乐事情重合在一起。而这两份快乐,又给我带来多的快乐。得到的……没错,就是我们期待已久的对 Wolfram 语言程序的持续集成。
写下这篇文章的起源是在知乎上看到的一个回答[1]:
很简单,就是硬抬杠。
举个例子,我说偶数跟正整数一样多,你就说怎么可能,正整数包含奇数和偶数,所以肯定正整数多。
我解释说偶数跟正整数存在一个一一映射,并且都含有无穷多元素,所以一样多。你就说我听不懂什么一一映射,我只知道我是你的两倍,所以肯定比你多。
那我解释,1对应2,2对应4,3对应6,一直这样下去,每个正整数都对应一个偶数。他就是不同意,说你说话就在放屁,我给你一百块,你给我两百块,一直这样我们看看最后谁的钱多?
我说这在有限的情况下是对的,但是无穷的情况下就不一定了。你就说无穷不就是特别大的数嘛,那我大一你倍不是大你更多?
我说wdnmd吧,你就说你怎么骂人呢?
在这个回答里,作者似乎把对于无法将无穷集合的等势理解成“一样多”的普通人思维当作抬杠。但这件事就真的只是抬杠这么肤浅吗?
搭建一个个人维基用来整理知识的想法早已有之,但具体该使用什么方案却迟迟没能定下来。在最初的想法里,我希望满足下面的几项需求:
我们知道,Wolfram|Alpha 有一个名为 Step-by-Step Solutions 的功能,可以显示一些数学问题求解的过程。又比如,著名的 Rubi 可以在求解积分的同时显示积分的求解步骤。实际上,这些系统背后大抵都是基于模式匹配和规则变换而实现的,因而原则上来说自己也可以实现一个。当然,就实践而言这些系统都过于复杂了,例如 Rubi 包含了超过六千条规则,其背后的原理远非三言两语可以阐明的。不过,相比于积分,微分的运算规则要简明得多,而且对规则的应用总是简单机械的,并不像积分那样可能会运用到各种技巧。因此,本文将利用 Mathematica 的模式匹配和规则实现一个带步骤符号求导器。
最近在做 ComputationalOptics包 的时候为了把 LightField
实现为一个比较典型的Wolfram语言风格的对象,使用了很多undocumented方法,这里主要是做一下记录。
需要注意的是,这里的“对象”不是指“面向对象”里所说的对象(虽然也有点关系),而是类似于 Entity
或者 TemporalData
这类的对象。