语法基石(一):变量声明、数据类型与打印
各位同学,咱们今天正式进入 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 全部加载并计算像差,核心代码就靠字符串操作。
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} |
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. 知识体系总览
下面这张图把本章的核心知识点串起来了。你把它存脑子里,后面学运算符、控制流、函数的时候,就知道每个知识点该往哪里放了。
5. 实战小练习
光看不练假把式。我给你们留个简单的练习,自己动手试试:
- 声明一个数字变量
n_fno,赋值为 2.8 - 声明一个字符串变量
s_note,赋值为 "Test lens" - 声明一个列表
a_wavelengths,包含 0.486, 0.587, 0.656 三个值 - 用
print把这三个变量都打印出来 - 把
a_wavelengths的第二个元素改成 0.550,再打印整个列表