From 138ac70130b55a0a97dce3ad742896f675bb1ddc Mon Sep 17 00:00:00 2001 From: koba-e964 Date: Sun, 16 Mar 2014 01:38:12 +0900 Subject: [PATCH 1/2] list? for circular lists pic_list_p() detects circular lists using Floyd's cycle-finding algorithm. --- src/pair.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/pair.c b/src/pair.c index 1b993722..2a24583e 100644 --- a/src/pair.c +++ b/src/pair.c @@ -49,12 +49,24 @@ bool pic_list_p(pic_state *pic, pic_value obj) { UNUSED(pic); + pic_value twice=obj; - while (pic_pair_p(obj)) { + while (1) { + int i; + /* variable twice are scanned twice as fast as obj */ + for(i=0;i<2;i++){ + if(pic_pair_p(twice)){ + twice=pic_pair_ptr(twice)->cdr; + } + else{ + return pic_nil_p(twice); + } + } obj = pic_pair_ptr(obj)->cdr; + if(pic_eq_p(obj,twice)){ /* circular list */ + return false; + } } - - return pic_nil_p(obj); } pic_value From c23e3254fb97d07be4755cd21405a586cdf4c165 Mon Sep 17 00:00:00 2001 From: koba-e964 Date: Sun, 16 Mar 2014 21:55:50 +0900 Subject: [PATCH 2/2] cleanup Re-format the code so that it complies with the C coding rule of picrin. --- src/pair.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/pair.c b/src/pair.c index 2a24583e..1a441273 100644 --- a/src/pair.c +++ b/src/pair.c @@ -51,22 +51,24 @@ pic_list_p(pic_state *pic, pic_value obj) UNUSED(pic); pic_value twice=obj; - while (1) { + /* This code checks whether obj is a circular list + using Floyd's cycle-finding algorithm. */ + while ( 1 ) { /* loops until a cycle is detected or an object other than a pair is found */ int i; - /* variable twice are scanned twice as fast as obj */ - for(i=0;i<2;i++){ - if(pic_pair_p(twice)){ - twice=pic_pair_ptr(twice)->cdr; + for (i = 0; i < 2; ++i) { + if (pic_pair_p(twice)) { + twice = pic_pair_ptr(twice)->cdr; } - else{ + else { return pic_nil_p(twice); } } - obj = pic_pair_ptr(obj)->cdr; - if(pic_eq_p(obj,twice)){ /* circular list */ + obj = pic_pair_ptr(obj)->cdr; /* Since obj progresses slower than twice, it is guaranteed that obj is a pair. */ + if (pic_eq_p(obj,twice)) { /* obj is a circular list */ return false; } } + /* unreachable */ } pic_value