diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/lisp-on-tex/lisp-prim.sty |
Initial commit
Diffstat (limited to 'macros/latex/contrib/lisp-on-tex/lisp-prim.sty')
-rw-r--r-- | macros/latex/contrib/lisp-on-tex/lisp-prim.sty | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/macros/latex/contrib/lisp-on-tex/lisp-prim.sty b/macros/latex/contrib/lisp-on-tex/lisp-prim.sty new file mode 100644 index 0000000000..4f921612d8 --- /dev/null +++ b/macros/latex/contrib/lisp-on-tex/lisp-prim.sty @@ -0,0 +1,176 @@ +%% Syntax functions +\@lisp@env@add@global\quote{\@tlabel@quote{}}% +\@lisp@env@add@global\lambda{\@tlabel@lambda{}} +\@lisp@env@add@global\define{\@tlabel@define{}} +\@lisp@env@add@global\lispif{\@tlabel@if{}} +\@lisp@env@add@global\defmacro{\@tlabel@defmacro{}} +\@lisp@env@add@global\begin{\@tlabel@begin{}} +\@lisp@env@add@global\defineM{\@tlabel@mdefine{}} +\@lisp@env@add@global\setB{\@tlabel@setb{}} +\@lisp@env@add@global\@let{\@tlabel@@let{}} +\@lisp@env@add@global\@mlet{\@tlabel@@mlet{}} +\@lisp@env@add@global\macroexpand{\@tlabel@macroexpand{}} +\@lisp@env@add@global\callOCC{\@tlabel@callocc{}} + +\@lisp@env@add@global\car{\@tlabel@func{\@lisp@func@check@args{1}{\@lisp@perform@car}}} +\@lisp@env@add@global\cdr{\@tlabel@func{\@lisp@func@check@args{1}{\@lisp@perform@cdr}}} +\@lisp@env@add@global\cons{\@tlabel@func{\@lisp@func@check@args{2}{\@lisp@perform@cons}}} + +\newcount\@temp@count +\@lisp@env@add@global\length{\@tlabel@func{\@lisp@func@check@args{1}{\@lisp@length}}} +\def\@lisp@length{\@temp@count0\relax\@lisp@length@} +\def\@lisp@length@#1#2#3{% + \ifx#2\@tlabel@nil + \expandafter\gdef\expandafter#1% + \expandafter{\expandafter\@tlabel@int\expandafter{\the\@temp@count}}% + \let\@length@next\@length@gobble + \else\ifx#2\@tlabel@cons + \advance\@temp@count1\relax + \let\@length@next\@@lisp@length + \else + \errmessage{LISP on TeX [function--length]: The Argument must be a LIST}% + \fi\fi\@length@next#3#1} +\def\@length@gobble#1{} +\def\@@lisp@length#1#2#3{\expandafter\@lisp@length@\expandafter#3#2} + +%equality +\@lisp@env@add@global\={\@tlabel@func{\@lisp@func@check@args{2}{\@lisp@equal}}} +\def\@lisp@equal#1#2#3#4#5{% + \gdef#1{\@tlabel@bool{f}}% + \ifx#2#4% + \def\@@temp@eqchecki{#3}% + \def\@@temp@eqcheckii{#5}% + \ifx\@@temp@eqchecki\@@temp@eqcheckii\gdef#1{\@tlabel@bool{t}}\fi + \fi} + +% printing function +\@lisp@env@add@global\print{\@tlabel@func{\@lisp@func@check@args{1}{\@tex@print}}} +\def\@tex@print#1{\gdef#1{\@tlabel@nil{}}\@tex@print@} +\def\@tex@print@#1#2{% + \ifx#1\@tlabel@int + \@add@to@write@buffer\@temp@write@buffer{:#2}% + \else\ifx#1\@tlabel@symbol + \@add@to@write@buffer\@temp@write@buffer{\string#2}% + \else\ifx#1\@tlabel@string + \@add@to@write@buffer\@temp@write@buffer{'#2'}% + \else\ifx#1\@tlabel@bool + \@add@to@write@buffer\@temp@write@buffer{/#2}% + \else\ifx#1\@tlabel@dimen + \@add@to@write@buffer\@temp@write@buffer{!#2}% + \else\ifx#1\@tlabel@skip + \@add@to@write@buffer\@temp@write@buffer{@#2}% + \else\ifx#1\@tlabel@nil + \@add@to@write@buffer\@temp@write@buffer{()}% + \else\ifx#1\@tlabel@cons + \@add@to@write@buffer\@temp@write@buffer{(}% + \@tex@print@cell#2% + \else + \@add@to@write@buffer\@temp@write@buffer{[INNER]}% + \fi\fi\fi\fi\fi\fi\fi\fi} +\def\@tex@print@cell#1#2{% + \expandafter\@tex@print@#1% + \expandafter\@tex@print@cdr#2} +\def\@tex@print@cdr#1#2{% + \ifx#1\@tlabel@cons + \@add@to@write@buffer\@temp@write@buffer{ }% + \@tex@print@cell#2% + \else\ifx#1\@tlabel@nil + \@add@to@write@buffer\@temp@write@buffer{)}% + \else + \@add@to@write@buffer\@temp@write@buffer{.}% + \@tex@print@#1{#2}% + \@add@to@write@buffer\@temp@write@buffer{)}% + \fi\fi} + + + +\@lisp@env@add@global\texprint{\@tlabel@func{\@lisp@func@check@args{1}{\@tex@texprint}}} +\def\@tex@texprint#1#2#3{% + \gdef#1{\@tlabel@nil{}}\@@tex@texprint#2{#3}} +\def\@@tex@texprint#1#2{% + \ifx#1\@tlabel@string + \@add@to@write@buffer\@temp@write@buffer{#2}% + \else\ifx#1\@tlabel@int + \@add@to@write@buffer\@temp@write@buffer{#2}% + \else + \@add@to@write@buffer\@temp@write@buffer{INNER TOKEN}% + \fi\fi} + +\@lisp@env@add@global\stdprint{\@tlabel@func{\@lisp@func@check@args{1}{\@tex@stdprint}}} +\def\@tex@stdprint#1#2#3{% + \gdef#1{\@tlabel@nil{}}% + \let\@save@write@buffer\@temp@write@buffer + \def\@temp@write@buffer{}% + \@tex@print@#2{#3}% + \toks0\expandafter{\@temp@write@buffer}% + \immediate\write16{\the\toks0}% + \let\@temp@write@buffer\@save@write@buffer} + + +% Type predicates +\def\@type@pred@add#1{\expandafter\@@type@pred@add\expandafter#1} +\def\@@type@pred@add#1#2{\@lisp@env@add@global#1{\@tlabel@func{\@lisp@func@check@args{1}{#2}}}} +\def\@type@pred@define#1{\expandafter\@@type@pred@define\expandafter#1} +\def\@@type@pred@define#1#2{% + \def#1##1##2##3{\ifx##2#2\gdef##1{\@tlabel@bool{t}}\else\gdef##1{\@tlabel@bool{f}}\fi}} + +\@for\@lisp@on@tex@type:=\@defined@datatype\do{% + \expandafter\@type@pred@add\csname\@lisp@on@tex@type Q\endcsname + \csname @type@\@lisp@on@tex@type\endcsname + \expandafter\@type@pred@define\csname @type@\@lisp@on@tex@type\endcsname\csname @tlabel@\@lisp@on@tex@type\endcsname} + +\@lisp@env@add@global\pairQ{\@tlabel@func{\@type@cons}} +\@lisp@env@add@global\booleanQ{\@tlabel@func{\@type@bool}} + +% eval , apply +\@lisp@env@add@global\eval{\@tlabel@envfunc{\@extern@eval}} +\def\@extern@eval#1#2#3#4{\@eval#3{#4}{#2}#1} +\@lisp@env@add@global\apply{\@tlabel@envfunc{\@extern@apply}} +\def\@extern@apply#1#2#3#4#5#6{% reg, env, labelfun, contfun, labellist, contlist + \def\@lisp@apply@temp{}% init + \@flatten@args#5{#6}\@lisp@apply@temp + \expandafter\@extern@apply@next\expandafter{\@lisp@apply@temp}#3{#4}{#2}#1} +\def\@extern@apply@next#1#2#3#4#5{% arglist-flatten, labelfun, contfun env, reg + {\expandafter\@@select@@apply#2{#3}#1\@{#4}#5}} + +% values +%\@lisp@env@add@global\values{\@tlabel@func{\@lisp@multivalues}} +%\def\@lisp@multivalues#1#2\relax{\gdef#1{#2}} + +% read +\@lisp@env@add@global\read{\@tlabel@func{\@lisp@func@check@args{0}{\@lisp@read@stdin}}} +\def\@lisp@read@stdin#1{% + \read-1 to#1% + \def\@lisp@read@stdin@callback##1##2{% + \gdef#1{##1{##2}}}% + \expandafter\@lispread\expandafter\@lisp@read@stdin@callback#1} + +% create a list +\@lisp@env@add@global\list{\@tlabel@func{\@lisp@func@check@args{*}{\@lisp@prim@list@pre}}} +\def\@lisp@prim@list@pre#1{\gdef#1{}\@lisp@prim@list#1} +\def\@lisp@prim@list#1#2#3{% + \ifx#2\relax + \let\@@next\@lisp@prim@list@fin + \else + \let\@@next\@lisp@prim@list@add + \fi\@@next#1#2{#3}} +\def\@lisp@prim@list@add#1#2#3{% + \begingroup + \toks0\expandafter{#1}% + \toks1{#2{#3}}% + \xdef#1{\the\toks1 \the\toks0}%reverse arguments + \endgroup + \@lisp@prim@list#1} +\def\@lisp@prim@list@fin#1#2#3{\expandafter\@lisp@prim@list@fin@\expandafter#1#1\relax\relax} +\def\@lisp@prim@list@fin@#1{% + \gdef#1{\@tlabel@nil{}}% + \@lisp@prim@list@fin@@#1} +\def\@lisp@prim@list@fin@@#1#2#3{% + \ifx#2\relax + \def\@@next##1##2##3{}% + \else + \let\@@next\@lisp@prim@list@fin@@@ + \fi + \@@next#1#2{#3}} +\def\@lisp@prim@list@fin@@@#1#2#3{\expandafter\@lisp@prim@list@fin@@@@#1#2{#3}#1} +\def\@lisp@prim@list@fin@@@@#1#2#3#4#5{\@lisp@perform@cons#5#3{#4}#1{#2}\@lisp@prim@list@fin@@#5} |