summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2024-01-15 21:00:21 +0000
committerKarl Berry <karl@freefriends.org>2024-01-15 21:00:21 +0000
commitda17258f17d6073755f72333739dc4d098163907 (patch)
treedc9bd996027b187bced3dcae3c6ccf3cc06debaa /Master/texmf-dist/tex
parent3fb6cf2313253dab16594f39926cdc309231b4a6 (diff)
piton (15jan24)
git-svn-id: svn://tug.org/texlive/trunk@69437 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r--Master/texmf-dist/tex/lualatex/piton/piton.lua209
-rw-r--r--Master/texmf-dist/tex/lualatex/piton/piton.sty133
2 files changed, 304 insertions, 38 deletions
diff --git a/Master/texmf-dist/tex/lualatex/piton/piton.lua b/Master/texmf-dist/tex/lualatex/piton/piton.lua
index 5ce6ce746d1..374515eb39c 100644
--- a/Master/texmf-dist/tex/lualatex/piton/piton.lua
+++ b/Master/texmf-dist/tex/lualatex/piton/piton.lua
@@ -5,7 +5,7 @@
-- The original source files were:
--
-- piton.dtx (with options: `LUA')
--- -------------------------------------------
+-- ---------------------------------------------
-- Copyright (C) 2022-2024 by F. Pantigny
--
-- This file may be distributed and/or modified under the
@@ -20,7 +20,7 @@
-- -------------------------------------------
--
-- This file is part of the LuaLaTeX package 'piton'.
--- Version 2.3 of 2024/01/06
+-- Version 2.4 of 2024/01/15
if piton.comment_latex == nil then piton.comment_latex = ">" end
@@ -337,6 +337,17 @@ then
* K ( 'ParseAgain.noCR' , balanced_braces )
* L ( P "}" )
end
+DetectedCommands =
+ Ct ( Cc "Open"
+ * C (
+ piton.ListCommands
+ * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
+ * P "{"
+ )
+ * Cc "}"
+ )
+ * ( C ( balanced_braces ) / (function (s) return MainLoopPython:match(s) end ) )
+ * P "}" * Ct ( Cc "Close" )
local PromptHastyDetection = ( # ( P ">>>" + P "..." ) * Lc ( '\\__piton_prompt:' ) ) ^ -1
local Prompt = K ( 'Prompt' , ( ( P ">>>" + P "..." ) * P " " ^ -1 ) ^ -1 )
local EOL =
@@ -480,6 +491,7 @@ local MainPython =
+ Escape + EscapeMath
+ CommentLaTeX
+ Beamer
+ + DetectedCommands
+ LongString
+ Comment
+ ExceptionInConsole
@@ -666,6 +678,17 @@ then
* K ( 'ParseAgain.noCR' , balanced_braces )
* L ( P "}" )
end
+DetectedCommands =
+ Ct ( Cc "Open"
+ * C (
+ piton.ListCommands
+ * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
+ * P "{"
+ )
+ * Cc "}"
+ )
+ * ( C ( balanced_braces ) / (function (s) return MainLoopOCaml:match(s) end ) )
+ * P "}" * Ct ( Cc "Close" )
local EOL =
P "\r"
*
@@ -814,6 +837,7 @@ MainOCaml =
+ Tab
+ Escape + EscapeMath
+ Beamer
+ + DetectedCommands
+ TypeParameter
+ String + QuotedString + Char
+ Comment
@@ -969,6 +993,17 @@ then
* K ( 'ParseAgain.noCR' , balanced_braces )
* L ( P "}" )
end
+DetectedCommands =
+ Ct ( Cc "Open"
+ * C (
+ piton.ListCommands
+ * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
+ * P "{"
+ )
+ * Cc "}"
+ )
+ * ( C ( balanced_braces ) / (function (s) return MainLoopC:match(s) end ) )
+ * P "}" * Ct ( Cc "Close" )
local EOL =
P "\r"
*
@@ -1020,6 +1055,7 @@ local MainC =
+ Escape + EscapeMath
+ CommentLaTeX
+ Beamer
+ + DetectedCommands
+ Preproc
+ Comment + LongComment
+ Delim
@@ -1158,6 +1194,17 @@ then
* K ( 'ParseAgain.noCR' , balanced_braces )
* L ( P "}" )
end
+DetectedCommands =
+ Ct ( Cc "Open"
+ * C (
+ piton.ListCommands
+ * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
+ * P "{"
+ )
+ * Cc "}"
+ )
+ * ( C ( balanced_braces ) / (function (s) return MainLoopSQL:match(s) end ) )
+ * P "}" * Ct ( Cc "Close" )
local EOL =
P "\r"
*
@@ -1253,6 +1300,7 @@ local MainSQL =
+ Escape + EscapeMath
+ CommentLaTeX
+ Beamer
+ + DetectedCommands
+ Comment + LongComment
+ Delim
+ Operator
@@ -1277,6 +1325,163 @@ languageSQL =
* Lc '\\__piton_end_line:'
)
languages['sql'] = languageSQL
+local CommentMath =
+ P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$"
+
+local Comment =
+ WithStyle ( 'Comment' ,
+ Q ( P "#" )
+ * ( CommentMath + Q ( ( 1 - S "$\r" ) ^ 1 ) ) ^ 0 )
+ * ( EOL + -1 )
+
+local String =
+ WithStyle ( 'String.Short' ,
+ Q "\""
+ * ( VisualSpace
+ + Q ( ( P "\\\"" + 1 - S " \"" ) ^ 1 )
+ ) ^ 0
+ * Q "\""
+ )
+
+local balanced_braces =
+ P { "E" ,
+ E =
+ (
+ P "{" * V "E" * P "}"
+ +
+ String
+ +
+ ( 1 - S "{}" )
+ ) ^ 0
+ }
+
+if piton_beamer
+then
+ Beamer =
+ L ( P "\\pause" * ( P "[" * ( 1 - P "]" ) ^ 0 * P "]" ) ^ -1 )
+ +
+ Ct ( Cc "Open"
+ * C (
+ (
+ P "\\uncover" + P "\\only" + P "\\alert" + P "\\visible"
+ + P "\\invisible" + P "\\action"
+ )
+ * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
+ * P "{"
+ )
+ * Cc "}"
+ )
+ * ( C ( balanced_braces ) / (function (s) return MainLoopMinimal:match(s) end ) )
+ * P "}" * Ct ( Cc "Close" )
+ + OneBeamerEnvironment ( "uncoverenv" , MainLoopMinimal )
+ + OneBeamerEnvironment ( "onlyenv" , MainLoopMinimal )
+ + OneBeamerEnvironment ( "visibleenv" , MainLoopMinimal )
+ + OneBeamerEnvironment ( "invisibleenv" , MainLoopMinimal )
+ + OneBeamerEnvironment ( "alertenv" , MainLoopMinimal )
+ + OneBeamerEnvironment ( "actionenv" , MainLoopMinimal )
+ +
+ L (
+ ( P "\\alt" )
+ * P "<" * (1 - P ">") ^ 0 * P ">"
+ * P "{"
+ )
+ * K ( 'ParseAgain.noCR' , balanced_braces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , balanced_braces )
+ * L ( P "}" )
+ +
+ L (
+ ( P "\\temporal" )
+ * P "<" * (1 - P ">") ^ 0 * P ">"
+ * P "{"
+ )
+ * K ( 'ParseAgain.noCR' , balanced_braces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , balanced_braces )
+ * L ( P "}{" )
+ * K ( 'ParseAgain.noCR' , balanced_braces )
+ * L ( P "}" )
+end
+
+DetectedCommands =
+ Ct ( Cc "Open"
+ * C (
+ piton.ListCommands
+ * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1
+ * P "{"
+ )
+ * Cc "}"
+ )
+ * ( C ( balanced_braces ) / (function (s) return MainLoopMinimal:match(s) end ) )
+ * P "}" * Ct ( Cc "Close" )
+
+local EOL =
+ P "\r"
+ *
+ (
+ ( space^0 * -1 )
+ +
+ Ct (
+ Cc "EOL"
+ *
+ Ct (
+ Lc "\\__piton_end_line:"
+ * BeamerEndEnvironments
+ * BeamerBeginEnvironments
+ * Lc "\\__piton_newline: \\__piton_begin_line:"
+ )
+ )
+ )
+ *
+ SpaceIndentation ^ 0
+
+local CommentMath =
+ P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$" -- $
+
+local CommentLaTeX =
+ P(piton.comment_latex)
+ * Lc "{\\PitonStyle{Comment.LaTeX}{\\ignorespaces"
+ * L ( ( 1 - P "\r" ) ^ 0 )
+ * Lc "}}"
+ * ( EOL + -1 )
+
+local identifier = letter * alphanum ^ 0
+
+local Identifier = K ( 'Identifier' , identifier )
+
+local MainMinimal =
+ EOL
+ + Space
+ + Tab
+ + Escape + EscapeMath
+ + CommentLaTeX
+ + Beamer
+ + DetectedCommands
+ + Comment
+ + Delim
+ + String
+ + Punct
+ + Identifier
+ + Number
+ + Word
+
+MainLoopMinimal =
+ ( ( space^1 * -1 )
+ + MainMinimal
+ ) ^ 0
+
+languageMinimal =
+ Ct (
+ ( ( space - P "\r" ) ^ 0 * P "\r" ) ^ -1
+ * BeamerBeginEnvironments
+ * Lc '\\__piton_begin_line:'
+ * SpaceIndentation ^ 0
+ * MainLoopMinimal
+ * -1
+ * Lc '\\__piton_end_line:'
+ )
+languages['minimal'] = languageMinimal
+
function piton.Parse(language,code)
local t = languages[language] : match ( code )
if t == nil
diff --git a/Master/texmf-dist/tex/lualatex/piton/piton.sty b/Master/texmf-dist/tex/lualatex/piton/piton.sty
index 6f450b6405b..06ca2a403da 100644
--- a/Master/texmf-dist/tex/lualatex/piton/piton.sty
+++ b/Master/texmf-dist/tex/lualatex/piton/piton.sty
@@ -19,8 +19,8 @@
%% LaTeX version 2005/12/01 or later.
%% -------------------------------------------
%%
-\def\PitonFileVersion{2.3}
-\def\PitonFileDate{2024/01/06}
+\def\PitonFileVersion{2.4}
+\def\PitonFileDate{2024/01/15}
\NeedsTeXFormat{LaTeX2e}
@@ -37,6 +37,14 @@
\cs_new_protected:Npn \__piton_fatal:n { \msg_fatal:nn { piton } }
\cs_new_protected:Npn \__piton_fatal:nn { \msg_fatal:nnn { piton } }
\cs_new_protected:Npn \__piton_msg_new:nn { \msg_new:nnn { piton } }
+\cs_new_protected:Npn \__piton_msg_new:nnn { \msg_new:nnnn { piton } }
+\cs_new_protected:Npn \__piton_gredirect_none:n #1
+ {
+ \group_begin:
+ \globaldefs = 1
+ \msg_redirect_name:nnn { piton } { #1 } { none }
+ \group_end:
+ }
\__piton_msg_new:nn { LuaLaTeX~mandatory }
{
LuaLaTeX~is~mandatory.\\
@@ -47,10 +55,16 @@
}
\sys_if_engine_luatex:F { \msg_critical:nn { piton } { LuaLaTeX~mandatory } }
\RequirePackage { luatexbase }
-\__piton_msg_new:nn { piton.lua~not~found }
+\__piton_msg_new:nnn { piton.lua~not~found }
{
The~file~'piton.lua'~can't~be~found.\\
- The~package~'piton'~won't~be~loaded.
+ The~package~'piton'~won't~be~loaded.\\
+ If~you~want~to~know~how~to~retrieve~the~file~'piton.lua',~type~H~<return>.
+ }
+ {
+ On~the~site~CTAN,~go~to~the~page~of~'piton':~https://ctan.org/pkg/piton.~
+ The~file~'README.md'~explains~how~to~retrieve~the~files~'piton.sty'~and~
+ 'piton.lua'.
}
\file_if_exist:nF { piton.lua }
{ \msg_critical:nn { piton } { piton.lua~not~found } }
@@ -143,13 +157,16 @@
\bool_gset_true:N \g__piton_footnote_bool
}
}
-\lua_now:n { piton = piton~or { } }
-\str_new:N \l__piton_language_str
-\str_set:Nn \l__piton_language_str { python }
+\lua_now:n
+ {
+ piton = piton~or { }
+ piton.ListCommands = lpeg.P ( false )
+ }
+\str_new:N \l_piton_language_str
+\str_set:Nn \l_piton_language_str { python }
\str_new:N \l__piton_path_str
\bool_new:N \l__piton_in_PitonOptions_bool
\bool_new:N \l__piton_in_PitonInputFile_bool
-\bool_new:N \g__piton_in_document_bool
\int_new:N \l__piton_nb_lines_int
\int_new:N \l__piton_nb_non_empty_lines_int
\int_new:N \g__piton_line_int
@@ -467,6 +484,9 @@
}
\keys_define:nn { PitonOptions }
{
+ detected-commands .code:n = \__piton_detected_commands:n { #1 } ,
+ detected-commands .value_required:n = true ,
+ detected-commands .usage:n = preamble ,
begin-escape .code:n =
\lua_now:e { piton.begin_escape = "\lua_escape:n{#1}" } ,
begin-escape .value_required:n = true ,
@@ -495,7 +515,7 @@
math-comments .default:n = true ,
math-comments .usage:n = preamble ,
language .code:n =
- \str_set:Nx \l__piton_language_str { \str_lowercase:n { #1 } } ,
+ \str_set:Nx \l_piton_language_str { \str_lowercase:n { #1 } } ,
language .value_required:n = true ,
path .str_set:N = \l__piton_path_str ,
path .value_required:n = true ,
@@ -626,8 +646,6 @@
}
\NewDocumentCommand \__piton_fake_PitonOptions { }
{ \keys_set:nn { PitonOptions } }
-\hook_gput_code:nnn { begindocument } { . }
- { \bool_gset_true:N \g__piton_in_document_bool }
\int_new:N \g__piton_visual_line_int
\cs_new_protected:Npn \__piton_print_number:
{
@@ -681,7 +699,7 @@
\tl_set:Nx \l_tmpa_tl
{
\lua_now:e
- { piton.ParseBis('\l__piton_language_str',token.scan_string()) }
+ { piton.ParseBis('\l_piton_language_str',token.scan_string()) }
{ #1 }
}
\bool_if:NTF \l__piton_show_spaces_bool
@@ -703,7 +721,7 @@
\tl_set:Nx \l_tmpa_tl
{
\lua_now:e
- { piton.Parse('\l__piton_language_str',token.scan_string()) }
+ { piton.Parse('\l_piton_language_str',token.scan_string()) }
{ #1 }
}
\bool_if:NT \l__piton_show_spaces_bool
@@ -724,7 +742,7 @@
\tl_set:Nx \l_tmpa_tl
{
\lua_now:e
- { piton.ParseTer('\l__piton_language_str',token.scan_string()) }
+ { piton.ParseTer('\l_piton_language_str',token.scan_string()) }
{ #1 }
}
}
@@ -732,7 +750,7 @@
\tl_set:Nx \l_tmpa_tl
{
\lua_now:e
- { piton.Parse('\l__piton_language_str',token.scan_string()) }
+ { piton.Parse('\l_piton_language_str',token.scan_string()) }
{ #1 }
}
}
@@ -755,7 +773,7 @@
\tl_set:Nx \l_tmpa_tl
{
\lua_now:e
- { piton.ParseTer('\l__piton_language_str',token.scan_string()) }
+ { piton.ParseTer('\l_piton_language_str',token.scan_string()) }
{ #1 }
}
}
@@ -763,7 +781,7 @@
\tl_set:Nx \l_tmpa_tl
{
\lua_now:e
- { piton.Parse('\l__piton_language_str',token.scan_string()) }
+ { piton.Parse('\l_piton_language_str',token.scan_string()) }
{ #1 }
}
}
@@ -871,7 +889,7 @@
{
piton.GobbleParse
(
- '\l__piton_language_str' ,
+ '\l_piton_language_str' ,
\int_use:N \l__piton_gobble_int ,
token.scan_argument()
)
@@ -923,10 +941,9 @@
{ \str_set:Nn \l__piton_file_name_str { #3 } }
{
\str_set_eq:NN \l__piton_file_name_str \l__piton_path_str
- \str_put_right:Nn \l__piton_file_name_str { / }
- \str_put_right:Nn \l__piton_file_name_str { #3 }
+ \str_put_right:Nn \l__piton_file_name_str { / #3 }
}
- \exp_args:NV \file_if_exist:nTF \l__piton_file_name_str
+ \file_if_exist:nTF { \l__piton_file_name_str }
{ \__piton_input_file:nn { #1 } { #2 } }
{ \msg_error:nnn { piton } { Unknown~file } { #3 } }
\group_end:
@@ -993,7 +1010,7 @@
\lua_now:e
{
piton.ParseFile(
- '\l__piton_language_str' ,
+ '\l_piton_language_str' ,
'\l__piton_file_name_str' ,
\int_use:N \l__piton_first_line_int ,
\int_use:N \l__piton_last_line_int )
@@ -1020,14 +1037,14 @@
}
\NewDocumentCommand { \PitonStyle } { m }
{
- \cs_if_exist_use:cF { pitonStyle _ \l__piton_language_str _ #1 }
+ \cs_if_exist_use:cF { pitonStyle _ \l_piton_language_str _ #1 }
{ \use:c { pitonStyle _ #1 } }
}
\NewDocumentCommand { \SetPitonStyle } { O { } m }
{
\str_set:Nx \l__piton_SetPitonStyle_option_str { \str_lowercase:n { #1 } }
\str_if_eq:onT \l__piton_SetPitonStyle_option_str { current-language }
- { \str_set_eq:NN \l__piton_SetPitonStyle_option_str \l__piton_language_str }
+ { \str_set_eq:NN \l__piton_SetPitonStyle_option_str \l_piton_language_str }
\keys_set:nn { piton / Styles } { #2 }
\str_clear:N \l__piton_SetPitonStyle_option_str
}
@@ -1139,8 +1156,28 @@
ParseAgain = \__piton_piton:n ,
}
\bool_if:NT \g__piton_math_comments_bool { \SetPitonStyle { Comment.Math } }
+\NewDocumentCommand { \SetPitonIdentifier } { o m m }
+ {
+ \clist_set:Nn \l_tmpa_clist { #2 }
+ \IfNoValueTF { #1 }
+ {
+ \clist_map_inline:Nn \l_tmpa_clist
+ { \cs_set:cpn { pitonIdentifier _ ##1 } { #3 } }
+ }
+ {
+ \str_set:Nx \l_tmpa_str { \str_lowercase:n { #1 } }
+ \str_if_eq:onT \l_tmpa_str { current-language }
+ { \str_set_eq:NN \l_tmpa_str \l_piton_language_str }
+ \clist_map_inline:Nn \l_tmpa_clist
+ { \cs_set:cpn { pitonIdentifier _ \l_tmpa_str _ ##1 } { #3 } }
+ }
+ }
\cs_new_protected:Npn \__piton_identifier:n #1
- { \cs_if_exist_use:c { PitonIdentifier _ \l__piton_language_str _ #1 } { #1 } }
+ {
+ \cs_if_exist_use:cF { pitonIdentifier _ \l_piton_language_str _ #1 }
+ { \cs_if_exist_use:c { pitonIdentifier_ #1 } }
+ { #1 }
+ }
\keys_define:nn { PitonOptions }
{ identifiers .code:n = \__piton_set_identifiers:n { #1 } }
\keys_define:nn { Piton / identifiers }
@@ -1150,26 +1187,28 @@
}
\cs_new_protected:Npn \__piton_set_identifiers:n #1
{
+ \__piton_error:n { key~identifiers~deprecated }
+ \__piton_gredirect_none:n { key~identifiers~deprecated }
\clist_clear_new:N \l__piton_identifiers_names_tl
\tl_clear_new:N \l__piton_style_tl
\keys_set:nn { Piton / identifiers } { #1 }
\clist_map_inline:Nn \l__piton_identifiers_names_tl
{
\tl_set_eq:cN
- { PitonIdentifier _ \l__piton_language_str _ ##1 }
+ { PitonIdentifier _ \l_piton_language_str _ ##1 }
\l__piton_style_tl
}
}
\cs_new_protected:cpn { pitonStyle _ Name.Function.Internal } #1
{
{ \PitonStyle { Name.Function } { #1 } }
- \cs_gset_protected:cpn { PitonIdentifier _ \l__piton_language_str _ #1 }
+ \cs_gset_protected:cpn { PitonIdentifier _ \l_piton_language_str _ #1 }
{ \PitonStyle { UserFunction } }
- \seq_if_exist:cF { g__piton_functions _ \l__piton_language_str _ seq }
- { \seq_new:c { g__piton_functions _ \l__piton_language_str _ seq } }
- \seq_gput_right:cn { g__piton_functions _ \l__piton_language_str _ seq } { #1 }
- \seq_if_in:NVF \g__piton_languages_seq \l__piton_language_str
- { \seq_gput_left:NV \g__piton_languages_seq \l__piton_language_str }
+ \seq_if_exist:cF { g__piton_functions _ \l_piton_language_str _ seq }
+ { \seq_new:c { g__piton_functions _ \l_piton_language_str _ seq } }
+ \seq_gput_right:cn { g__piton_functions _ \l_piton_language_str _ seq } { #1 }
+ \seq_if_in:NVF \g__piton_languages_seq \l_piton_language_str
+ { \seq_gput_left:NV \g__piton_languages_seq \l_piton_language_str }
}
\NewDocumentCommand \PitonClearUserFunctions { ! o }
{
@@ -1215,6 +1254,13 @@
\token_to_str:N \piton\ but~there~is~no~environment~
{piton}.~This~error~is~fatal.
}
+\__piton_msg_new:nn { key~identifiers~deprecated }
+ {
+ The~key~'identifiers'~in~the~command~\token_to_str:N PitonOptions\
+ is~now~deprecated:~you~should~use~the~command~
+ \token_to_str:N \SetPitonIdentifier\ instead.\\
+ However,~you~can~go~on.
+ }
\__piton_msg_new:nn { Unknown~key~for~SetPitonStyle }
{
The~style~'\l_keys_key_str'~is~unknown.\\
@@ -1255,7 +1301,7 @@
}
\__piton_msg_new:nn { syntax~error }
{
- Your~code~\l__piton_language_str\ is~not~syntactically~correct.\\
+ Your~code~\l_piton_language_str\ is~not~syntactically~correct.\\
It~won't~be~printed~in~the~PDF~file.
}
\NewDocumentCommand \PitonSyntaxError { }
@@ -1301,11 +1347,11 @@
break-lines-in-Piton,~
continuation-symbol,~
continuation-symbol-on-indentation,~
+ detected-commands,~
end-of-broken-line,~
end-range,~
env-gobble,~
gobble,~
- identifiers,~
indent-broken-lines,~
language,~
left-margin,~
@@ -1343,10 +1389,25 @@
in~Beamer.\\
If~you~go~on,~that~argument~will~be~ignored.
}
-\__piton_msg_new:nn { Python~error }
- { A~Python~error~has~been~detected. }
\hook_gput_code:nnn { begindocument } { . }
{ \lua_now:e { require("piton.lua") } }
+\cs_new_protected:Npn \__piton_detected_commands:n #1
+ { \lua_now:n { piton.addListCommands('#1') } }
+\ExplSyntaxOff
+\directlua
+ {
+ lpeg.locale(lpeg)
+ local P , alpha , C , Cf, space = lpeg.P , lpeg.alpha , lpeg.C , lpeg.Cf , lpeg.space
+ local One_P = space ^ 0
+ * C ( alpha ^ 1 ) / ( function (s) return P ( string.char(92) .. s ) end )
+ * space ^ 0
+ function piton.addListCommands( key_value )
+ piton.ListCommands =
+ piton.ListCommands +
+ Cf ( One_P * ( P "," * One_P ) ^ 0 ,
+ ( function (s,t) return s + t end ) ) : match ( key_value )
+ end
+ }
\endinput
%%