emacs.d/clones/lisp/www.cliki.net/memoize-form.html
2022-10-07 15:47:14 +02:00

72 lines
No EOL
9.9 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>CLiki: memoize-form</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=memoize-form">
<link rel="stylesheet" href="static/css/style.css">
<link rel="stylesheet" href="static/css/colorize.css">
</head>
<body>
<span class="hidden">CLiki - memoize-form</span>
<div id="content"><div id="content-area"><div id="article-title">memoize-form</div><div id="article">A simpler need than memoizing the results of a function with arguments is that of memoizing the results of a form. The tricky thing here is to do it just inline in the code, without using a global variable or such.<p><div class="code"><span class="nonparen"><span class="comment">;; (MEMOIZED form) memoizes the result of form from its first evaluation.
</span><span class="comment">;; Use like this:
</span><span class="comment">;; (defun secret-password (...) ....... (memoized (random 1000)) ......)
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_eval-when.html" class="symbol"><i><span class="symbol">eval-when</span></i></a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_compile.html" class="symbol">compile</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_load.html" class="symbol">load</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_eval.html" class="symbol">eval</a></span>)</span>
<span class="paren2">(<span class="nonparen"><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_eval.html" class="symbol">eval</a> '<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_fletcm_scm_macrolet.html" class="symbol"><i><span class="symbol">flet</span></i></a> <span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen">ltv <span class="paren1">(<span class="nonparen"></span>)</span> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_load-time-value.html" class="symbol"><i><span class="symbol">load-time-value</span></i></a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_cons.html" class="symbol">cons</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a> <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="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_eq.html" class="symbol">eq</a> <span class="paren6">(<span class="nonparen">ltv</span>)</span> <span class="paren6">(<span class="nonparen">ltv</span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_pushnew.html" class="symbol">pushnew</a> <span class="keyword">:eval-uses-compiler</span> <a href="https://www.cliki.net/site/HyperSpec/Body/var_stfeaturesst.html" class="symbol"><span class="special">*features*</span></a></span>)</span></span>)</span></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> memoized <span class="paren2">(<span class="nonparen">form</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">MEMORY
<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> #-eval-uses-compiler <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_eval-when.html" class="symbol"><i><span class="symbol">EVAL-WHEN</span></i></a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_eval.html" class="symbol">EVAL</a></span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">T</a></span>)</span> #+eval-uses-compiler <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">NIL</a>
',<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_cons.html" class="symbol">cons</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span>
<span class="comment">;; Careful: Different expansions of MEMOIZED forms must yield
</span> <span class="comment">;; LOAD-TIME-VALUE forms that are not EQ, otherwise compile-file
</span> <span class="comment">;; will coalesce these LOAD-TIME-VALUE forms. Therefore here we
</span> <span class="comment">;; explicitly cons up the list and don't use backquote.
</span> ,<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> '<a href="https://www.cliki.net/site/HyperSpec/Body/speope_load-time-value.html" class="symbol"><i><span class="symbol">LOAD-TIME-VALUE</span></i></a> '<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_cons.html" class="symbol">CONS</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">NIL</a> <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 class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">UNLESS</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">CAR</a> MEMORY</span>)</span>
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">SETF</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">CDR</a> MEMORY</span>)</span> ,form</span>)</span>
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">SETF</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> MEMORY</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">T</a></span>)</span></span>)</span>
<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> MEMORY</span>)</span></span>)</span></span>)</span></span></div><p>You should probably be using either <a href="https://www.cliki.net/site/HyperSpec/Body/mac_defparametercm_defvar.html" class="hyperspec">DEFVAR</a>, <a href="https://www.cliki.net/site/HyperSpec/Body/speope_load-time-value.html" class="hyperspec">LOAD-TIME-VALUE</a>, or <a href="fare-memoization.html" class="internal">fare-memoization</a>:MEMOIZED-FUNCALL for local memoizations.<p><hr>
<a href="macro&#32;example.html" class="category">macro example</a></div></div>
<div id="footer" class="buttonbar"><ul><li><a href="memoize-form.html">Current version</a></li>
<li><a href="https://www.cliki.net/site/history?article=memoize-form">History</a></li>
<li><a href="https://www.cliki.net/site/backlinks?article=memoize-form">Backlinks</a></li><li><a href="https://www.cliki.net/site/edit-article?title=memoize-form&amp;from-revision=3799685172">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&#32;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>