diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/lisp-on-tex/lisp-on-tex.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/lisp-on-tex/lisp-on-tex.sty | 151 |
1 files changed, 109 insertions, 42 deletions
diff --git a/Master/texmf-dist/tex/latex/lisp-on-tex/lisp-on-tex.sty b/Master/texmf-dist/tex/latex/lisp-on-tex/lisp-on-tex.sty index e9a06ad2a55..95489f01602 100644 --- a/Master/texmf-dist/tex/latex/lisp-on-tex/lisp-on-tex.sty +++ b/Master/texmf-dist/tex/latex/lisp-on-tex/lisp-on-tex.sty @@ -1,5 +1,5 @@ %% -%% This is file `lisp.sty'. +%% This is file `lisp-on-tex.sty'. %% %% License: Modified BSD - see LICENSE file %% @@ -77,19 +77,17 @@ % interface \def\@lisp@empty{} -\def\lispinterp#1{\begingroup% - \gdef\@read@buffer{#1\@@eof\@@eof}\@lispinterp} -\def\@lispinterp{% - \readchar - \ifx\@currentread\@eof - \def\@next{\endgroup}% +\def\lispinterp#1{% + \@lispread\@lisp@read@eval@loop#1\@end@lispread} +\def\@lisp@read@eval@loop#1#2{% + \ifx#1\@tlabel@exception + \let\@@next\relax \else - \def\@next{% - \unreadchar - \@lispread\@lisp@input - \lispeval\@lisp@input\@lisp@result - \@lispinterp}\fi - \@next} + \def\@reg@tmp{#1{#2}}% + \def\@@next{% + \lispeval\@reg@tmp\@reg@tmp + \@lispread\@lisp@read@eval@loop}% + \fi\@@next} % eval @@ -120,8 +118,8 @@ \def\@@@@make@cons#1#2#3{\gdef#1{\@tlabel@cons{#2#3}}} -\def\@defined@datatype{symbol,string,int,bool,dimen,skip,cons,nil,func,closure,macro,envfunc,mutable} -\def\@defined@specialform{lambda,quote,define,if,defmacro,begin,mdefine,setb,@let,@mlet} +\def\@defined@datatype{symbol,string,int,bool,dimen,skip,cons,nil,func,closure,macro,envfunc,mutable,exception} +\def\@defined@specialform{lambda,quote,define,if,defmacro,begin,mdefine,setb,@let,@mlet,macroexpand} \edef\@defined@lisp@on@tex{\@defined@datatype,\@defined@specialform} @@ -153,13 +151,34 @@ \csname @tlabel@\@type\endcsname} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% memo of fasteval branch +% Each bound variables \var +% is defined as TeX macro [[@lisp@env@\var]] +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@lisp@expand@env@last{\@lisp@expand@env@last} + +\def\@lisp@expand@environment#1#2{% + \ifx#1\@lisp@expand@env@last + \let\@@next\relax + \else + \expandafter\def\csname @lisp@env@\string#1\endcsname{#2}% + \let\@@next\@lisp@expand@environment + \fi + \@@next} + \def\lispeval#1#2{% #1 : \cs -> S-exp, #2 : target register \gdef\@temp@write@buffer{}% - \expandafter\@eval#1{}#2% + \expandafter\@lisp@expand@environment\@globalenv\@lisp@expand@env@last\@lisp@expand@env@last% + \expandafter\@eval#1{}#2% \@temp@write@buffer} \def\@eval#1#2#3#4{% - \begingroup\expandafter\@@select@eval#1{#2}{#3}#4\endgroup} + \begingroup + \@lisp@expand@environment#3\@lisp@expand@env@last\@lisp@expand@env@last + \expandafter\@@select@eval#1{#2}{#3}#4% + \endgroup} \def\@append@env@global#1#2{% \def#2{#1}% @@ -167,12 +186,25 @@ \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{\expandafter#2\@globalenv}} -\def\@eval@symbol#1#2#3{% - \@append@env@global{#2}\@temp@env - %% \@temp@env = #2(local environment) ++ global environment - \getassoc\@temp@env#1#3% - \expandafter\@expand@if@mutable#3#3} -\def\@expand@if@mutable#1#2#3{\ifx#1\@tlabel@mutable\global\let#3#2\fi} +% \def\@eval@symbol#1#2#3{% +% \@append@env@global{#2}\@temp@env +% %% \@temp@env = #2(local environment) ++ global environment +% \getassoc\@temp@env#1#3% +% \expandafter\@expand@if@mutable#3#3} +\def\@eval@symbol#1#2#3{% #1 symbol #2 current env (ignored) #3 dist + \expandafter\global\expandafter\let\expandafter#3\csname @lisp@env@\string#1\endcsname + \ifx#3\relax % not found + \errmessage{LISP on TeX [evaluation of a symbol]: unbound variable...}% + \else + \expandafter\@expand@if@mutable#3#3% + \fi} +\def\@expand@if@mutable#1#2#3{% + \let\@@next\@expand@if@mutable@next@f + \ifx#1\@tlabel@mutable\let\@@next\@expand@if@mutable@next@t\fi + \@@next{#2}{#3}} +\def\@expand@if@mutable@next@f#1#2{} +\def\@expand@if@mutable@next@t#1#2{\global\let#2#1} + \def\@eval@envcs#1#2#3#4{\expandafter\@@eval@envcs\expandafter{#1}#2{#3}#4} \def\@@eval@envcs#1#2#3#4{\@eval#2{#3}{#1}#4} @@ -288,27 +320,36 @@ \aftergroup\@@tco } \def\@apply@if@next\@tlabel@bool#1#2#3#4#5#6#7{% + \let\@@next\relax \ifx#1t% - \gdef\@@tco{\@eval#2{#3}{#6}#7}% + \let\@@next\@apply@if@next@t \else\ifx#1f% - \gdef\@@tco{\@eval#4{#5}{#6}#7}% + \let\@@next\@apply@if@next@f \else \errmessage{LISP on TeX [if]: Invalid boolean. It's BUG. Please report.}% - \fi\fi} + \fi\fi\@@next{#1}{#2}{#3}{#4}{#5}{#6}{#7}} +\def\@apply@if@next@t#1#2#3#4#5#6#7{\gdef\@@tco{\@eval#2{#3}{#6}#7}} +\def\@apply@if@next@f#1#2#3#4#5#6#7{\gdef\@@tco{\@eval#4{#5}{#6}#7}} %% use general \def\@apply@eval@args#1#2#3#4{% + \let\@@next@pre\@apply@eval@args@pre@default \ifx#3\relax \let\@@next\@@next@fin \else - \let\@@save#1% - \@eval#3{#4}{#2}#1% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter#1\expandafter\expandafter\expandafter{% - \expandafter\@@save#1}% - \let\@@next\@apply@eval@args - \fi\@@next#1{#2}} + \let\@@next@pre\@apply@eval@args@pre@i + \fi\@@next@pre{#1}{#2}{#3}{#4}\@@next#1{#2}} + +\def\@apply@eval@args@pre@default#1#2#3#4{} +\def\@apply@eval@args@pre@i#1#2#3#4{% + \let\@@save#1% + \@eval#3{#4}{#2}#1% + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter#1\expandafter\expandafter\expandafter{% + \expandafter\@@save#1}% + \let\@@next\@apply@eval@args} + \def\@@next@fin#1#2{} \def\@apply@func#1#2\@#3#4{% @@ -344,6 +385,7 @@ \aftergroup\@@tco} \def\@@apply@create@env#1#2:#3#4#5{% + \let\@@next@pre\@@apply@create@env@pre@default \ifx!#2!% if #2 is empty \let\@@next@args@\@empty \ifx#3\@@unused @@ -353,17 +395,24 @@ \let\@@next\@@apply@create@env@fin \@@apply@modify@env#1\@tlabel@nil{}#3\@ \else - \@@apply@create@env@phantom - \expandafter\@@apply@modify@env\expandafter#1\@@@@ph#3\@ - \expandafter\gdef\csname car\the\@malloc\endcsname{#4{#5}}% - \let\@@next\@@apply@create@env@cdr + \let\@@next@pre\@@apply@create@env@pre@i \fi \fi \else - \@@apply@modify@env#1#4{#5}#2\@ - \@@next@args#2\@ - \let\@@next\@@apply@create@env - \fi\expandafter\@@next\expandafter#1\@@next@args@:#3} + \let\@@next@pre\@@apply@create@env@pre@ii + \fi\@@next@pre{#1}{#2}{#3}{#4}{#5}\expandafter\@@next\expandafter#1\@@next@args@:#3} + +\def\@@apply@create@env@pre@default#1#2#3#4#5{} +\def\@@apply@create@env@pre@i#1#2#3#4#5{% + \@@apply@create@env@phantom + \expandafter\@@apply@modify@env\expandafter#1\@@@@ph#3\@ + \expandafter\gdef\csname car\the\@malloc\endcsname{#4{#5}}% + \let\@@next\@@apply@create@env@cdr} +\def\@@apply@create@env@pre@ii#1#2#3#4#5{% + \@@apply@modify@env#1#4{#5}#2\@ + \@@next@args#2\@ + \let\@@next\@@apply@create@env} + \def\@@apply@create@env@cdr#1:#2{\@@@apply@create@env@cdr} \def\@@@apply@create@env@cdr#1#2{% @@ -395,7 +444,6 @@ \fi} \def\@@next@args#1#2\@{\def\@@next@args@{#2}} - \def\@@apply@macro#1#2\@#3#4{\@@apply@macro@next#1#2\@{#3}#4} \def\@@apply@macro@next#1#2#3#4#5\@#6#7{% \def\@temp@env{}% @@ -406,6 +454,25 @@ \aftergroup\@@tco} \let\@apply@macro\@@apply@macro +\def\@apply@macroexpand#1#2#3\@#4#5{% cont, args, \@ env, reg + \let\@@apply@macro@next\@@apply@macro@next@expand@only + \@eval#2{#3}{#4}#5% + \expandafter\@eval#5{#4}#5} +\def\@@apply@macro@next@expand@only#1#2#3#4#5\@#6#7{% + \def\@temp@env{}% + \@@apply@create@env\@temp@env#1#5\relax\relax + \expandafter\gdef\expandafter\@@tco\expandafter{% + \expandafter\@@eval@envcs\expandafter{\@temp@env#2}#3{#4}#7% + \expandafter\@eval@if@macro#7{#6}#7}% + \aftergroup\@@tco} +\def\@eval@if@macro#1#2#3#4{% + \ifx#1\@tlabel@cons\@eval@if@macro@#2{#3}#4\fi} +\def\@eval@if@macro@#1#2#3#4{% + \expandafter\@eval#1{#3}\@temp@i + \expandafter\@eval@if@macro@@\@temp@i#1#2{#3}#4} +\def\@eval@if@macro@@#1#2#3#4#5#6{% + \ifx#1\@tlabel@macro\@eval\@tlabel@cons{#3#4}{#5}#6\else\gdef#6{\@tlabel@cons{#3#4}}\fi} + \def\@apply@begin#1#2\@#3#4{% |