fp.tin 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分。
  4. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  5. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  6. */
  7. #nop 本文件是 xtintin 的一部分,实现了一些 FP 风格函数;
  8. ///=== {
  9. ///// FP 风格函数:
  10. //
  11. // #@ fp.Map <表格> <内容表达式>
  12. // 遍历表格,根据内容表达式重新生成新内容。
  13. // };
  14. #func {fp.Map} {
  15. #local table {%1};
  16. #local body {%2};
  17. #local key {};
  18. #local value {};
  19. #replace {body} {KEY} {\$key};
  20. #replace {body} {VALUE} {\$value};
  21. #local newTable {};
  22. #local key {};
  23. #foreach {*table[]} {key} {
  24. #local value {$table[$key]};
  25. #line sub {var;functions;escapes} #format value {%s} {$body};
  26. #cat newTable {{$key}{$value}};
  27. };
  28. #return {$newTable};
  29. };
  30. ///=== {
  31. // #@ fp.MapIf <表格> <条件表达式> <内容表达式>
  32. // 遍历表格,对符合条件的表格项,根据内容表达式重新生成新内容,不符合条件的保留原值。
  33. // };
  34. #func {fp.MapIf} {
  35. #local table {%1};
  36. #local cond {%2};
  37. #local body {%3};
  38. #local key {};
  39. #local value {};
  40. #replace {cond} {KEY} {\$key};
  41. #replace {cond} {VALUE} {\$value};
  42. #replace {body} {KEY} {\$key};
  43. #replace {body} {VALUE} {\$value};
  44. #local newTable {};
  45. #local key {};
  46. #foreach {*table[]} {key} {
  47. #local value {$table[$key]};
  48. #local c {};
  49. #line sub {var;functions;escapes} #format c {%s} {$cond};
  50. #if { $c } {
  51. #line sub {var;functions;escapes} #format value {%s} {$body};
  52. };
  53. #cat newTable {{$key}{$value}};
  54. };
  55. #return {$newTable};
  56. };
  57. ///=== {
  58. // #@ fp.Filter <表格> <条件表达式>
  59. // 遍历表格,根据过滤条件生成新表格。如果条件为真则收集,否则跳过。
  60. // };
  61. #func {fp.Filter} {
  62. #local table {%1};
  63. #local cond {%2};
  64. #local key {};
  65. #local value {};
  66. #replace {cond} {KEY} {\$key};
  67. #replace {cond} {VALUE} {\$value};
  68. #local newTable {};
  69. #local key {};
  70. #foreach {*table[]} {key} {
  71. #local value {$table[$key]};
  72. #local c {};
  73. #line sub {var;functions;escapes} #format c {%s} {$cond};
  74. #if { $c } {
  75. #cat newTable {{$key}{$value}};
  76. };
  77. };
  78. #return {$newTable};
  79. };
  80. ///=== {
  81. // #@ fp.FilterMap <表格> <条件表达式> <内容表达式>
  82. // 遍历表格,根据过滤条件生成新表格。如果条件为真则收集,否则跳过。
  83. // 收集的内容可以通过内容表达式重新生成。
  84. //
  85. ///// 上述函数中,条件表达式和内容表达式都可以通过 KEY 和 VALUE 关键字来指代表格项的 key 和 value。
  86. // };
  87. #func {fp.FilterMap} {
  88. #local table {%1};
  89. #local cond {%2};
  90. #local body {%3};
  91. #local key {};
  92. #local value {};
  93. #replace {cond} {KEY} {\$key};
  94. #replace {cond} {VALUE} {\$value};
  95. #replace {body} {KEY} {\$key};
  96. #replace {body} {VALUE} {\$value};
  97. #local newTable {};
  98. #local key {};
  99. #foreach {*table[]} {key} {
  100. #local value {$table[$key]};
  101. #local c {};
  102. #line sub {var;functions;escapes} #format c {%s} {$cond};
  103. #if { $c } {
  104. #line sub {var;functions;escapes} #format value {%s} {$body};
  105. #cat newTable {{$key}{$value}};
  106. };
  107. };
  108. #return {$newTable};
  109. };
  110. ///=== {
  111. // #@ fp.Transform <字符串列表> <内容表达式>
  112. // 遍历字符串列表,根据内容表达式重新生成新内容
  113. // };
  114. #func {fp.Transform} {
  115. #local strList {%1};
  116. #local body {%2};
  117. #local value {};
  118. #replace {body} {VALUE} {\$value};
  119. #local newStrList {};
  120. #foreach {$strList} {value} {
  121. #line sub {var;functions;escapes} #format value {%s} {$body};
  122. #cat newStrList {$value;};
  123. };
  124. #replace newStrList {;$} {};
  125. #return {$newStrList};
  126. };
  127. ///=== {
  128. // #@ fp.TransformIf <字符串列表> <条件表达式> <内容表达式>
  129. // 遍历字符串列表,对符合条件的项,根据内容表达式重新生成新内容,不符合条件的保留原值。
  130. // };
  131. #func {fp.TransformIf} {
  132. #local strList {%1};
  133. #local cond {%2};
  134. #local body {%3};
  135. #replace {cond} {VALUE} {\$value};
  136. #replace {body} {VALUE} {\$value};
  137. #local value {};
  138. #local newStrList {};
  139. #foreach {$strList} {value} {
  140. #local c {};
  141. #line sub {var;functions;escapes} #format c {%s} {$cond};
  142. #if { $c } {
  143. #line sub {var;functions;escapes} #format value {%s} {$body};
  144. };
  145. #cat newStrList {$value;};
  146. };
  147. #replace newStrList {;$} {};
  148. #return {$newStrList};
  149. };
  150. ///=== {
  151. // #@ fp.Select <字符串列表> <条件表达式>
  152. // 遍历字符串列表,根据过滤条件生成新字符串列表。如果条件为真则收集,否则跳过。
  153. // };
  154. #func {fp.Select} {
  155. #local strList {%1};
  156. #local cond {%2};
  157. #local value {};
  158. #replace {cond} {VALUE} {\$value};
  159. #local newStrList {};
  160. #local value {};
  161. #foreach {$strList} {value} {
  162. #local c {};
  163. #line sub {var;functions;escapes} #format c {%s} {$cond};
  164. #if { $c } {
  165. #cat newStrList {$value;};
  166. };
  167. };
  168. #replace newStrList {;$} {};
  169. #return {$newStrList};
  170. };
  171. ///=== {
  172. // #@ fp.SelectTransform <字符串列表> <条件表达式> <内容表达式>
  173. // 遍历字符串列表,根据过滤条件生成新字符串列表。如果条件为真则收集,否则跳过。
  174. // 收集的内容可以通过内容表达式重新生成。
  175. //
  176. ///// 上述函数中,条件表达式和内容表达式都可以通过 VALUE 关键字来指代字符串列表中的项。
  177. ///// 不难看出,上述四个函数与前面四个很像,只是针对字符串列表而不是表格。
  178. // };
  179. #func {fp.SelectTransform} {
  180. #local strList {%1};
  181. #local cond {%2};
  182. #local body {%3};
  183. #replace {cond} {VALUE} {\$value};
  184. #replace {body} {VALUE} {\$value};
  185. #local value {};
  186. #local newStrList {};
  187. #foreach {$strList} {value} {
  188. #local c {};
  189. #line sub {var;functions;escapes} #format c {%s} {$cond};
  190. #if { $c } {
  191. #line sub {var;functions;escapes} #format value {%s} {$body};
  192. #cat newStrList {$value;};
  193. };
  194. };
  195. #replace newStrList {;$} {};
  196. #return {$newStrList};
  197. };