语法语言
入口:数据页菜单 →「语法编辑器…」。编辑器执行 PSPP 语法的一个可执行子集:命令以句点结尾,输出面板逐条给出结果,失败时标注「第 N 行」并可点回源码。
本页讲 v1.5.0 补上的语法层(注释、宏、INCLUDE、定位、.sps 往返);可执行命令清单见数据变换。
注释
按 PSPP 语义,* 或 COMMENT 开头的注释不是「本行剩余部分」,而是持续到「行尾句点」或空行为止:
text
* 说明文字。
COMPUTE x = score + 1.上面那句注释到第一个行尾句点结束,COMPUTE 照常执行。要点:
- 只有行尾的句点结束注释:
* 见 v1.2.0 说明(行内句点不结束注释).整行都是注释; COMMENT与*等价,可跨多行,同样到行尾句点为止;- 空行同样结束注释;
- 行内
/* … */会被剥掉,参数不受影响:COMPUTE x = score /* 加一 */ + 1.; - 整行只有
/* … */时按 PSPP 规则结束当前命令:
text
COMPUTE x = score + 1
/* 这条命令还没写句点,这里结束它 */
LIST.- 忘了句点时注释会把后面的命令一起吃掉,编辑器给出**提示(Hint)**而不是静默丢命令:
text
* 忘了加句点
LIST.宏
text
DEFINE !show(vars=!DEFAULT(pre) !TOKENS(1))
DESCRIPTIVES !vars.
!ENDDEFINE.
!show vars=post.
!show.- 参数:位置参数
!POSITIONAL(在宏体里用!1、!2…)与关键字参数,取到方式有!TOKENS(n)、!CHAREND('/')、!CMDEND,默认值!DEFAULT(值),位置与关键字可以混用; - 调用:
!show vars=post.(PSPP 写法)或!sum2(pre, post).(括号形式,兼容 SPSS 习惯); - 宏函数:
!CONCAT!QUOTE!UNQUOTE!UPCASE!LENGTH!SUBSTR!HEAD!TAIL!INDEX!EVAL!BLANKS!NULL,实参里的宏调用先展开(!CONCAT(!a, _2)); - 流程控制:
!LET定义局部变量、!IF/!THEN/!ELSE/!ENDIF、!DO/!TO/!BY/!DOEND循环,可嵌套; - 自递归有深度上限;重复
DEFINE同名宏会覆盖旧定义;注释里的DEFINE不会被登记。
本版不做的构造会明确报「未支持」,不会静默忽略:!DO !v !IN (…)、!ENCLOSE、!NOEXPAND / !OFFEXPAND / !ONEXPAND。
INCLUDE
text
INCLUDE 'common.sps'.
INCLUDE FILE='common.sps' ENCODING='UTF-8'.- 被包含的文件注入当前脚本后一起执行,宏表延续:包含文件里
DEFINE的宏对之后的命令生效; - 相对路径按当前
.sps文件所在目录解析,不依赖启动目录; - 循环包含会报错,嵌套上限 16 层;
- 被包含文件里出错 → 立即停止后续命令(PSPP 语义:包含文件里的错误会中止整个脚本);
- 输出里该文件的命令标注文件名与行号,点击跳回对应位置。
定位
- 每条命令带起止位置;失败按「第 N 行」标注,点一下光标跳到源码对应行;
- 宏展开产生的命令能回溯到原始位置(不会因为展开而丢行列信息);
- 命令被注释符吞掉等「不是错误但结果可疑」的情况按提示显示,与失败区分。
.sps 往返
- 打开:先剥 UTF-8 BOM;非法字节替换为 U+FFFD 并提示替换数量,不静默丢内容;
- 保存覆盖当前文件,「另存为」另选路径;写出不带 BOM 的 UTF-8,PSPP 可直接读取;
- 编辑器顶部有命令模板条,点击插入;「附加数据集」把另一个
.sav/ 工程文件挂进来(见数据变换)。