<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">There is no computed goto in Common Lisp, so what you want cannot be expressed with tagbody and go. case/ecase/ccase is the closest you can get in a straightforward way.<div><br></div><div>An alternative would be to compute a jump table manually. Roughly like this:</div><div><br></div><div>(defun table-step (step)</div><div>  (let ((table (vector (lambda () 0) (lambda () 1) (lambda () 2) ...)))</div><div>    (funcall (svref table step))))</div><div><br></div><div>...of course with the right kind of macrology around. But I doubt this buys you a substantial advantage.</div><div><br></div><div>The timings below don't tell you a lot because gostep and runstep don't perform the same kinds of computations.</div><div><br></div><div><br></div><div>Pascal</div><div><br><div><div>On 8 Dec 2010, at 18:58, Taoufik Dachraoui wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>I run the following test to show that ecase is not jumping directly</div><div>to the given step (less efficient then (go step)):</div><div><br></div><div>(defmacro gostep (step)</div><div>    `(block nil (tagbody (go ,step)</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>,@(loop for i = 0 then (1+ i)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>    while (< i 100)</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>     append `(,i (return-from nil ,i) (go end)))</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>end)))</div><div><br></div><div>(defmacro define-runstep ()</div><div>    `(defun runstep (step)</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>(block nil </div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>  (ecase step</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>,@(loop for i = 0 then (1+ i)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>    while (< i 100)</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>     collect `(,i (return-from nil ,i)))</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>))))</div><div><br></div><div>(define-runstep)</div>
<div><br></div><div>? (time (dotimes (i 10000000) (gostep 99)))</div><div>(DOTIMES (I 10000000) (GOSTEP 99)) took 30 milliseconds (0.030 seconds) to run </div><div>                    with 2 available CPU cores.</div><div>
During that period, 30 milliseconds (0.030 seconds) were spent in user mode</div><div>                    0 milliseconds (0.000 seconds) were spent in system mode</div><div>NIL</div><div>? (time (dotimes (i 10000000) (runstep 99)))</div>
<div>(DOTIMES (I 10000000) (RUNSTEP 99)) took 988 milliseconds (0.988 seconds) to run </div><div>                    with 2 available CPU cores.</div><div>During that period, 986 milliseconds (0.986 seconds) were spent in user mode</div>
<div>                    0 milliseconds (0.000 seconds) were spent in system mode</div><div>NIL</div><div><br></div><div><br></div><div>-Taoufik</div><br><div class="gmail_quote">On Wed, Dec 8, 2010 at 6:11 PM, Alexander Repenning <span dir="ltr"><<a href="mailto:ralex@cs.colorado.edu">ralex@cs.colorado.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im"><br>
On Dec 8, 2010, at 9:52 AM, Taoufik Dachraoui wrote:<br>
<br>
> It is not exactly what I am looking for, I would like to jump directly to the step.<br>
> The ecase will check all the clauses in order (like cond) until it finds a match.<br>
<br>
<br>
</div>duno what CCL does in this particular case but most compilers could generate a jump and would not have to test all the previous clauses. In other words this is an implementation question.<br>
<br>
alex<br>
<br>
<br>
<br>
</blockquote></div><br>
</blockquote></div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>-- </div><div>Pascal Costanza, <a href="mailto:pc@p-cos.net">mailto:pc@p-cos.net</a>, <a href="http://p-cos.net">http://p-cos.net</a></div><div>Vrije Universiteit Brussel</div><div>Software Languages Lab</div><div>Pleinlaan 2, B-1050 Brussel, Belgium</div><div><br></div></div></span></div></span></div></span></div></span></div></span></div></span><br class="Apple-interchange-newline"></div></span><br class="Apple-interchange-newline"></div></span><br class="Apple-interchange-newline"></span><br class="Apple-interchange-newline">
</div>
<br></div></body></html>