list.tin 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分。
  4. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  5. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  6. */
  7. #nop 本文件是 xtintin 的一部分,实现了一些列表处理函数;
  8. ///=== {
  9. ///// 列表/表格列表处理函数:
  10. //
  11. // #@ list.FromSlist <字符串列表>
  12. // 将字符串列表转换为列表。
  13. // };
  14. #func {list.FromSlist} {
  15. #list result {create} {%0};
  16. };
  17. ///=== {
  18. // #@ list.IndexOf <列表> <字符串>
  19. // 从列表中查找某个字符串,并返回其位置(从 1 开始计),0 表示没找到。
  20. // };
  21. #func {list.IndexOf} {
  22. #local list {%1};
  23. #local str {%2};
  24. #local idx {0};
  25. #foreach {*list[]} {idx} {
  26. #if { {$list[$idx]} === {$str} } {
  27. #return $idx;
  28. };
  29. };
  30. #return 0;
  31. };
  32. ///=== {
  33. // #@ list.Contains <列表> <字符串>
  34. // 判断字符串是否在列表中。
  35. // };
  36. #func {list.Contains} {
  37. #if { @list.IndexOf{{%1};{%2}} > 0 } {
  38. #return 1;
  39. };
  40. #else {
  41. #return 0;
  42. };
  43. };
  44. ///=== {
  45. // #@ list.Sort <列表>
  46. // 按照值的字母顺序重新排序列表。
  47. //
  48. // #@ list.Order <列表>
  49. // 按照值的数值顺序重新排序列表。
  50. //
  51. // #@ list.SortBy <表格列表> <关键字段>
  52. // 按照值的关键字段的字母顺序重新排序列表。
  53. //
  54. // #@ list.OrderBy <表格列表> <关键字段>
  55. // 按照值的关键字段的数值顺序重新排序列表。
  56. // };
  57. #func {list.Sort} {#var result {%0}; #list result sort};
  58. #func {list.Order} {#var result {%0}; #list result order};
  59. #func {list.SortBy} {#var result {%1}; #list result {indexate} {%2}; #list result sort};
  60. #func {list.OrderBy} {#var result {%1}; #list result {indexate} {%2}; #list result order};
  61. ///=== {
  62. // #@ list.Extend <列表> <长度>
  63. // 将列表长度扩展至指定长度。如果长度已经足够,则什么也不做。
  64. // };
  65. #func {list.Extend} {
  66. #local l {%1};
  67. #local len {@math.Eval{@defaultNum{%2;0} - &l[]}};
  68. #if { $len > 0 } {
  69. #local idx {};
  70. #loop {1} {$len} {idx} {
  71. #list l add {{}};
  72. };
  73. };
  74. #return {$l};
  75. };
  76. ///=== {
  77. // #@ list.Append <列表> <内容>
  78. // 向列表的末尾追加新的元素。
  79. // };
  80. #func {list.Append} {
  81. #local l {%1};
  82. #loc data {%2};
  83. #list l add {{$data}};
  84. #return {$l};
  85. };
  86. ///=== {
  87. // #@ list.Set <列表> <下标> <内容>
  88. // 根据下标设置列表的单个元素的值,如果下标超过列表现有长度,则先扩展列表。
  89. // };
  90. #func {list.Set} {
  91. #local l {%1};
  92. #loc idx {%2};
  93. #loc data {%3};
  94. #var l {@list.Extend{{$l};$idx}};
  95. #list l set {$idx} {$data};
  96. #return {$l};
  97. };
  98. ///=== {
  99. // #@ list.Insert <列表> <下标> <内容>
  100. // 将内容插入到列表的指定下标处,如果下标超过列表现有长度,则先扩展列表。
  101. //
  102. // EXAMPLE: \@list.Insert{{{1}{a}{2}{b}{3}{c}};1;X}
  103. // RESULT: {{1}{X}{2}{a}{3}{b}{4}{c}}
  104. //
  105. // EXAMPLE: \@list.Insert{{{1}{a}{2}{b}{3}{c}};2;X}
  106. // RESULT: {{1}{a}{2}{X}{3}{b}{4}{c}}
  107. //
  108. // EXAMPLE: \@list.Insert{{{1}{a}{2}{b}{3}{c}};3;X}
  109. // RESULT: {{1}{a}{2}{b}{3}{X}{4}{c}}
  110. //
  111. // EXAMPLE: \@list.Insert{{{1}{a}{2}{b}{3}{c}};4;X}
  112. // RESULT: {{1}{a}{2}{b}{3}{c}{4}{X}}
  113. //
  114. // EXAMPLE: \@list.Insert{{{1}{a}{2}{b}{3}{c}};5;X}
  115. // RESULT: {{1}{a}{2}{b}{3}{c}{4}{}{5}{X}}
  116. // };
  117. #func {list.Insert} {
  118. #local l {%1};
  119. #loc idx {%2};
  120. #loc data {%3};
  121. #var l {@list.Extend{{$l};@math.Eval{$idx - 1}}};
  122. #if { $idx > &l[] } {
  123. #list l add {$data};
  124. };
  125. #else {
  126. #list l insert {$idx} {$data};
  127. };
  128. #return {$l};
  129. };
  130. ///=== {
  131. // #@ list.Reverse <列表>
  132. // 按照倒序重新排列列表内容。
  133. // };
  134. #func {list.Reverse} {
  135. #local list {%0};
  136. #var result {};
  137. #local len {&list[]};
  138. #if { $len > 0 } {
  139. #local idx {};
  140. #loop {$len} {1} {idx} {
  141. #list {result} add $list[$idx];
  142. };
  143. };
  144. };
  145. ///=== {
  146. // #@ list.Get <列表> <下标>
  147. // 从列表中按照下标取出一个值。
  148. // };
  149. #func {list.Get} {
  150. #local list {%1};
  151. #local index {@defaultNum{%2;1}};
  152. #return {$list[+$index]};
  153. };
  154. ///=== {
  155. // #@ list.RandomGet <列表>
  156. // 从列表中随机取出一个值。
  157. // };
  158. #func {list.RandomGet} {
  159. #local list {%1};
  160. #local index {@math.Random{1;&list[]}};
  161. #return {$list[+$index]};
  162. };
  163. ///=== {
  164. // #@ list.Zip <列表1> <列表2> [...]
  165. // 将多个列表合并成一个列表。结果列表的每个元素分别对应参数列表中对应位置的元素。
  166. // 各个参数列表中的元素将按顺序一一对应,以分号分隔连接到一起成为结果列表的元素。
  167. // };
  168. #func {list.Zip} {
  169. #info arguments save;
  170. #unvar info[ARGUMENTS][0];
  171. #local argv {$info[ARGUMENTS]};
  172. #if { &argv[] < 2 } {
  173. #return {%1};
  174. };
  175. #local i {};
  176. #local maxSize {0};
  177. #loop {1} {&argv[]} {i} {
  178. #local list {$argv[+$i]};
  179. #local size {&list[]};
  180. #if { $size > $maxSize } {
  181. #local maxSize $size;
  182. };
  183. };
  184. #if { $maxSize < 1 } {
  185. #return {};
  186. };
  187. #local zipped {};
  188. #loop {1} {$maxSize} {i} {
  189. #local n {};
  190. #local l {};
  191. #loop {1} {&argv[]} {n} {
  192. #if { $i > &argv[+$n][] } {
  193. #list l add {{}};
  194. };
  195. #else {
  196. #list l add {{$argv[+$n][$i]}};
  197. };
  198. };
  199. #list zipped {add} {{@slist.FromList{$l}}};
  200. };
  201. #return {$zipped};
  202. };
  203. ///=== {
  204. // #@ list.ZipAs <格式串> <列表1> <列表2> [...]
  205. // 将多个列表合并成一个列表。结果列表的每个元素分别对应参数列表中对应位置的元素。
  206. // 合并时使用格式串对所有参数列表中的元素进行格式化合并。
  207. // };
  208. #func {list.ZipAs} {
  209. #info arguments save;
  210. #unvar info[ARGUMENTS][0];
  211. #local argv {$info[ARGUMENTS]};
  212. #local format {$argv[1]};
  213. #list argv delete {1};
  214. #if { &argv[] < 1 } {
  215. #return {};
  216. };
  217. #local i {};
  218. #local maxSize {0};
  219. #loop {1} {&argv[]} {i} {
  220. #local list {$argv[+$i]};
  221. #local size {&list[]};
  222. #if { $size > $maxSize } {
  223. #local maxSize $size;
  224. };
  225. };
  226. #if { $maxSize < 1 } {
  227. #return {};
  228. };
  229. #local zipped {};
  230. #loop {1} {$maxSize} {i} {
  231. #local n {};
  232. #local l {};
  233. #loop {1} {&argv[]} {n} {
  234. #if { $i > &argv[+$n][] } {
  235. #list l add {{}};
  236. };
  237. #else {
  238. #list l add {{$argv[+$n][$i]}};
  239. };
  240. };
  241. #local value {};
  242. #line sub var #format value {$format} $l[];
  243. #list zipped {add} {{$value}};
  244. };
  245. #return {$zipped};
  246. };