Mathematica VS Code 插件开发笔记

随手记的东西,写给自己看。日后心情好的话可能会整理一下。遗憾的是还是很难按照核心语法的方式去做高亮,Mathematica实在是太庞杂了。

括号与自动配对的符号

基础括号

Mathematica中的基础括号有:

括号用途 形式
运算组合 $(term)$
函数 $f[x]$
列表 (List) ${a, b, c}$
索引 (Part) $v[[i]]$

在实现中,注释括号((*comments*))同样被视作一种括号。

自动配对与嵌套符号

除上面的几种括号之外,自动配对的还有以下括号与引号,有一些是系统没有内置定义却保留形式的括号。

括号用途 形式
向下取整 (Floor) $\lfloor\dots\rfloor$
向上取整 (Ceiling) $\lceil\dots\rceil$
角括号 (AngleBracket) $\langle\dots\rangle$

除此之外还有括号条和双括号条,过于罕见没有列出(大多数字体也没有办法显示这些字符)。

引号 形式
双引号 “…”

需要注意的是,Mathematica中只提供了双引号用作字符串边界,没有提供单引号。单引号被用作表示求导。

注释

Mathematica只提供了块注释。块注释从“$($”开始,至“$)$”结束。Mathematica的注释支持嵌套。

字符串

字符串的实现基于C语言的tmLanguage,Mathematica的字符串规则与C语言基本相同,包括转义字符和断行。

表达式

表达式是Mathematica的核心,所有Mathematica对象都是表达式。

表达式的基本书写形式

形式 说明
$f[x, y]$ 标准形式
$f@(x, y)$ 前缀形式
$ x\sim f\sim y$ 中缀形式
$(x, y)//f$ 后缀形式

在插件的实现中,通过匹配开始特征实现函数名的高亮,而不做开始与结束匹配,不使用meta。

其他形式的表达式

除此之外,函数的复合、映射(Map)、应用(Apply)等也用于匹配函数名。

注意:Mathematica中,标识符的形式是\\b([A-Za-z$][A-Za-z0-9$]),标识符前面如果出现数字,如5Sin,即便没有空格,也视作相乘,即刚刚的例子是5*Sin,虽然不是标识符,但是合法的。在插件实现中,每匹配一个函数名就要匹配前面可能存在的数字。

信息

信息Symbol::Message的前半部分样式为entity.name.function,后半部分按照语言定义,是字符串。

纯函数

纯函数的可能性放在了一般函数高亮中,将纯函数标志符#视作函数名。

模式

模式按照形式去匹配。

1
"match": "\\b([A-Za-z$][A-Za-z0-9$]*)?(_\\.|_{1,3})([A-Za-z$][A-Za-z0-9$]*)?(\\.{2, 3})?"

To do

  • 构建内建函数列表、内建属性、内建值(但是这些都是符号……)
  • 考虑如何将定义中的函数名改为entity
  • Linting(?)、snippets……
  • Intellisense(?)

参考

  1. 《Mathematica 全书·第四版》西安交通大学出版社
  2. https://code.visualstudio.com/docs/extensions/example-hello-world
  3. http://www.jb51.net/tools/zhengze.html
  4. http://manual.macromates.com/en/language_grammars
  5. https://code.visualstudio.com/docs/extensionAPI/vscode-api
  6. https://reference.wolfram.com/language/tutorial/Operators.html