Hello,
this is on clisp 2.48 on cygwin.
The function low-discrepancy-sample could not compile because iterate could not digest loop
*****
Iterate, in clause (COLLECT
(APPLY MAKE-FUNCTION
(APPEND FIXED-PARAMETERS
(MAPCAN
(LAMBDA (X SEQ)
(LIST (FIRST X) (VAL-FROM-RANGE (GREF V SEQ) (SECOND X) (THIRD X))))
SWEEP-PARAMETERS
(LOOP FOR I FROM 0 BELOW (LENGTH SWEEP-PARAMETERS) COLLECT I))))):
Iterate does not know how to handle the special form (MACROLET
((LOOP-FINISH NIL (SYSTEM::LOOP-FINISH-ERROR)))
(BLOCK NIL
(LET ((I 0) (#:LIMIT-273656 (LENGTH SWEEP-PARAMETERS)))
(PROGN
(LET ((#:ACCULIST-VAR-273657 NIL))
(MACROLET ((LOOP-FINISH NIL '(GO SYSTEM::END-LOOP)))
(TAGBODY SYSTEM::BEGIN-LOOP
(WHEN (COMMON-LISP:>= I #:LIMIT-273656) (LOOP-FINISH))
(PROGN (SETQ #:ACCULIST-VAR-273657 (CONS I #:ACCULIST-VAR-273657)))
(PSETQ I (COMMON-LISP:+ I 1)) (GO SYSTEM::BEGIN-LOOP) SYSTEM::END-LOOP
(MACROLET
((LOOP-FINISH NIL (SYSTEM::LOOP-FINISH-WARN) '(GO SYSTEM::END-LOOP)))
(RETURN-FROM NIL (SYSTEM::LIST-NREVERSE #:ACCULIST-VAR-273657))))))))))
It will not be walked, which means that Iterate clauses inside it will not be seen.
*****
If I replaced the loop form with the much more verbose
(let (res)
(dotimes (i (length sweep-parameters) (nreverse res))
(push i res)))
the code compiled cleanly.
The same error can be seen with a much simpler:
(iter:iter
(iter:for v iter:in '(1 2 3 4))
(iter:collect (loop for i in v)))
Another alternative is to use iter instead of loop
(iter:iter
(iter:for i from 0 below (length sweep-parameters))
(iter:collect i))
It compiles cleanly, but I did not test the function accuracy.
Mirko