514 lines
No EOL
123 KiB
HTML
514 lines
No EOL
123 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<title>CLiki: CPS</title>
|
|
<link rel="alternate" type="application/atom+xml" title="ATOM feed of edits to current article"
|
|
href="https://www.cliki.net/site/feed/article.atom?title=CPS">
|
|
<link rel="stylesheet" href="static/css/style.css">
|
|
<link rel="stylesheet" href="static/css/colorize.css">
|
|
</head>
|
|
|
|
<body>
|
|
<span class="hidden">CLiki - CPS</span>
|
|
<div id="content"><div id="content-area"><div id="article-title">CPS</div><div id="article">CPS stands for Continuation Passing Style.<p>Refer to <a href="http://wiki.c2.com/?ContinuationPassingStyle">here</a> for more details.<p>I wrote a CPS transformer for Common Lisp in a few days after thinking in lisp terms only three months for now. I think it means lisp is great, actually I would never try to do the same thing in Java. -- <a href="Levente Mészáros.html" class="internal">Levente Mészáros</a><p>The code is not tested too much and I'm sure it can be improved. It's just a toy right now, but an interesting one, I think... <p>Also consider <a href="cl-cont.html" class="internal">cl-cont</a> - a delimited continuations library for Common Lisp initially written for <a href="cl-weblocks.html" class="internal">cl-weblocks</a>.<p>How does this one compare to <a href="Marco Baringer.html" class="internal">Marco Baringer</a>'s transformer (used in <a href="UCW.html" class="internal">UCW</a>), part of his <a href="arnesi.html" class="internal">arnesi</a>/bese tools? -- <a href="Jörg Höhle.html" class="internal">Jörg Höhle</a><p>I did take a look at Marco's stuff and this one is quite similar to that, although I don't know if arnesi uses explicit environments or relies on captured variables like this one. Actually I could not figure it out probably because of my little lisp experience. -- <a href="Levente Mészáros.html" class="internal">Levente Mészáros</a><p>After consulting with Marco, this is somewhat different in that it does not maintain during runtime its own environment (e.g. variable bindings), but relies on the VM's and on the fact that closures capture it.<p>Discussing with David Lichteblau I think the closure (the continuation) that is returned can be saved and restored via SB-HEAPDUMP (in SBCL), so you may have persistent continuations. Well, you already have them in arnesi/cc in a somewhat different way. -- <a href="Levente Mészáros.html" class="internal">Levente Mészáros</a><p>I have added a persistent continuation test below.<p><h1>Code</h1><p><div class="code"><span class="nonparen"><span class="comment">#|
|
|
Copyright (C) 2006 Levente Mészáros melevy@freemail.hu
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
a copy of this software and associated documentation files (the
|
|
"Software"), to deal in the Software without restriction, including
|
|
without limitation the rights to use, copy, modify, merge, publish,
|
|
distribute, sublicense, and/or sell copies of the Software, and to
|
|
permit persons to whom the Software is furnished to do so, subject to
|
|
the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be
|
|
included in all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
Except as contained in this notice, the name of the author shall
|
|
not be used in advertising or otherwise to promote the sale, use or
|
|
other dealings in this Software without prior written authorization
|
|
from the author.
|
|
|#</span>
|
|
|
|
<span class="comment">;;; names that already present in common lisp preceded by @ sign for clarity
|
|
</span>
|
|
<span class="comment">;(declaim (optimize (debug 3) (safety 3) (speed 0) (space 0)))
|
|
</span><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_declaim.html" class="symbol">declaim</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">optimize</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">debug</a> 0</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">safety</a> 0</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">speed</a> 3</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">space</a> 0</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="comment">;; top level eval
|
|
</span><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> @<a href="https://www.cliki.net/site/HyperSpec/Body/fun_eval.html" class="symbol">eval</a> <span class="paren2">(<span class="nonparen">k</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_functionp.html" class="symbol">functionp</a> k</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> k #'ret/cc</span>)</span>
|
|
k</span>)</span></span>)</span>
|
|
|
|
<span class="comment">;; top level eval restaring each time a continuation is returned by @eval
|
|
</span><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> @eval* <span class="paren2">(<span class="nonparen">k</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">k k <span class="paren5">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/fun_eval.html" class="symbol">eval</a> k</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_not.html" class="symbol">not</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_functionp.html" class="symbol">functionp</a> k</span>)</span></span>)</span> k</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> cps-lambda <span class="paren2">(<span class="nonparen">&rest forms</span>)</span>
|
|
`<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren3">(<span class="nonparen">k</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">function</span></i></a> k</span>)</span></span>)</span>
|
|
,@forms</span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> ret/cc <span class="paren2">(<span class="nonparen">k</span>)</span>
|
|
k</span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmacro.html" class="symbol"><i><span class="symbol">defmacro</span></i></a> let/cc <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_doc_umentationcp.html" class="symbol">variable</a> &rest forms</span>)</span>
|
|
`<span class="paren2">(<span class="nonparen">call/cc
|
|
,<span class="paren3">(<span class="nonparen">cps-lambda
|
|
`<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen">,<a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_doc_umentationcp.html" class="symbol">variable</a> k</span>)</span></span>)</span>
|
|
,@forms</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defconstant.html" class="symbol"><i><span class="symbol">defconstant</span></i></a> +special-forms+
|
|
'<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_return-from.html" class="symbol"><i><span class="symbol">return-from</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_tagbody.html" class="symbol"><i><span class="symbol">tagbody</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_go.html" class="symbol"><i><span class="symbol">go</span></i></a> call/cc</span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> @special-form-p <span class="paren2">(<span class="nonparen">form</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> form</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_member.html" class="symbol">member</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_the.html" class="symbol"><i><span class="symbol">the</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_symbol.html" class="symbol">symbol</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">first</a> form</span>)</span></span>)</span> +special-forms+</span>)</span></span>)</span>
|
|
|
|
<span class="comment">;; macros to generate CPS transformed code
|
|
</span><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> cps-transform-forms <span class="paren2">(<span class="nonparen">forms</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> for f in forms
|
|
collect <span class="paren3">(<span class="nonparen">cps-transform-form f</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> cps-transform-forms* <span class="paren2">(<span class="nonparen">forms</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_append.html" class="symbol">append</a> '<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a></span>)</span> <span class="paren3">(<span class="nonparen">cps-transform-forms forms</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> cps-transform-form <span class="paren2">(<span class="nonparen">form</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> form <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_macroexpa_acroexpand-1.html" class="symbol">macroexpand</a> form</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_or.html" class="symbol">or</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_atom.html" class="symbol">atom</a> form</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_not.html" class="symbol">not</a> <span class="paren5">(<span class="nonparen">@special-form-p form</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">cps-lambda `<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> k ,form</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_casecm_ccasecm_ecase.html" class="symbol">ecase</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">first</a> form</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a>
|
|
<span class="paren5">(<span class="nonparen">cps-lambda `<span class="paren6">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> k ,<span class="paren1">(<span class="nonparen">cps-transform-forms* <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> form</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a>
|
|
<span class="paren5">(<span class="nonparen">cps-lambda `<span class="paren6">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> k ,@<span class="paren1">(<span class="nonparen">cps-transform-forms <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> form</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a>
|
|
#1=<span class="paren5">(<span class="nonparen">cps-lambda
|
|
`<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren1">(<span class="nonparen">,@<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> for b in <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">second</a> form</span>)</span>
|
|
collect <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">first</a> b</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> k
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> ,@<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> for b in <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">second</a> form</span>)</span>
|
|
collect `<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren5">(<span class="nonparen">v</span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> ,<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">first</a> b</span>)</span> v</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> ,@<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> for b in <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">second</a> form</span>)</span>
|
|
collect <span class="paren4">(<span class="nonparen">cps-transform-form <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">second</a> b</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
,<span class="paren2">(<span class="nonparen">cps-transform-forms* <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cddr</a> form</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a>
|
|
<span class="comment">;; TODO: this is a temporary hack
|
|
</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="string">"Warning: using let* instead of let: ~A"</span> form</span>)</span>
|
|
#1#</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a>
|
|
<span class="paren5">(<span class="nonparen">cps-lambda
|
|
`<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> ,<span class="paren1">(<span class="nonparen">cps-transform-form <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">third</a> form</span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren2">(<span class="nonparen">v</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> ,<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">second</a> form</span>)</span> v</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> k v</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a>
|
|
<span class="paren5">(<span class="nonparen">cps-lambda `<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren1">(<span class="nonparen"><span class="paren2">(<span class="nonparen">,<span class="paren3">(<span class="nonparen">safe-symbol <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">second</a> form</span>)</span></span>)</span> k</span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> k ,<span class="paren2">(<span class="nonparen">cps-transform-forms* <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cddr</a> form</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_return-from.html" class="symbol"><i><span class="symbol">return-from</span></i></a>
|
|
<span class="paren5">(<span class="nonparen">cps-lambda `<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> ,<span class="paren1">(<span class="nonparen">cps-transform-form <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">third</a> form</span>)</span></span>)</span> <span class="paren1">(<span class="nonparen">safe-symbol <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">second</a> form</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_tagbody.html" class="symbol"><i><span class="symbol">tagbody</span></i></a>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen">tagbody-forms <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> for f in <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> form</span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_listp.html" class="symbol">listp</a> f</span>)</span>
|
|
collect <span class="paren3">(<span class="nonparen">cps-transform-form f</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen">cps-lambda
|
|
`<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_fletcm_scm_macrolet.html" class="symbol"><i><span class="symbol">labels</span></i></a> <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">_tagbody_ <span class="paren4">(<span class="nonparen">v</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> k v</span>)</span></span>)</span>
|
|
,@<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> for f in <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> form</span>)</span>
|
|
with i = 0
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_not.html" class="symbol">not</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_listp.html" class="symbol">listp</a> f</span>)</span></span>)</span>
|
|
collect <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> <span class="paren5">(<span class="nonparen">safe-symbol f</span>)</span>
|
|
'<span class="paren5">(<span class="nonparen">k</span>)</span>
|
|
`<span class="paren5">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> k ,<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_append.html" class="symbol">append</a> '<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a></span>)</span> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_nthcdr.html" class="symbol">nthcdr</a> i tagbody-forms</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_listp.html" class="symbol">listp</a> f</span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">incf</a> i</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> k ,<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_append.html" class="symbol">append</a> '<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a></span>)</span> tagbody-forms</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_go.html" class="symbol"><i><span class="symbol">go</span></i></a>
|
|
<span class="paren5">(<span class="nonparen">cps-lambda `<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> #',<span class="paren1">(<span class="nonparen">safe-symbol <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">second</a> form</span>)</span></span>)</span> #'_tagbody_</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a>
|
|
<span class="comment">;; TODO: use type declarations
|
|
</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="string">"Warning: ignoring declaration ~A"</span> form</span>)</span>
|
|
<span class="paren5">(<span class="nonparen">cps-lambda '<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> k <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen">call/cc
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">second</a> form</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="comment">;; top level cps macro defines three functions: name @name and @name*
|
|
</span><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmacro.html" class="symbol"><i><span class="symbol">defmacro</span></i></a> @<a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> <span class="paren2">(<span class="nonparen">name args &rest forms</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">f <span class="paren5">(<span class="nonparen">cps-lambda
|
|
`<span class="paren6">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> k
|
|
,<span class="paren1">(<span class="nonparen">cps-transform-forms* forms</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
`<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> ,name ,args
|
|
,@forms</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> ,<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_intern.html" class="symbol">intern</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_concatenate.html" class="symbol">concatenate</a> '<a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> <span class="string">"@"</span> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_symbol-name.html" class="symbol">symbol-name</a> name</span>)</span></span>)</span></span>)</span> ,args
|
|
<span class="paren5">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/fun_eval.html" class="symbol">eval</a> ,f</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> ,<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_intern.html" class="symbol">intern</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_concatenate.html" class="symbol">concatenate</a> '<a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> <span class="string">"@"</span> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_symbol-name.html" class="symbol">symbol-name</a> name</span>)</span> <span class="string">"*"</span></span>)</span></span>)</span> ,args
|
|
<span class="paren5">(<span class="nonparen">@eval* ,f</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="comment">;;; special forms
|
|
</span><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> @<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> <span class="paren2">(<span class="nonparen">k forms</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">function</span></i></a> k</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> forms</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> forms</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_the.html" class="symbol"><i><span class="symbol">the</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">function</span></i></a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">car</a> forms</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren6">(<span class="nonparen">i</span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_ignorecm_ignorable.html" class="symbol">ignore</a> i</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> k <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> forms</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">forms <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_the.html" class="symbol"><i><span class="symbol">the</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">function</span></i></a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">car</a> forms</span>)</span></span>)</span> k</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> k <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> @<a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren2">(<span class="nonparen">k <a href="https://www.cliki.net/site/HyperSpec/Body/contyp_condition.html" class="symbol">condition</a> then &optional <span class="paren3">(<span class="nonparen">else <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">function</span></i></a> k <a href="https://www.cliki.net/site/HyperSpec/Body/contyp_condition.html" class="symbol">condition</a> then</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> <a href="https://www.cliki.net/site/HyperSpec/Body/contyp_condition.html" class="symbol">condition</a>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren4">(<span class="nonparen">v</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a> <span class="paren5">(<span class="nonparen">v <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> then k</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen">else <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> else k</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> k <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> @<a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <span class="paren2">(<span class="nonparen">k variables <a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> forms</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">function</span></i></a> k</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> variables <a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> forms</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_the.html" class="symbol"><i><span class="symbol">the</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">function</span></i></a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">car</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren5">(<span class="nonparen">v</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_the.html" class="symbol"><i><span class="symbol">the</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">function</span></i></a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">car</a> variables</span>)</span></span>)</span> v</span>)</span>
|
|
<span class="paren5">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> k <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> variables</span>)</span> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a></span>)</span> forms</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> k forms</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> safe-symbol <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_symbol.html" class="symbol">symbol</a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_intern.html" class="symbol">intern</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_concatenate.html" class="symbol">concatenate</a> '<a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> <span class="string">"@"</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_symbol-name.html" class="symbol">symbol-name</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_symbol.html" class="symbol">symbol</a></span>)</span> <span class="string">"@"</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="comment">;; for non CPS function
|
|
</span><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> call/cc <span class="paren2">(<span class="nonparen">k</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_ignorecm_ignorable.html" class="symbol">ignore</a> k</span>)</span></span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span></div><p><h1>Test</h1>
|
|
Try this to test (I have used LispWorks). Note how the continuation (a closure) is returned and reused. The speed is interestingly only x20 slower compared to normal compiled code. It probably comes from heavy memory usage as you can see from the timing.<p><pre>
|
|
CL-USER 7 > (@defun ii ()
|
|
(iter (for i from 0 to 3)
|
|
(call/cc #'ret/cc)
|
|
(collect i)))
|
|
@II*
|
|
|
|
CL-USER 8 > (ii)
|
|
(0 1 2 3)
|
|
|
|
CL-USER 9 > (@ii*)
|
|
(0 1 2 3)
|
|
|
|
CL-USER 10 > (@ii)
|
|
#<closure 206834B2>
|
|
|
|
CL-USER 11 > (@eval *)
|
|
#<closure 2068A0DA>
|
|
|
|
CL-USER 12 > (@eval *)
|
|
#<closure 2068D50A>
|
|
|
|
CL-USER 13 > (@eval *)
|
|
#<closure 20690FFA>
|
|
|
|
CL-USER 14 > (@eval *)
|
|
(0 1 2 3)
|
|
|
|
...
|
|
|
|
CL-USER 39 > (time (dotimes (x 100000) (ii)))
|
|
Timing the evaluation of (DOTIMES (X 100000) (II))
|
|
|
|
user time = 1.031
|
|
system time = 0.000
|
|
Elapsed time = 0:00:01
|
|
Allocation = 2464 bytes standard / 17603267 bytes conses
|
|
0 Page faults
|
|
NIL
|
|
|
|
CL-USER 40 > (time (dotimes (x 100000) (@ii*)))
|
|
Timing the evaluation of (DOTIMES (X 100000) (@II*))
|
|
|
|
user time = 18.328
|
|
system time = 0.000
|
|
Elapsed time = 0:00:18
|
|
Allocation = 821607408 bytes standard / 401503377 bytes conses
|
|
0 Page faults
|
|
NIL
|
|
|
|
CL-USER 41 >
|
|
|
|
CL-USER 42 > (@ii*)
|
|
(0 1 2 3)
|
|
</pre><p><h1>Expansion</h1><p>The above iter example expands into this:<p><div class="code"><span class="nonparen"><span class="paren1">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/fun_eval.html" class="symbol">EVAL</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren3">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">PROGN</span></i></a> K
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren6">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">LET</span></i></a> <span class="paren1">(<span class="nonparen"><span class="paren2">(<span class="nonparen">I <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">NIL</a></span>)</span> <span class="paren2">(<span class="nonparen"><span class="keyword">#:RESULT72</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">NIL</a></span>)</span> <span class="paren2">(<span class="nonparen"><span class="keyword">#:END-POINTER73</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">NIL</a></span>)</span> <span class="paren2">(<span class="nonparen"><span class="keyword">#:TEMP74</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">NIL</a></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">LET*</span></i></a> K
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">V</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> I V</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">V</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> <span class="keyword">#:RESULT72</span> V</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">V</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> <span class="keyword">#:END-POINTER73</span> V</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">V</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> <span class="keyword">#:TEMP74</span> V</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">K</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">NIL</a></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">K</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">NIL</a></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">K</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">NIL</a></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">K</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">NIL</a></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">LET</span></i></a> <span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen">@NIL@ K</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">PROGN</span></i></a> K
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_fletcm_scm_macrolet.html" class="symbol"><i><span class="symbol">LABELS</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">_TAGBODY_ <span class="paren5">(<span class="nonparen">V</span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K V</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen">@LOOP-TOP-NIL@ <span class="paren5">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren5">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">PROGN</span></i></a> K
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> I 1</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">V</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> I V</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K V</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">IF</span></i></a> K
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="paren5">(<span class="nonparen">> I 3</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren4">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> #'@LOOP-END-NIL@ #'_TAGBODY_</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
#'RET/CC
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">PROGN</span></i></a> K
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren5">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren1">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a> I</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren1">(<span class="nonparen">V</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> <span class="keyword">#:TEMP74</span> V</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K V</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren5">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren1">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">IF</span></i></a>
|
|
K
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren3">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="keyword">#:RESULT72</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren3">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a>
|
|
K
|
|
<span class="paren4">(<span class="nonparen">SEQ::SET-CDR
|
|
<span class="keyword">#:END-POINTER73</span>
|
|
<span class="keyword">#:TEMP74</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren3">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren5">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="keyword">#:TEMP74</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren5">(<span class="nonparen">V</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> <span class="keyword">#:RESULT72</span> V</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K V</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren1">(<span class="nonparen">V</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> <span class="keyword">#:END-POINTER73</span> V</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K V</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren5">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="keyword">#:RESULT72</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> #'@LOOP-TOP-NIL@ #'_TAGBODY_</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen">@LOOP-END-NIL@ <span class="paren5">(<span class="nonparen">K</span>)</span> <span class="paren5">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">PROGN</span></i></a> K <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">PROGN</span></i></a> K
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren6">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">K</span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K -1</span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">V</span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> I V</span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K V</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren6">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">K</span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> I 1</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">V</span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> I V</span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K V</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren6">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">IF</span></i></a> K
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">K</span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="paren3">(<span class="nonparen">> I 3</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> #'@LOOP-END-NIL@ #'_TAGBODY_</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
#'RET/CC
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren6">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">PROGN</span></i></a> K
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren3">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren5">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">LIST</a> I</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren5">(<span class="nonparen">V</span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> <span class="keyword">#:TEMP74</span> V</span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K V</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren3">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren5">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">IF</span></i></a> K
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren1">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="keyword">#:RESULT72</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren1">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a>
|
|
K
|
|
<span class="paren2">(<span class="nonparen">SEQ::SET-CDR
|
|
<span class="keyword">#:END-POINTER73</span>
|
|
<span class="keyword">#:TEMP74</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren1">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren3">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="keyword">#:TEMP74</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a>
|
|
<span class="paren3">(<span class="nonparen">V</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> <span class="keyword">#:RESULT72</span> V</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K V</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren5">(<span class="nonparen">V</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">SETQ</span></i></a> <span class="keyword">#:END-POINTER73</span> V</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K V</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren3">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="keyword">#:RESULT72</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren6">(<span class="nonparen">K</span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> #'@LOOP-TOP-NIL@ #'_TAGBODY_</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">LAMBDA</span></i></a> <span class="paren2">(<span class="nonparen">K</span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">DECLARE</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">TYPE</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">FUNCTION</span></i></a> K</span>)</span></span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">FUNCALL</a> K <span class="keyword">#:RESULT72</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span></div><p><h1>Persistent continuation</h1><p>Try <a href="SBCL.html" class="internal">SBCL</a> and <a href="SB-HEAPDUMP.html" class="internal">SB-HEAPDUMP</a> and the CPS transformation above on the following example.<p><div class="code"><span class="nonparen"><span class="comment">;(declaim (optimize (debug 3) (safety 3) (speed 0) (space 0)))
|
|
</span><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_declaim.html" class="symbol">declaim</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">optimize</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">debug</a> 0</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">safety</a> 0</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">speed</a> 3</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_optimize.html" class="symbol">space</a> 0</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_providecm_require.html" class="symbol">require</a> <span class="keyword">:iterate</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_providecm_require.html" class="symbol">require</a> <span class="keyword">:sb-heapdump</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_use-package.html" class="symbol">use-package</a> <span class="keyword">:iterate</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_use-package.html" class="symbol">use-package</a> <span class="keyword">:sb-heapdump</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_load.html" class="symbol">load</a> <span class="string">"test/cps.lisp"</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> store-continuation <span class="paren2">(<span class="nonparen">k</span>)</span>
|
|
<span class="paren2">(<span class="nonparen">sb-heapdump::dump-object k <span class="string">"continuation.heap"</span> <span class="keyword">:force</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="keyword">:if-exists</span> <span class="keyword">:rename-and-delete</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> restore-continuation <span class="paren2">(<span class="nonparen"></span>)</span>
|
|
<span class="paren2">(<span class="nonparen">load-dumpfile <span class="string">"continuation.heap"</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> demo <span class="paren2">(<span class="nonparen"></span>)</span>
|
|
<span class="paren2">(<span class="nonparen">iter <span class="paren3">(<span class="nonparen">for i from 0 to 3</span>)</span>
|
|
<span class="paren3">(<span class="nonparen">call/cc #'ret/cc</span>)</span>
|
|
<span class="paren3">(<span class="nonparen">collect i</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> @start <span class="paren2">(<span class="nonparen">f</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">k <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> f</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">store-continuation k</span>)</span>
|
|
k</span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> @<a href="https://www.cliki.net/site/HyperSpec/Body/any_continue.html" class="symbol">continue</a> <span class="paren2">(<span class="nonparen"></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">k <span class="paren5">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/fun_eval.html" class="symbol">eval</a> <span class="paren6">(<span class="nonparen">restore-continuation</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">store-continuation k</span>)</span>
|
|
k</span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> @run <span class="paren2">(<span class="nonparen">f</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">k <span class="paren5">(<span class="nonparen">@start f</span>)</span> <span class="paren5">(<span class="nonparen">@<a href="https://www.cliki.net/site/HyperSpec/Body/any_continue.html" class="symbol">continue</a></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_not.html" class="symbol">not</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_functionp.html" class="symbol">functionp</a> k</span>)</span></span>)</span> k</span>)</span></span>)</span></span>)</span></span></div><p><h1>Persistent continuation test</h1><p>The following is a test session using SBCL. Note where the system was restarted and how the continuation is used.<p><pre>
|
|
CL-USER> (@start #'@demo)
|
|
24576 bytes written
|
|
#<CLOSURE (LAMBDA (I)) {B2E6A5D}>
|
|
CL-USER>
|
|
; SBCL Port: 32822 Pid: 14363
|
|
...
|
|
CL-USER> (@continue)
|
|
; loading continuation.heap[0] mmap 0.0s fixup 0.001s done
|
|
24576 bytes written
|
|
#<CLOSURE (LAMBDA (I)) {B394CA5}>
|
|
CL-USER>
|
|
; SBCL Port: 32824 Pid: 14729
|
|
...
|
|
CL-USER> (@continue)
|
|
; loading continuation.heap[0] mmap 0.0s fixup 0.0s done
|
|
24576 bytes written
|
|
#<CLOSURE (LAMBDA (I)) {B3BC4D5}>
|
|
CL-USER> (@continue)
|
|
; loading continuation.heap[0] mmap 0.002s fixup 0.001s done
|
|
24576 bytes written
|
|
#<CLOSURE (LAMBDA (I)) {B3E44FD}>
|
|
CL-USER> (@continue)
|
|
; loading continuation.heap[0] mmap 0.0s fixup 0.0s done
|
|
4096 bytes written
|
|
(0 1 2 3)
|
|
CL-USER> (@run #'@demo)
|
|
49152 bytes written
|
|
; loading continuation.heap[0] mmap 0.001s fixup 0.0s done
|
|
49152 bytes written
|
|
; loading continuation.heap[0] mmap 0.0s fixup 0.001s done
|
|
49152 bytes written
|
|
; loading continuation.heap[0] mmap 0.001s fixup 0.0s done
|
|
49152 bytes written
|
|
; loading continuation.heap[0] mmap 0.003s fixup 0.001s done
|
|
4096 bytes written
|
|
(0 1 2 3)
|
|
</pre><p><hr>
|
|
<a href="programming tips.html" class="category">programming tips</a></div></div>
|
|
<div id="footer" class="buttonbar"><ul><li><a href="CPS.html">Current version</a></li>
|
|
<li><a href="https://www.cliki.net/site/history?article=CPS">History</a></li>
|
|
<li><a href="https://www.cliki.net/site/backlinks?article=CPS">Backlinks</a></li><li><a href="https://www.cliki.net/site/edit-article?title=CPS&from-revision=3838651606">Edit</a></li><li><a href="https://www.cliki.net/site/edit-article?create=t">Create</a></li></ul></div>
|
|
</div>
|
|
<div id="header-buttons" class="buttonbar">
|
|
<ul>
|
|
<li><a href="https://www.cliki.net/">Home</a></li>
|
|
<li><a href="https://www.cliki.net/site/recent-changes">Recent Changes</a></li>
|
|
<li><a href="CLiki.html">About</a></li>
|
|
<li><a href="Text Formatting.html">Text Formatting</a></li>
|
|
<li><a href="https://www.cliki.net/site/tools">Tools</a></li>
|
|
</ul>
|
|
<div id="search">
|
|
<form action="https://www.cliki.net/site/search">
|
|
<label for="search_query" class="hidden">Search CLiki</label>
|
|
<input type="text" name="query" id="search_query" value="" />
|
|
<input type="submit" value="search" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<div id="pageheader">
|
|
<div id="header">
|
|
<span id="logo">CLiki</span>
|
|
<span id="slogan">the common lisp wiki</span>
|
|
<div id="login"><form method="post" action="https://www.cliki.net/site/login">
|
|
<label for="login_name" class="hidden">Account name</label>
|
|
<input type="text" name="name" id="login_name" class="login_input" />
|
|
<label for= "login_password" class="hidden">Password</label>
|
|
<input type="password" name="password" id="login_password" class="login_input" />
|
|
<input type="submit" name="login" value="login" id="login_submit" /><br />
|
|
<div id="register"><a href="https://www.cliki.net/site/register">register</a></div>
|
|
<input type="submit" name="reset-pw" value="reset password" id="reset_pw" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body></html> |