(已解决) 集算器中 record 的复制和字段删除

取出一条 record,如何才能使其 immutable? 在集算器中,表或者集合具有离散性,从源表中取出某些记录后会依然跟源表保持关系 (mutable)。比如,有这么一个序表 b=[{a:1,b:2,c:3},{a:11,b:22,c:33}],取出第 2 条记录进行修改后,源表也会同时修改,=b(2).modify(111,222)。

但有时候,希望只是单纯的修改取出的记录,不同时修改源表,也就是 immutable。此时只要能复制出这条记录,后续对其的修改就不会对源表产生影响。但在集算器中,应该没有对 record 复制的方法,不像序列,序列的复制简单一点,比如 A.m(:) 或者 A.(~) 这样就把序列 A 复制了一遍,变成了另一个跟 A 没有关系的序列。

对 record 的复制没有直接的方法,略费周折,要先变成排列,再用 derive 转序表,用序表方法修改后,再用 (1) 深化出来就相当于复制了一遍 record,转成 spl 语句就是:

[record].derive().modify()(1),此时 modify 就不会同时修改源表了。

同样,如果要删除 record 中的某个字段而不对源表产生影响,也只能转序表后再删:

[record].derive().alter(; 字段名)(1)

为什么会有复制 record 这样的用法?情况是这样的,经常会碰到这样的表格,一个单元格里塞了很多条数据,然后要把这个单元格里的数据拆分到每一行,比如以下例子:

imagepng

要把上表中项目号所在列中的值拆分到每一行,其它列复制,变成下表的格式。这种表格变形对 spl 来说就是小菜一碟,实现很简单。但有个问题,在用 news 方法时(此处只说 news 方法,不说其它序列嵌套遍历解法 A.conj(B.())),除了项目编号之外的字段,其它字段要一个一个手写出去,如果只有几个字段枚举一下也行,一旦字段很多,挨个枚举不是很妥当。当然,也可以事先用 fname 得到所有字段后拼接成文本串,再用宏去解析,这个方法也行,但要分两步。因为懒不想挨个敲字段,宏又不好驾驭,所以想到了用 derive@x() 一次性把所有字段展开,但这个方法的前提是要造一个 record 出来:

imagepng

上图中有颜色部分就是之前讲到的复制 record 的变通方法,这样的话字段再多也不怕,要拆分的字段无论在哪个位置只要知道字段名就能动态实现拆分。因为这种复制 record 的方法有点不直接,所以想请教大佬们,有没有更直接一点的方法复制一条 record 使其 immutable。

还有另一种变形,只拆某些列其余的列不复制保持空 (有些 xml 文件解析出来就是这种格式),如下:

imagepng

如何得到一条 immutable 的 record,恳请大佬们得闲时给予帮助解惑🙏