<div dir="ltr">Hi,<div><br></div><div>Problem number 1:<br><div><br></div><div>This form </div><div>(ps (loop :for i :from 0 :do (print i)))</div><div>generates:<br></div><div>(function () {<br>    for (var i = 0; i <= null; i += 1) {<br>        print(i);<br>    };<br>})();<br></div><div><br></div><div>I fixed it locally by changing for-from</div><div><br></div><div>(defun for-from (from-key var state)<br>  (unless (atom var)<br>    (err "an atom after FROM" var))<br>  (let ((start (eat state))<br>        (op (loop-case from-key (:downfrom '-) (otherwise '+)))<br>        (test-op nil)<br>        (by nil)<br>        (end nil))<br>    (loop while (member (as-keyword (peek state)) '(:to :below :downto :above :by)) do<br>          (let ((term (eat state)))<br>            (if (eq (as-keyword term) :by)<br>                (setf by (eat state))<br>                (setf op (loop-case term ((:downto :above) '-) (otherwise op))<br>                      test-op (loop-case term (:to (loop-case from-key (:downfrom '>=) (otherwise '<=))) (:below '<) (:downto '>=) (:above '>))<br>                      end (eat state)))))<br>    (let ((test (when test-op<br>                  (list test-op var (maybe-hoist end state)))))<br>      (push-iter-clause `(,var ,start (,op ,var ,(or by 1)) ,test) state))))<br></div><div><br></div><div><br></div><div>The difference is that test-op is assigned initially nil, and only re-assigned a value if there is a term. In my example I get infinite loop, but the same behaviour happens if I have more looping constructs, e.g. (loop :for i :from 0 :for j :in list :do (print i))</div><div><br></div><div>Problem number 2:</div><div><br></div><div>Let causes the whole body of loop to be wrapped in function, whereas the previous version wrapped it in <span style="color:rgb(0,0,0);font-family:monospace;font-size:medium;white-space:pre-wrap">with ({ i : i }) { .... }</span></div><div>Example:<br></div><div>(ps (loop :for i :from 0 :for j :in (array 1 2 3) :do (let ((i i)) (lambda () i)))) </div><div>generates<br></div><div>(function () {<br>    var _js207 = [1, 2, 3];<br>    var _js209 = _js207.length;<br>    var FIRST210 = true;<br>    for (var i = 0; true; i += 1) {<br>        (function () {<br>            var _js208 = FIRST210 ? 0 : _js208 + 1;<br>            if (_js208 >= _js209) {<br>                break;<br>            };<br>            var j = _js207[_js208];<br>            var i211 = i;<br>            function () {<br>                return i211;<br>            };<br>            return FIRST210 = null;<br>        })();<br>    };<br>})();<br></div><div><br></div><div>The diference is that it is illegal to break from a function body, and it was legal to break from with.</div><div><br></div><div>Can somebody help please?</div><div><br></div><div>Cheers,</div><div>Piotr</div><div><br></div><div><br></div></div></div>