\ProvidesFile{pgf-go-kernel-lua.sty}[2026/10/23 v0.2026.10.23 pgf-go: Lua compute kernel] \ExplSyntaxOn %KERNEL DE CALCULO EN Lua (kernel = lua). LA INTERFAZ ESTA DESCRIPTA EN pgf-go-kernel.sty. %EL CALCULO ESTA EN pgf-go.lua; ACA SOLO SE LE PASAN LAS ENTRADAS. \clist_gset:Nn \g_pgfgo_kernel_features_clist {captures, territory, sgf} %NOMBRE COMPLETO DEL ARCHIVO #2 DEL PAQUETE, EN #1: SE BUSCA JUNTO A pgf-go.sty Y, SI NO ESTA AHI, EN %EL PATH DE TeX CON kpse (INSTALADO, \file_full_name:n DEVUELVE EL NOMBRE SIN LA CARPETA Y dofile NO LO %ENCUENTRA). PRIMERO COMO tex, LA MISMA BUSQUEDA QUE ENCONTRO pgf-go.sty: COMO lua PUEDE APARECER OTRA %COPIA (POR EJ. CON TEXINPUTS). \cs_new_protected:Npn \__pgfgo_kernel_lua_find:Nn #1#2 { \tl_clear:N #1 \tl_if_empty:NF \c__pgfgo_path_tl {\tl_set:Ne #1 {\file_full_name:n {\c__pgfgo_path_tl / #2}}} \tl_if_empty:NT #1 { \tl_set:Ne #1 {\lua_now:e { tex.sprint(-2,~kpse.find_file("#2",~"tex")~or~kpse.find_file("#2",~"lua")~or~"#2") }} } } \tl_new:N \l__pgfgo_kernel_lua_file_tl \__pgfgo_kernel_lua_find:Nn \l__pgfgo_kernel_lua_file_tl {pgf-go.lua} \lua_now:e {pgfgo~=~dofile("\lua_escape:e {\l__pgfgo_kernel_lua_file_tl}")} %LAS TABLAS DE LAS CODIFICACIONES ASIATICAS: Lua LAS CARGA SOLO SI HACEN FALTA. \__pgfgo_kernel_lua_find:Nn \l__pgfgo_kernel_lua_file_tl {pgf-go-charsets.lua} \lua_now:e {pgfgo.charsets_file~=~"\lua_escape:e {\l__pgfgo_kernel_lua_file_tl}"} %UN BOOLEANO COMO ARGUMENTO DE Lua. \cs_new:Npn \__pgfgo_kernel_lua_bool:N #1 {\bool_if:NTF #1 {true} {false}} \cs_new:Npn \__pgfgo_kernel_lua_use_i: {\__pgfgo_kernel_lua_bool:N \l_pgfgo_use_i_bool} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %----------------------------------------TABLERO------------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %VENTANA PEDIDA CON partial, ANTES DE RECORTARLA AL TABLERO. SON REGISTROS DE TeX PARA QUE SEAN LOCALES. \int_new:N \l__pgfgo_kernel_window_from_x_int \int_new:N \l__pgfgo_kernel_window_from_y_int \int_new:N \l__pgfgo_kernel_window_to_x_int \int_new:N \l__pgfgo_kernel_window_to_y_int \cs_new_protected:Npn \pgfgo_kernel_board_size:n #1 { \lua_now:e {pgfgo.board_size("\lua_escape:e {#1}")} } \cs_new_protected:Npn \pgfgo_kernel_board_window:n #1 { \lua_now:e {pgfgo.board_window("\lua_escape:e {#1}", \__pgfgo_kernel_lua_use_i:)} } \cs_new_protected:Npn \pgfgo_kernel_board_init: { \lua_now:e {pgfgo.board_init(\__pgfgo_kernel_lua_bool:N \l_pgfgo_goban_partial_bool)} } \prg_new_protected_conditional:Npnn \pgfgo_kernel_if_visible:nn #1#2 {T, F, TF} { \bool_if:NT \l_pgfgo_goban_partial_auto_bool {\pgfgo_kernel_extent_add:nn {#1} {#2}} \lua_now:e {pgfgo.if_visible(\int_eval:n {#1}, \int_eval:n {#2})} } \cs_new:Npn \pgfgo_kernel_column_name:n #1 { \lua_now:e {pgfgo.column_name(\int_eval:n {#1}, \__pgfgo_kernel_lua_use_i:)} } \cs_new_protected:Npn \pgfgo_kernel_hoshi: { \lua_now:n {pgfgo.hoshi()} \seq_set_from_clist:NN \l_pgfgo_kernel_points_seq \l__pgfgo_kernel_points_clist } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %--------------------------------------COORDENADAS----------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Lua DEJA LAS INTERSECCIONES ACA, SEPARADAS POR COMAS. \clist_new:N \l__pgfgo_kernel_points_clist \cs_new_protected:Npn \pgfgo_kernel_points:n #1 { \lua_now:e {pgfgo.points("\lua_escape:e {#1}", \__pgfgo_kernel_lua_use_i:)} \seq_set_from_clist:NN \l_pgfgo_kernel_points_seq \l__pgfgo_kernel_points_clist } \cs_new_protected:Npn \pgfgo_kernel_moves:n #1 { \lua_now:e {pgfgo.moves("\lua_escape:e {#1}", \__pgfgo_kernel_lua_use_i:)} \seq_set_from_clist:NN \l_pgfgo_kernel_points_seq \l__pgfgo_kernel_points_clist } \prg_new_protected_conditional:Npnn \pgfgo_kernel_point:n #1 {TF} { \lua_now:e {pgfgo.point("\lua_escape:e {#1}", \__pgfgo_kernel_lua_use_i:)} } \cs_new_protected:Npn \pgfgo_kernel_polygon:n #1 { \lua_now:e {pgfgo.polygon("\lua_escape:e {#1}")} \seq_set_from_clist:NN \l_pgfgo_kernel_points_seq \l__pgfgo_kernel_points_clist } %Lua DEJA CADA CONTORNO ENTRE LLAVES, SEPARADOS POR COMAS. \clist_new:N \l__pgfgo_kernel_region_clist \cs_new_protected:Npn \pgfgo_kernel_region:n #1 { \lua_now:e {pgfgo.region("\lua_escape:e {#1}")} \seq_set_from_clist:NN \l_pgfgo_kernel_region_seq \l__pgfgo_kernel_region_clist } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %----------------------------------------JUGADAS------------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_new_protected:Npn \pgfgo_kernel_move_reset: {\lua_now:n {pgfgo.move_reset()}} \cs_new_protected:Npn \pgfgo_kernel_move_set_number:n #1 { \lua_now:e {pgfgo.move_set_number(\int_eval:n {#1})} } \cs_new_protected:Npn \pgfgo_kernel_move_set_player:n #1 { \lua_now:e {pgfgo.move_set_player("\lua_escape:e {#1}")} } \cs_new:Npn \pgfgo_kernel_move_number: {\lua_now:n {pgfgo.move_number()}} \prg_new_conditional:Npnn \pgfgo_kernel_move_if_black: {p, T, F, TF} { \int_compare:nNnTF {\lua_now:n {pgfgo.move_if_black()}} = {1} {\prg_return_true:} {\prg_return_false:} } %Lua DEJA LAS PIEDRAS CAPTURADAS ACA, SEPARADAS POR COMAS. \clist_new:N \l__pgfgo_kernel_captured_clist \cs_new_protected:Npn \pgfgo_kernel_move_play:nn #1#2 { \lua_now:e {pgfgo.move_play("\lua_escape:e {#1}", "\lua_escape:e {#2}")} \seq_set_from_clist:NN \l_pgfgo_kernel_captured_seq \l__pgfgo_kernel_captured_clist } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %----------------------------------------CAPTURAS-----------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_new_protected:Npn \pgfgo_kernel_board_clear: {\lua_now:n {pgfgo.board_clear()}} \cs_new_protected:Npn \pgfgo_kernel_board_put:nnn #1#2#3 { \lua_now:e {pgfgo.board_put("\lua_escape:e {#1}", "\lua_escape:e {#2}", "\lua_escape:e {#3}")} } \cs_new_protected:Npn \pgfgo_kernel_board_save:n #1 { \lua_now:e {pgfgo.board_save("\lua_escape:e {#1}")} } \cs_new_protected:Npn \pgfgo_kernel_board_restore:n #1 { \lua_now:e {pgfgo.board_restore("\lua_escape:e {#1}")} } \cs_new:Npn \pgfgo_kernel_prisoners:n #1 { \lua_now:e {pgfgo.prisoners("\lua_escape:e {#1}")} } \prg_new_protected_conditional:Npnn \pgfgo_kernel_board_if_occupied:nn #1#2 {T, F, TF} { \lua_now:e {pgfgo.board_if_occupied("\lua_escape:e {#1}", "\lua_escape:e {#2}")} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %---------------------------------------TERRITORIO----------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \clist_new:N \l__pgfgo_kernel_territory_clist \cs_new_protected:Npn \pgfgo_kernel_territory:n #1 { \lua_now:e {pgfgo.territory("\lua_escape:e {#1}")} \seq_set_from_clist:NN \l_pgfgo_kernel_territory_seq \l__pgfgo_kernel_territory_clist } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %------------------------------------------SGF--------------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \clist_new:N \l__pgfgo_kernel_sgf_black_clist \clist_new:N \l__pgfgo_kernel_sgf_white_clist \clist_new:N \l__pgfgo_kernel_sgf_moves_clist %EL NOMBRE DE UN ARCHIVO SGF PARA Lua. \text_expand:n DEJA \& \# \% \$ \{ \} SIN EXPANDIR (\$ COMO %\protect \$); pgf-go.lua LES SACA LA BARRA. %UN NOMBRE DEFINIDO CON \pgfgo_kernel_sgf_define:nn ES SU ARCHIVO, YA PREPARADO PARA Lua. EL NOMBRE SE %BUSCA YA EXPANDIDO: PUEDE LLEGAR EN UNA VARIABLE (\sgfproblem, sgf view). \prop_new:N \g__pgfgo_kernel_lua_sgf_names_prop \cs_new:Npn \__pgfgo_kernel_lua_file:n #1 {\__pgfgo_kernel_lua_name:e {\text_expand:n {#1}}} \cs_new:Npn \__pgfgo_kernel_lua_name:n #1 { \prop_if_in:NnTF \g__pgfgo_kernel_lua_sgf_names_prop {#1} {\prop_item:Nn \g__pgfgo_kernel_lua_sgf_names_prop {#1}} {\lua_escape:n {#1}} } \cs_generate_variant:Nn \__pgfgo_kernel_lua_name:n {e} \cs_new_protected:Npn \pgfgo_kernel_sgf_define:nn #1#2 { \prop_gput:Nee \g__pgfgo_kernel_lua_sgf_names_prop {\text_expand:n {#1}} {\lua_escape:e {\text_expand:n {#2}}} } \cs_generate_variant:Nn \prop_gput:Nnn {Nee} \cs_new_protected:Npn \pgfgo_kernel_sgf_read:n #1 {\pgfgo_kernel_sgf_read:nn {#1} {}} \cs_new_protected:Npn \pgfgo_kernel_sgf_read:nn #1#2 { \lua_now:e {pgfgo.sgf_read("\__pgfgo_kernel_lua_file:n {#1}", "\lua_escape:e {#2}", \__pgfgo_kernel_lua_use_i:)} \seq_set_from_clist:NN \l_pgfgo_kernel_sgf_black_seq \l__pgfgo_kernel_sgf_black_clist \seq_set_from_clist:NN \l_pgfgo_kernel_sgf_white_seq \l__pgfgo_kernel_sgf_white_clist \seq_set_from_clist:NN \l_pgfgo_kernel_sgf_moves_seq \l__pgfgo_kernel_sgf_moves_clist \seq_set_from_clist:NN \l_pgfgo_kernel_sgf_figures_seq \l__pgfgo_kernel_sgf_figures_clist } \clist_new:N \l__pgfgo_kernel_sgf_figures_clist \clist_new:N \l__pgfgo_kernel_sgf_variations_clist \cs_new_protected:Npn \pgfgo_kernel_sgf_variations:nn #1#2 { \lua_now:e {pgfgo.sgf_variations(\int_eval:n {#1}, "\lua_escape:e {#2}")} \seq_set_from_clist:NN \l_pgfgo_kernel_sgf_variations_seq \l__pgfgo_kernel_sgf_variations_clist } \cs_new:Npn \pgfgo_kernel_sgf_comment:nn #1#2 { \lua_now:e {pgfgo.sgf_comment(\int_eval:n {#1}, #2)} } \clist_new:N \l__pgfgo_kernel_sgf_marks_clist \cs_new_protected:Npn \pgfgo_kernel_sgf_marks:n #1 { \lua_now:e {pgfgo.sgf_marks(\int_eval:n {#1})} \seq_set_from_clist:NN \l_pgfgo_kernel_sgf_marks_seq \l__pgfgo_kernel_sgf_marks_clist } \clist_new:N \l__pgfgo_kernel_sgf_lines_clist \cs_new_protected:Npn \pgfgo_kernel_sgf_lines:n #1 { \lua_now:e {pgfgo.sgf_lines(\int_eval:n {#1})} \seq_set_from_clist:NN \l_pgfgo_kernel_sgf_lines_seq \l__pgfgo_kernel_sgf_lines_clist } \clist_new:N \l__pgfgo_kernel_sgf_annotations_clist \cs_new_protected:Npn \pgfgo_kernel_sgf_annotations:n #1 { \lua_now:e {pgfgo.sgf_annotations(\int_eval:n {#1})} \seq_set_from_clist:NN \l_pgfgo_kernel_sgf_annotations_seq \l__pgfgo_kernel_sgf_annotations_clist } \cs_new:Npn \pgfgo_kernel_sgf_name:n #1 { \lua_now:e {pgfgo.sgf_name(\int_eval:n {#1})} } \cs_new:Npn \pgfgo_kernel_sgf_label:n #1 { \lua_now:e {pgfgo.sgf_label(\int_eval:n {#1})} } \cs_new_protected:Npn \pgfgo_kernel_sgf_glyphs:n #1 { \lua_now:e {pgfgo.sgf_glyphs("\lua_escape:e {#1}")} } \cs_new:Npn \pgfgo_kernel_sgf_move_info:nnnn #1#2#3#4 { \lua_now:e { pgfgo.sgf_move_info("\__pgfgo_kernel_lua_file:n {#1}", "\lua_escape:e {#2}", \__pgfgo_kernel_lua_use_i:, \int_eval:n {#3}, "\lua_escape:e {#4}") } } \cs_new:Npn \pgfgo_kernel_sgf_info:nn #1#2 { \lua_now:e {pgfgo.sgf_info("\__pgfgo_kernel_lua_file:n {#1}", "\lua_escape:e {#2}")} } \cs_new_protected:Npn \pgfgo_kernel_sgf_view:nn #1#2 { \lua_now:e {pgfgo.sgf_view(\int_eval:n {#1}, \int_eval:n {#2})} } \clist_new:N \l__pgfgo_kernel_sgf_paths_clist \cs_new_protected:Npn \pgfgo_kernel_sgf_tree:n #1 { \lua_now:e {pgfgo.sgf_tree("\__pgfgo_kernel_lua_file:n {#1}")} \seq_set_from_clist:NN \l_pgfgo_kernel_sgf_paths_seq \l__pgfgo_kernel_sgf_paths_clist } \cs_new_protected:Npn \pgfgo_kernel_sgf_extent:nn #1#2 { \lua_now:e {pgfgo.sgf_extent("\__pgfgo_kernel_lua_file:n {#1}", "\lua_escape:e {#2}", \__pgfgo_kernel_lua_use_i:)} } \clist_new:N \l__pgfgo_kernel_sgf_branches_clist \seq_new:N \l_pgfgo_kernel_sgf_branches_seq \cs_new_protected:Npn \pgfgo_kernel_sgf_path:nn #1#2 { \lua_now:e {pgfgo.sgf_path("\__pgfgo_kernel_lua_file:n {#1}", "\lua_escape:e {#2}", \__pgfgo_kernel_lua_use_i:)} } \cs_new_protected:Npn \pgfgo_kernel_sgf_branches:nn #1#2 { \lua_now:e {pgfgo.sgf_branches("\__pgfgo_kernel_lua_file:n {#1}", "\lua_escape:e {#2}", \__pgfgo_kernel_lua_use_i:)} \seq_set_from_clist:NN \l_pgfgo_kernel_sgf_branches_seq \l__pgfgo_kernel_sgf_branches_clist } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %---------------------------------SECUENCIAS DE MARCAS------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_new_protected:Npn \pgfgo_kernel_sequence_reset:n #1 { \lua_now:e {pgfgo.sequence_reset(\int_eval:n {#1})} } \cs_new:Npn \pgfgo_kernel_sequence_number: {\lua_now:n {pgfgo.sequence_number()}} \cs_new_protected:Npn \pgfgo_kernel_sequence_step: {\lua_now:n {pgfgo.sequence_step()}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %----------------------------------------MEMORIA------------------------------------------------% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Lua GUARDA LOS TOKENS DEL GRUPO QUE SIGUE A \lua_now:e. \cs_new_protected:Npn \__pgfgo_kernel_lua_push:nn #1#2 {\lua_now:e {pgfgo.remember_push("\lua_escape:e {#1}")} {#2}} \cs_generate_variant:Nn \__pgfgo_kernel_lua_push:nn {ne} \cs_new_protected:Npn \pgfgo_kernel_remember_push:nn #1#2 {\__pgfgo_kernel_lua_push:ne {#1} {#2}} \cs_new_protected:Npn \pgfgo_kernel_remember_clear:n #1 { \lua_now:e {pgfgo.remember_clear("\lua_escape:e {#1}")} } \cs_new_protected:Npn \pgfgo_kernel_remember_replay:n #1 { \lua_now:e {pgfgo.remember_replay("\lua_escape:e {#1}")} } \cs_new_protected:Npn \pgfgo_kernel_remember_append:nn #1#2 { \lua_now:e {pgfgo.remember_append("\lua_escape:e {#1}", "\lua_escape:e {#2}")} } %Lua DEJA A CONTINUACION \tl_set:Nn #2 {}. \cs_new_protected:Npn \pgfgo_kernel_remember_get:nN #1#2 { \lua_now:e {pgfgo.remember_get("\lua_escape:e {#1}", "\lua_escape:e {\cs_to_str:N #2}")} } \ExplSyntaxOff