bug#63196: Further on this error message

<[email protected]>
Newsgroups gmane.lisp.guile.bugs
Message-ID <[email protected]>
On Mon, May 01, 2023 at 10:44:18AM +0800, Christopher Lam wrote:
> The source seems to be sxpath.scm -- see "yikes" error which triggers when
> n is -2 -4 -6 etc. I don't know how to build guile from sources and cannot
> debug further.
> 
> 
> (define (node-pos n)
>   (lambda (nodeset)
>     (cond
>      ((not (nodeset? nodeset)) '())
>      ((null? nodeset) nodeset)
>      ((eqv? n 1) (list (car nodeset)))
>      ((negative? n) ((node-pos (+ n 1 (length nodeset))) nodeset))
>      (else
>       (or (positive? n) (error "yikes!"))
>       ((node-pos (1- n)) (cdr nodeset))))))

Hm. It seems that calling `node-pos' with n == 0 runs straight into the
"yikes" case (unless `nodeset' is #f or null, that is).

And we would get this when n ==-2 and (length nodeset) equals 1 on the
next recursive call. Or when n == -3 and (length nodeset) == 2, and so
on -- i.e. when n == -1 - (length nodeset).

We reach such a point again when n == 2*(-1 - (length nodeset)): it runs
into the case (negative? n), retries with n' = (+ n 1 (length nodeset))
which is still negative, next try is 0 => yikes.

So in your case I guess your (length nodeset) is 1, because you have
a cycle length of two :-)

Reading between the lines in the code above for the positive case, I
gather that the intention is to return an empty nodeset (i.e. '())
when n runs off the nodeset. So I'd extend the ((negative? n) ...)
case like so:

  ((negative? n)
    (let ((nn (+ 1 (length nodeset))))
      (if (positive? nn) (node-pos nn) '())))

Comments?

Cheers
-- 
t
signature.asc (application/pgp-signature, 195 B)
-----BEGIN PGP SIGNATURE-----

iF0EABECAB0WIQRp53liolZD6iXhAoIFyCz1etHaRgUCZFZKJwAKCRAFyCz1etHa
Rp4oAJ43XDJdQlBNqobJ3l7To7Khwk1hpgCeM5lc7Ilsnp7y5DT9OoEZPY8QevA=
=jOMe
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.