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(?)
参考
- 《Mathematica 全书·第四版》西安交通大学出版社
- https://code.visualstudio.com/docs/extensions/example-hello-world
- http://www.jb51.net/tools/zhengze.html
- http://manual.macromates.com/en/language_grammars
- https://code.visualstudio.com/docs/extensionAPI/vscode-api
- https://reference.wolfram.com/language/tutorial/Operators.html