fixed bugs in and/or handlers
This commit is contained in:
parent
d3363e11e5
commit
b2088d0891
@ -8,8 +8,8 @@ procedure Evaluate is
|
|||||||
Cdr: aliased Object_Pointer;
|
Cdr: aliased Object_Pointer;
|
||||||
|
|
||||||
generic
|
generic
|
||||||
V: Object_Pointer;
|
Result: Object_Pointer; -- Result to return if no <test> expressions exist.
|
||||||
Opcode: Opcode_Type;
|
Opcode: Opcode_Type; -- Switch to this opcode to evaluate the next <test>.
|
||||||
procedure Generic_And_Or_Syntax;
|
procedure Generic_And_Or_Syntax;
|
||||||
|
|
||||||
procedure Generic_And_Or_Syntax is
|
procedure Generic_And_Or_Syntax is
|
||||||
@ -17,14 +17,14 @@ procedure Evaluate is
|
|||||||
-- (and <test1> <test2> ...)
|
-- (and <test1> <test2> ...)
|
||||||
-- (and (= 2 2) (> 2 1)) ==> #t
|
-- (and (= 2 2) (> 2 1)) ==> #t
|
||||||
-- (and (= 2 2) (< 2 1)) ==> #f
|
-- (and (= 2 2) (< 2 1)) ==> #f
|
||||||
-- (and (= 2 2) (< 2 1) (= 3 3)) ==> #f
|
-- (and (= 2 2) (< 2 1) (= 3 3)) ==> #f
|
||||||
-- (and 1 2 'c '(f g)) ==> (f g)
|
-- (and 1 2 'c '(f g)) ==> (f g)
|
||||||
-- (and) ==> #t
|
-- (and) ==> #t
|
||||||
|
|
||||||
Operand := Cdr; -- Skip "And"
|
Operand := Cdr; -- Skip "And"
|
||||||
if Operand = Nil_Pointer then
|
if Operand = Nil_Pointer then
|
||||||
-- (and)
|
-- (and)
|
||||||
Return_Frame (Interp, V);
|
Return_Frame (Interp, Result);
|
||||||
elsif not Is_Cons(Operand) or else Get_Last_Cdr(Operand) /= Nil_Pointer then
|
elsif not Is_Cons(Operand) or else Get_Last_Cdr(Operand) /= Nil_Pointer then
|
||||||
-- (and . 10)
|
-- (and . 10)
|
||||||
-- (and 1 2 . 10)
|
-- (and 1 2 . 10)
|
||||||
@ -38,8 +38,8 @@ procedure Evaluate is
|
|||||||
end if;
|
end if;
|
||||||
end Generic_And_Or_Syntax;
|
end Generic_And_Or_Syntax;
|
||||||
|
|
||||||
procedure Evaluate_And_Syntax is new Generic_And_Or_Syntax(True_Pointer, Opcode_Finish_And_Syntax);
|
procedure Evaluate_And_Syntax is new Generic_And_Or_Syntax(True_Pointer, Opcode_And_Finish);
|
||||||
procedure Evaluate_Or_Syntax is new Generic_And_Or_Syntax(False_Pointer, Opcode_Finish_Or_Syntax);
|
procedure Evaluate_Or_Syntax is new Generic_And_Or_Syntax(False_Pointer, Opcode_Or_Finish);
|
||||||
|
|
||||||
procedure Evaluate_Define_Syntax is
|
procedure Evaluate_Define_Syntax is
|
||||||
pragma Inline (Evaluate_Define_Syntax);
|
pragma Inline (Evaluate_Define_Syntax);
|
||||||
|
@ -21,10 +21,10 @@ procedure Execute (Interp: in out Interpreter_Record) is
|
|||||||
|
|
||||||
-- ----------------------------------------------------------------
|
-- ----------------------------------------------------------------
|
||||||
generic
|
generic
|
||||||
V: Object_Pointer;
|
with function Is_Bool (X: in Object_Pointer) return Standard.Boolean;
|
||||||
procedure Evaluate_Up_To;
|
procedure Evaluate_While;
|
||||||
|
|
||||||
procedure Evaluate_Up_To is
|
procedure Evaluate_While is
|
||||||
X: Object_Pointer;
|
X: Object_Pointer;
|
||||||
Y: Object_Pointer;
|
Y: Object_Pointer;
|
||||||
Opcode: Opcode_Type;
|
Opcode: Opcode_Type;
|
||||||
@ -36,7 +36,7 @@ procedure Execute (Interp: in out Interpreter_Record) is
|
|||||||
-- evaluate <test1>. Y must be valid even at the first time
|
-- evaluate <test1>. Y must be valid even at the first time
|
||||||
-- this procedure is called.
|
-- this procedure is called.
|
||||||
|
|
||||||
if Y /= V and then Is_Cons(X) then
|
if Is_Bool(Y) and then Is_Cons(X) then
|
||||||
-- The result is not what I look for.
|
-- The result is not what I look for.
|
||||||
-- Yet there are still more tests to evaluate.
|
-- Yet there are still more tests to evaluate.
|
||||||
--Switch_Frame (Interp.Stack, Get_Frame_Opcode(Interp.Stack), Get_Cdr(X), Nil_Pointer);
|
--Switch_Frame (Interp.Stack, Get_Frame_Opcode(Interp.Stack), Get_Cdr(X), Nil_Pointer);
|
||||||
@ -49,10 +49,22 @@ procedure Execute (Interp: in out Interpreter_Record) is
|
|||||||
-- Return the result of the last expression evaluated.
|
-- Return the result of the last expression evaluated.
|
||||||
Return_Frame (Interp, Y);
|
Return_Frame (Interp, Y);
|
||||||
end if;
|
end if;
|
||||||
end Evaluate_Up_To;
|
end Evaluate_While;
|
||||||
|
|
||||||
procedure Finish_And_Syntax is new Evaluate_Up_To(False_Pointer);
|
function Is_False (X: in Object_Pointer) return Standard.Boolean is
|
||||||
procedure Finish_Or_Syntax is new Evaluate_Up_To(True_Pointer); -----> this is wrong, it shoudl be able to specify "/= False_Pointer".
|
pragma Inline (Is_False);
|
||||||
|
begin
|
||||||
|
return X = False_Pointer;
|
||||||
|
end Is_False;
|
||||||
|
|
||||||
|
function Is_True (X: in Object_Pointer) return Standard.Boolean is
|
||||||
|
pragma Inline (Is_True);
|
||||||
|
begin
|
||||||
|
return X /= False_Pointer;
|
||||||
|
end Is_True;
|
||||||
|
|
||||||
|
procedure Do_And_Finish is new Evaluate_While(Is_True);
|
||||||
|
procedure Do_Or_Finish is new Evaluate_While(Is_False);
|
||||||
-- ----------------------------------------------------------------
|
-- ----------------------------------------------------------------
|
||||||
|
|
||||||
procedure Do_Define_Finish is
|
procedure Do_Define_Finish is
|
||||||
@ -934,39 +946,48 @@ ada.text_io.put_line (Opcode_Type'Image(Get_Frame_Opcode(Interp.Stack)));
|
|||||||
when Opcode_Evaluate_Object =>
|
when Opcode_Evaluate_Object =>
|
||||||
Evaluate;
|
Evaluate;
|
||||||
|
|
||||||
when Opcode_Finish_And_Syntax =>
|
when Opcode_And_Finish =>
|
||||||
Finish_And_Syntax; -- Conditional
|
Do_And_Finish;
|
||||||
|
|
||||||
--when Opcode_Finish_Case_Syntax =>
|
--when Opcode_Finish_Case_Syntax =>
|
||||||
--when Opcode_Finish_Cond_Syntax =>
|
--when Opcode_Finish_Cond_Syntax =>
|
||||||
|
|
||||||
when Opcode_Define_Finish =>
|
when Opcode_Define_Finish =>
|
||||||
Do_Define_Finish;
|
Do_Define_Finish;
|
||||||
|
|
||||||
when Opcode_Grouped_Call =>
|
when Opcode_Grouped_Call =>
|
||||||
Do_Grouped_Call;
|
Do_Grouped_Call;
|
||||||
|
|
||||||
when Opcode_If_Finish =>
|
when Opcode_If_Finish =>
|
||||||
Do_If_Finish; -- Conditional
|
Do_If_Finish; -- Conditional
|
||||||
|
|
||||||
when Opcode_Let_Binding =>
|
when Opcode_Let_Binding =>
|
||||||
Do_Let_Binding;
|
Do_Let_Binding;
|
||||||
|
|
||||||
when Opcode_Letast_Binding =>
|
when Opcode_Letast_Binding =>
|
||||||
Do_Letast_Binding;
|
Do_Letast_Binding;
|
||||||
|
|
||||||
when Opcode_Letast_Binding_Finish =>
|
when Opcode_Letast_Binding_Finish =>
|
||||||
Do_Letast_Binding_Finish;
|
Do_Letast_Binding_Finish;
|
||||||
|
|
||||||
when Opcode_Let_Evaluation =>
|
when Opcode_Let_Evaluation =>
|
||||||
Do_Let_Evaluation;
|
Do_Let_Evaluation;
|
||||||
|
|
||||||
when Opcode_Let_Finish =>
|
when Opcode_Let_Finish =>
|
||||||
Do_Let_Finish;
|
Do_Let_Finish;
|
||||||
|
|
||||||
|
when Opcode_Or_Finish =>
|
||||||
|
Do_Or_Finish;
|
||||||
|
|
||||||
when Opcode_Procedure_Call =>
|
when Opcode_Procedure_Call =>
|
||||||
Do_Procedure_Call;
|
Do_Procedure_Call;
|
||||||
|
|
||||||
when Opcode_Procedure_Call_Finish =>
|
when Opcode_Procedure_Call_Finish =>
|
||||||
Do_Procedure_Call_Finish;
|
Do_Procedure_Call_Finish;
|
||||||
|
|
||||||
when Opcode_Set_Finish =>
|
when Opcode_Set_Finish =>
|
||||||
Do_Set_Finish; -- Assignment
|
Do_Set_Finish; -- Assignment
|
||||||
|
|
||||||
when Opcode_Finish_Or_Syntax =>
|
|
||||||
Finish_Or_Syntax; -- Conditional
|
|
||||||
|
|
||||||
when Opcode_Apply =>
|
when Opcode_Apply =>
|
||||||
Apply;
|
Apply;
|
||||||
|
@ -97,9 +97,9 @@ package body H2.Scheme is
|
|||||||
Opcode_Exit,
|
Opcode_Exit,
|
||||||
Opcode_Evaluate_Result,
|
Opcode_Evaluate_Result,
|
||||||
Opcode_Evaluate_Object,
|
Opcode_Evaluate_Object,
|
||||||
Opcode_Finish_And_Syntax,
|
|
||||||
Opcode_Finish_Or_Syntax,
|
|
||||||
|
|
||||||
|
Opcode_And_Finish,
|
||||||
|
Opcode_Or_Finish,
|
||||||
Opcode_Define_Finish,
|
Opcode_Define_Finish,
|
||||||
Opcode_Grouped_Call, -- (begin ...), closure apply, let body
|
Opcode_Grouped_Call, -- (begin ...), closure apply, let body
|
||||||
Opcode_If_Finish,
|
Opcode_If_Finish,
|
||||||
|
Loading…
Reference in New Issue
Block a user