语法基石(一):变量声明、数据类型与打印

各位同学,咱们今天正式进入 Code V 宏命令的语法世界。说实话,我刚开始学的时候也觉得这些东西很枯燥,但后来发现,变量和数据类型就像盖房子的砖头和水泥——你越早把它们搞明白,后面写复杂程序就越顺手。

这一章我们只聊三件事:变量怎么声明、数据长什么样、怎么把结果打印出来看看。别小看这三步,我见过太多人写了半天宏,结果连变量类型都没搞对,最后 debug 到崩溃。

1. 变量声明:给数据起个名字

在 Code V 里,变量不需要像 C 语言那样先声明类型再使用。你直接写个名字,给它赋个值,它就活了。说白了,就是「用即声明」。

! 声明一个数字变量
radius = 12.5

! 声明一个字符串变量
lens_name = "Double Gauss"

! 声明一个列表变量
field_list = {0, 5, 10, 15}

我个人习惯在变量名里加个前缀,比如 n_ 表示数字,s_ 表示字符串,a_ 表示列表。这样看代码一眼就知道类型,省得后面搞混。

小技巧:变量名区分大小写。Radius 和 radius 是两个不同的变量。我建议统一用小写加下划线,比如 max_field、focal_length,团队协作时特别有用。

2. 数据类型:数字、字符串、列表

Code V 的宏语言只支持三种基本数据类型。嗯,就三种,不多。但你别小看它们,我做过一个包含 2000 行代码的自动化公差分析程序,全靠这三种类型撑起来的。

2.1 数字(Number)

数字就是数值,可以是整数也可以是小数。Code V 内部统一用双精度浮点数存储,所以你不用担心精度问题。

! 整数
n_aperture = 2.8

! 小数
n_curvature = 0.0156

! 科学计数法
n_wavelength = 5.87e-4

我在项目中遇到过一个问题:用 0.1 + 0.2 做判断,结果死活不相等。后来才发现浮点数有精度误差,得用 abs(a - b) < 1e-10 来比较。这个坑你们记住,以后肯定用得上。

2.2 字符串(String)

字符串用双引号括起来。它可以存文件名、透镜名称、系统参数,甚至是一整段注释。

! 基本字符串
s_file = "C:/Users/design/lens.seq"

! 字符串拼接
s_full = "Lens_" // "DoubleGauss"  // 结果是 "Lens_DoubleGauss"

! 取字符串长度
n_len = len(s_file)  // 返回 28

你想想看,如果你要批量处理 100 个镜头文件,字符串拼接和截取就是你的救命稻草。我曾经写过一个脚本,自动把 Lens_001.seq 到 Lens_100.seq 全部加载并计算像差,核心代码就靠字符串操作。

注意:Code V 的字符串索引从 1 开始,不是 0!我第一次用 substr(s, 0, 3) 取前三个字符,结果返回空串。查了半天文档才发现这个「反人类」设计。记住:索引从 1 开始。

2.3 列表(List)

列表用花括号 {} 括起来,元素用逗号分隔。它可以装数字、字符串,甚至混合装。列表是 Code V 里最灵活的数据结构,没有之一。

! 数字列表
a_radii = {12.5, -8.3, 45.0, -120.0}

! 字符串列表
a_surfaces = {"S1", "S2", "S3", "STO", "S5"}

! 混合列表(不推荐,但可以)
a_mixed = {1, "test", 3.14}

列表的操作非常丰富,我挑几个最常用的列出来:

操作 语法 示例 结果
取长度 size(a) size(a_radii) 4
取元素 a[i] a_radii[2] -8.3
追加元素 a = a + {value} a_radii = a_radii + {99.9} {12.5, -8.3, 45.0, -120.0, 99.9}
删除元素 remove(a, index) remove(a_radii, 2) {12.5, 45.0, -120.0}
排序 sort(a) sort(a_radii) {-120.0, -8.3, 12.5, 45.0}
核心概念:列表在 Code V 里是「值传递」还是「引用传递」?答案是值传递。你赋值 b = a 之后,修改 b 不会影响 a。这一点和 Python 不一样,写代码时要注意。

3. 赋值与打印:让程序跟你说话

赋值很简单,一个等号搞定。但打印就有讲究了。Code V 里最常用的打印命令是 print,它能把结果输出到命令行窗口。

! 基本打印
print "Hello, Code V!"

! 打印变量
n_f = 50.0
print "Focal length = ", n_f

! 打印列表
a_data = {1, 2, 3, 4, 5}
print "Data: ", a_data

! 格式化打印
n_radius = 12.34567
print "Radius = ", format(n_radius, "F8.3")  // 输出 "Radius =   12.346"

我个人习惯在调试时多用 print,每算完一个关键步骤就打印一下中间结果。这样一旦出问题,马上就能定位到是哪一步算错了。

调试技巧:用 print "=== DEBUG ===" 这样的标记行把不同阶段的输出隔开。我当年调试一个 500 行的优化脚本,就是靠这种「分段打印法」找到了一个索引越界的 bug。

4. 知识体系总览

下面这张图把本章的核心知识点串起来了。你把它存脑子里,后面学运算符、控制流、函数的时候,就知道每个知识点该往哪里放了。

语法基石:变量、数据类型与打印 变量声明 数字 (Number) 整数 / 小数 / 科学计数 浮点精度:用 abs 比较 字符串 (String) 双引号包裹 / 拼接 // 索引从 1 开始! 列表 (List) 花括号 {} / 逗号分隔 size / 索引 / 追加 / 删除 赋值 = / 打印 print 三种数据类型 + 赋值打印 = 宏命令编程的最小闭环 掌握这些,你就可以开始写简单的自动化脚本了

5. 实战小练习

光看不练假把式。我给你们留个简单的练习,自己动手试试:

  1. 声明一个数字变量 n_fno,赋值为 2.8
  2. 声明一个字符串变量 s_note,赋值为 "Test lens"
  3. 声明一个列表 a_wavelengths,包含 0.486, 0.587, 0.656 三个值
  4. 用 print 把这三个变量都打印出来
  5. 把 a_wavelengths 的第二个元素改成 0.550,再打印整个列表