-
Notifications
You must be signed in to change notification settings - Fork 1
/
lspflow.pas
82 lines (61 loc) · 2.2 KB
/
lspflow.pas
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
(*----------------------------------------------------------------------------*)
(* Author: Joachim Pimiskern, 1994-2004 *)
(*----------------------------------------------------------------------------*)
unit lspflow;
{$O+,F+}
interface
uses
lspglobl;
function LspLambda(Body, Umgebung: pNode): pNode;
function LspMacro(Rumpfliste, Argumente, Umgebung: pNode): pNode;
function LspBackQuote(Ausdruck, Umgebung: pNode): pNode;
implementation
uses
lspmain, lspbasic, lspinout, lspcreat, lspLists, lspinit, lsppredi,
lsperr;
function LspLambda(Body, Umgebung: pNode): pNode;
var laeufer: pNode;
LocalE : pNode;
begin
LspLambda := nil;
LocalE := Umgebung;
LocalE := LspCons(LspList2(cLspLambda,Body),LocalE); (* GC-Trick *)
laeufer := Body;
while laeufer <> nil do
begin
LspLambda := LspEval(laeufer^.CarVal,LocalE);
laeufer := laeufer^.CdrVal;
end;
end;
function LspMacro(Rumpfliste, Argumente, Umgebung: pNode): pNode;
var laeufer: pNode;
LocalE : pNode;
begin
LspMacro := nil;
LocalE := Umgebung;
LocalE := LspCons(LspList2(cLspMacro,Rumpfliste),LocalE); (* GC-Trick *)
LocalE := LspBindParameters(LspCar(Rumpfliste),Argumente,LocalE);
laeufer := LspCdr(Rumpfliste);
while laeufer <> nil do
begin
LspMacro := LspEval(LspEval(laeufer^.CarVal,LocalE),LocalE);
laeufer := laeufer^.CdrVal;
end;
end;
function LspBackQuote(Ausdruck, Umgebung: pNode): pNode;
begin
if LspAtom(Ausdruck) then
LspBackQuote := Ausdruck
else
if (LspCar(Ausdruck) = cLspComma) then
LspBackQuote := LspEval(LspCadr(Ausdruck),Umgebung)
else
if LspListp(LspCar(Ausdruck)) and (LspCaar(Ausdruck) = cLspCommaAt) then
LspBackQuote := LspAppend2(LspEval(LspCadar(Ausdruck),Umgebung),
LspCdr(Ausdruck))
else
LspBackQuote := LspCons(LspBackquote(LspCar(Ausdruck),Umgebung),
LspBackQuote(LspCdr(Ausdruck),Umgebung));
end;
end.