summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/lisp-on-tex/lisp-on-tex.sty
diff options
context:
space:
mode:
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.sty151
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{%