-
Notifications
You must be signed in to change notification settings - Fork 2
/
lisp-string.sty
82 lines (74 loc) · 2.92 KB
/
lisp-string.sty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
%% CONCAT : string -> string -> string
%% (\concat str1 str2) => 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 -> string
%% (\intTOstring i) -> '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 -> int
%% (\stringTOint 'i') -> 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 : () -> ()
%% 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 -> string
%% (\group str) -> '{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 -> string
%% (\group '{str}') -> '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 : () -> string
%% (\fgets) -> 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 -> string
%% (\expand '<token>') -> '<token+>' where <token+> is expanded tokens of <token>
\@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}}}