I have a question about commit c157ff502829c6f2856df4a963d81a88ee241ebf, the change for detecting cycles in equal?
The last change in runtime.c is as follows: @@ -3865,7 +3876,8 @@ C_regparm C_word C_fcall C_equalp(C_word x, C_word y) C_header header; C_word bits, n, i; - C_stack_check; + if(C_stack_test) + barf(C_CIRCULAR_DATA_ERROR, "equal?"); loop: if(x == y) return 1; Given that equal? returns either #t or #f, is it the case here that *if* we have detected circular data, is it by definition eq? to itself, and therefor rather than calling barf() here we can return 1? If that isn't true, could we perform this check later in this routine, say before we recurse rather than immediately upon entering? That would allow some non-recursive checks to run (and potentially succeed) before deciding that we really have to terminate. I think we could detect some cases of equality that this patch won't, because of the placement of this check. It seems that the stack check is placed in a "generic" location that would work with any potentially circular data, but in the case of equal?, the fact that it returns a boolean value means we can do better than "generic" code that might return any value. -Alan -- .i ko djuno fi le do sevzi _______________________________________________ Chicken-users mailing list Chicken-users@nongnu.org http://lists.nongnu.org/mailman/listinfo/chicken-users