<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">%% CONCAT : string -&gt; string -&gt; string
%% (\concat str1 str2) =&gt; str1 ++ str2
\@lisp@env@add@global\concat{\@tlabel@func{\@lisp@func@check@args{+}{\def\@temp@str{}\@str@concat}}}
\def\@str@concat#1#2#3{%
	\let\@@next@str\relax
	\ifx#2\@tlabel@string
    	\expandafter\def
    	\expandafter\@temp@str
    	\expandafter{\@temp@str#3}%
    	\let\@@next@str\@str@concat
  	\else\ifx#2\relax
  		\let\@@next@str\@str@fin
  	\else
  		\errmessage{LISP on TeX [function --- concat]:%
  			 Arguments of concat must be strings}%
  	\fi\fi\@@next@str#1}
\def\@str@fin#1{%
	\expandafter\gdef\expandafter#1%
	\expandafter{\expandafter\@tlabel@string\expandafter{\@temp@str}}}

%% INT2STRING : int -&gt; string
%% (\intTOstring i) -&gt; 'i'
\@lisp@env@add@global\intTOstring{\@tlabel@func{\@lisp@func@check@args{1}{\@conv@intTOstr}}}
\def\@conv@intTOstr#1\@tlabel@int#2{\gdef#1{\@tlabel@string{#2}}}

%% STRING2INT : string -&gt; int
%% (\stringTOint 'i') -&gt; i

\@lisp@env@add@global\stringTOint{\@tlabel@func{\@lisp@func@check@args{1}{\@conv@strTOint}}}
\def\@conv@strTOint#1\@tlabel@string#2{\gdef#1{\@tlabel@int{#2}}}

%% IMMEDIATEWRITE : () -&gt; ()
%% It outputs the output buffer immediately.
%% It cause error if the buffer is incomplete.
\@lisp@env@add@global\immediatewrite{\@tlabel@func{\@lisp@func@check@args{0}{\@immediate@write}}}
\def\@immediate@write#1{%
	\gdef#1{\@tlabel@nil{}}%
	\@temp@write@buffer\gdef\@temp@write@buffer{}}

%% GROUP : string -&gt; string
%% (\group str) -&gt; '{str}'
\@lisp@env@add@global\group{\@tlabel@func{\@lisp@func@check@args{1}{\@text@group}}}
\def\@text@group#1#2#3{%
	\ifx#2\@tlabel@string
   		\gdef#1{\@tlabel@string{{#3}}}%
   	\else
   		\errmessage{LISP on TeX [function --- group]:%
   			The argument of group must be a string.}%
   	\fi}

%% UNGROUP : string -&gt; string
%% (\group '{str}') -&gt; 'str'
\@lisp@env@add@global\ungroup{\@tlabel@func{\@lisp@func@check@args{1}{\@text@ungroup}}}
\def\@text@ungroup#1#2#3{%
	\ifx#2\@tlabel@string
		\@@text@ungroup#1#3\@@end
	\else
		\errmessage{LISP on TeX [function --- ungroup]:%
   			The argument of ungroup must be a string.}%
	\fi}
\def\@@text@ungroup#1#2#3\@@end{%
	\ifx;#3;%
		\gdef#1{\@tlabel@string{#2}}%
	\else
		\errmessage{LISP on TeX [function --- ungroup]:%
   			The argument of ungroup must be a grouped string.}%
	\fi}

%% FGETS : () -&gt; string
%% (\fgets) -&gt; read tokens from standard-in
\@lisp@env@add@global\fgets{\@tlabel@func{\@lisp@func@check@args{0}{\@text@fgets}}}
\def\@text@fgets#1{%
\endlinechar=-1
\read-1to#1%
\expandafter\gdef\expandafter#1\expandafter{\expandafter\@tlabel@string\expandafter{#1}}}

%% EXPAND : string -&gt; string
%% (\expand '&lt;token&gt;') -&gt; '&lt;token+&gt;' where &lt;token+&gt; is expanded tokens of &lt;token&gt;
\@lisp@env@add@global\expand{\@tlabel@func{\@lisp@func@check@args{1}{\@lot@text@expand}}}
\def\@lot@text@expand#1\@tlabel@string#2{%
  \edef\@temp@i{#2}%
  \xdef#1{\noexpand\@tlabel@string{\@temp@i}}}
</pre></body></html>