关于函数 conj 的一点建议
大佬们,早上好!
conj 函数在官网函数文档里的描述是:计算序列 A 中各个序列成员的和列。它还有一个选项是 @r,递归计算到所有成员都不再是序列为止。这就是传统意义上的序列扁平化,很好用。
我想的是,在序列扁平化的时候,可不可以指定扁平化的层数?比如有一个 n 层嵌套的序列,我只想扁平化到第二层,那就要写两次 conj,序列.conj().conj(),如果要扁平化 k 层,就要写 k 次 conj,这样一来显得步骤冗余了,但 conj@r 递归一路到底,就会用力过猛。所以,可不可以有一个选项或者参数,能指定扁平化的层数?就像自己写递归的时候,有个指定层数的参数。
比如,我想对以下嵌套序列扁平化两层,自己写递归有点小复杂:
A | B | C | |
1 | =[[1,2],[3,[4,5]],6,7,[8,[[9]]]] | ||
2 | func | ||
3 | if B2+0==0 | return A2 | |
4 | else | return A2.(if(ifa(~),func(A2,~,B2-1),[~])).conj() | |
5 | =func(A2,A1,2) |
conj 可不可以增加参数实现指定层数的扁平化,比如,
conj@r(x;k),其中参数 x 是可以省略的运算表达式或者字段名,k 是递归的次数。
以上建议,恳请大佬有空时考虑一下,看能否实现?
或者指点一下有没有其他更巧妙的扁平化手法。
谢谢!
先试试这个:eval((“A”|k.(“conj()”)).concat(“.”) )
谢谢老贼指点!
您那样写肯定没问题,但我感觉还是欠优雅😄
如果能实现 conj@r(; 层数) ,it’s gonna be the best practice😄 最佳实践。
下午好,老贼大神,抱歉又来打扰你🙏
咱这个 conj@r 有没有可能实现指定层数😄
这个意思不大了,序列层数很少太深的,通常三层就到头了。设计这个参数的使用面过窄。
明确知道层数,可以写死,A.conj().conj()
要用变量,也有较简单的写法
k.run(A=A.conj())
或者用宏
A${fill(“.conj()”,k)}
谢谢老贼回复😄
一开始,您说 "先试试这个…",我误以为您会有其他考虑,哈哈😄 会错意了。
您发话了,我就可以把心思放去其他函数了,省得惦记😄
感谢🙏 Thx for your time!