core: equal2_p: Add short-circuit and eliminate tail call.

* src/lib.c (equal2_p): Add short-circuit and eliminate tail call.
This commit is contained in:
Jan Nieuwenhuizen 2018-04-24 06:59:18 +02:00
parent 9936aa383b
commit 4fa6acc480
No known key found for this signature in database
GPG Key ID: F3C1A0D9C1D65273
1 changed files with 16 additions and 5 deletions

View File

@ -293,14 +293,25 @@ memq (SCM x, SCM a)
SCM
equal2_p (SCM a, SCM b)
{
if (a == cell_nil && b == cell_nil)
equal2:
if (a == b)
return cell_t;
if (TYPE (a) == TPAIR && TYPE (b) == TPAIR)
return equal2_p (CAR (a), CAR (b)) == cell_t
&& equal2_p (CDR (a), CDR (b)) == cell_t
? cell_t : cell_f;
{
if (equal2_p (CAR (a), CAR (b)) == cell_t)
{
a = CDR (a);
b = CDR (b);
goto equal2;
}
return cell_f;
}
if (TYPE (a) == TSTRING && TYPE (b) == TSTRING)
return equal2_p (STRING (a), STRING (b));
{
a = STRING (a);
b = STRING (b);
goto equal2;
}
if (TYPE (a) == TVECTOR && TYPE (b) == TVECTOR)
{
if (LENGTH (a) != LENGTH (b))