summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/lisp-on-tex/lisp-prim.sty
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /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.sty176
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}