list.tin 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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. #func {list.Insert} {
  103. #local l {%1};
  104. #loc idx {%2};
  105. #loc data {%3};
  106. #var l {@list.Extend{{$l};@math.Eval{$idx - 1}}};
  107. #if { $idx > &l[] } {
  108. #list l add {$data};
  109. };
  110. #else {
  111. #list l set {$idx} {$data};
  112. };
  113. #return {$l};
  114. };
  115. ///=== {
  116. // #@ list.Reverse <列表>
  117. // 按照倒序重新排列列表内容。
  118. // };
  119. #func {list.Reverse} {
  120. #local list {%0};
  121. #var result {};
  122. #local len {&list[]};
  123. #if { $len > 0 } {
  124. #local idx {};
  125. #loop {$len} {1} {idx} {
  126. #list {result} add $list[$idx];
  127. };
  128. };
  129. };
  130. ///=== {
  131. // #@ list.Get <列表> <下标>
  132. // 从列表中按照下标取出一个值。
  133. // };
  134. #func {list.Get} {
  135. #local list {%1};
  136. #local index {@defaultNum{%2;1}};
  137. #return {$list[+$index]};
  138. };
  139. ///=== {
  140. // #@ list.RandomGet <列表>
  141. // 从列表中随机取出一个值。
  142. // };
  143. #func {list.RandomGet} {
  144. #local list {%1};
  145. #local index {@math.Random{1;&list[]}};
  146. #return {$list[+$index]};
  147. };
  148. ///=== {
  149. // #@ list.Zip <列表1> <列表2> [...]
  150. // 将多个列表合并成一个列表。结果列表的每个元素分别对应参数列表中对应位置的元素。
  151. // 各个参数列表中的元素将按顺序一一对应,以分号分隔连接到一起成为结果列表的元素。
  152. // };
  153. #func {list.Zip} {
  154. #info arguments save;
  155. #unvar info[ARGUMENTS][0];
  156. #local argv {$info[ARGUMENTS]};
  157. #if { &argv[] < 2 } {
  158. #return {%1};
  159. };
  160. #local i {};
  161. #local maxSize {0};
  162. #loop {1} {&argv[]} {i} {
  163. #local list {$argv[+$i]};
  164. #local size {&list[]};
  165. #if { $size > $maxSize } {
  166. #local maxSize $size;
  167. };
  168. };
  169. #if { $maxSize < 1 } {
  170. #return {};
  171. };
  172. #local zipped {};
  173. #loop {1} {$maxSize} {i} {
  174. #local n {};
  175. #local l {};
  176. #loop {1} {&argv[]} {n} {
  177. #if { $i > &argv[+$n][] } {
  178. #list l add {{}};
  179. };
  180. #else {
  181. #list l add {{$argv[+$n][$i]}};
  182. };
  183. };
  184. #list zipped {add} {{@slist.FromList{$l}}};
  185. };
  186. #return {$zipped};
  187. };
  188. ///=== {
  189. // #@ list.ZipAs <格式串> <列表1> <列表2> [...]
  190. // 将多个列表合并成一个列表。结果列表的每个元素分别对应参数列表中对应位置的元素。
  191. // 合并时使用格式串对所有参数列表中的元素进行格式化合并。
  192. // };
  193. #func {list.ZipAs} {
  194. #info arguments save;
  195. #unvar info[ARGUMENTS][0];
  196. #local argv {$info[ARGUMENTS]};
  197. #local format {$argv[1]};
  198. #list argv delete {1};
  199. #if { &argv[] < 1 } {
  200. #return {};
  201. };
  202. #local i {};
  203. #local maxSize {0};
  204. #loop {1} {&argv[]} {i} {
  205. #local list {$argv[+$i]};
  206. #local size {&list[]};
  207. #if { $size > $maxSize } {
  208. #local maxSize $size;
  209. };
  210. };
  211. #if { $maxSize < 1 } {
  212. #return {};
  213. };
  214. #local zipped {};
  215. #loop {1} {$maxSize} {i} {
  216. #local n {};
  217. #local l {};
  218. #loop {1} {&argv[]} {n} {
  219. #if { $i > &argv[+$n][] } {
  220. #list l add {{}};
  221. };
  222. #else {
  223. #list l add {{$argv[+$n][$i]}};
  224. };
  225. };
  226. #local value {};
  227. #line sub var #format value {$format} $l[];
  228. #list zipped {add} {{$value}};
  229. };
  230. #return {$zipped};
  231. };