在这篇文章中,我们来解释一下我们的软件 (RP Fiber Power V7, RP Resonator V4, RP Coating V4 and RP ProPulse V4)基本的编辑器特性,特别是新的调试器、改进的代码格式化规则、字符映射工具和一些新的控制结构。在那之后不久,我们决定进一步增加非常实质性的额外改进,这导致了好几周的繁重编程工作。
在开始介绍编辑器特性之前,我们想强调一下,我们的软件不是必须要用脚本代码才能控制的,它也可以用简单的表单来实现,甚至是为特定应用程序定制的表单(称为定制表单);只是对于最复杂的模拟来说,完全的灵活性只能通过脚本实现。
大多数编辑器特性的实现是由于使用了一个改进了很多的第三方编辑器组件,取代了以前使用的相当基础的编辑器,后者由Windows提供,并配备了一些额外的功能(但可能只在有限的范围内)。
特性如下:
语法高亮显示
脚本编辑器现在支持语法高亮显示。本质上,这意味着已识别的命令、函数和关键字名称将用不同的颜色高亮显示。此外,软件还会以不同的方式显示注释和字符串常量。这样,就可以更容易地识别脚本代码的结构。下面以RP Fiber Power 的演示脚本截图为例:
这看起来又实用又美观
参数帮助
我们软件的脚本语言支持许多函数,有时很难记住每个函数所需的确切参数列表。我们已经能够实现一个非常好的解决方案。如果您使用这样的函数,只需在编辑器中输入它的名称和开括号,就会显示参数帮助;您也可以自己点击一个函数参数来得到这个:
如果您曾经使用过这样的函数,显示的参数名将很容易提醒您需要在这里输入什么。在许多情况下,您不再需要使用交互式帮助系统。这当然很好,不过交互式帮助系统也很好用,它会向您显示更多的细节:例如,只需将光标放在函数名上,然后按F2来搜索函数名。然后双击函数名来确认您的选择,以便显示完整的解释。
语法检查
虽然模拟脚本通常运行得相当快,但在某些情况下,计算时间是很长的——例如,在一个大型数值网格上进行数值波束传播时。在这种情况下,如果程序执行这样的脚本,然后遇到由小小的打字错误(例如)引起的语法错误,就会非常尴尬。然后,在纠正错误之后,您可能不得不再次执行整个脚本。因此,在实际执行脚本之前检查语法的正确性是可取的。
确切地说,现在已经提供了:用编辑|检查语法或Ctrl-H你会得到语法快速检查。当发现问题时,将光标移动到相应的位置,并显示错误消息。在下面的例子中,缺少了一个结束括号:
自动代码重新格式化
我们引入了改进的代码格式规则,这使得代码的可读性大大提高。虽然这很好,但如果您已经有了许多脚本,然后希望重新格式化它们,那么就会遇到一个相当棘手的问题。其实软件仍然接受旧的格式,但是如果所有的脚本都不符合改进后的格式规则,那就不好了。
我们自己最初也开始手动重新格式化手稿,结果让我们意识到,自动重新格式化将是非常好的。需要注意的是,实现它也相当困难。尽管如此,我们最终还是实现了。虽然我们花了很多天的时间并绞尽脑汁,但是它运行得很好,让我们很欣慰。
例如,我们有一个包含以下部分的脚本:
R_min:=150 mm { minimum curvature radius } L_bend:=R_min*(90 deg) show "L_bend: ", L_bend:d3:"m" z1_bend:=(L_f-L_bend)/2 z2_bend:=(L_f L_bend)/2 R(z):= if z < z1_bend then 0 else if z < z2_bend then R_min else 0 theta(z):= if z < z1_bend then 0 else if z < z2_bend then -(z - z1_bend)/R_min else -pi/2
我们只是在编辑器按下Ctrl-R,然后它读如下:
R_min := 150 mm { minimum curvature radius } L_bend := R_min * (90 deg) show "L_bend: ", L_bend:d3:"m" z1_bend := (L_f - L_bend) / 2 z2_bend := (L_f L_bend) / 2 R(z) := if z < z1_bend then 0 else if z < z2_bend then R_min else 0 theta(z) := if z < z1_bend then 0 else if z < z2_bend then -(z - z1_bend) / R_min else -pi / 2
如果您想知道如何实现这样的特性,我们可以给您一些提示。在启动软件时,软件会以文本的形式读取整个脚本语言的正式定义。内存中的结果数据可以稍后由脚本解析器使用。
其原始功能语法检查(见上图),但提到的正式定义已经修改,这样它也描述了首选的格式——例如,在代码中的位置我们喜欢留有一个空白,在那我们需要有一个换行符,或在空白位置我们将保留一个换行符,如果在原来的代码中已经有一个换行符的话,等等。上面提到的解析器可以在读取原始代码时输出正确格式的代码。这是一个高度递归的操作,特别是在数学表达式的上下文中。正如您想象的那样,即使只是设计上述脚本语言的正式描述(特别是如果它像我们的语言那样强大和通用的话)也需要大量的思考,更不用说实现可以对脚本代码进行相应操作的解析器了。