Closures/Value capture: Difference between revisions

Content added Content deleted
imported>Arakov
imported>Rowsety Moid
No edit summary
Line 26: Line 26:
9
9
</pre>
</pre>

=={{header|Acornsoft Lisp}}==

Since this Lisp is dynamically scoped and does not have any built-in closure mechanism, we have to construct one.

<syntaxhighlight lang="lisp">
( (lambda ((a . 1) (b . 2))
(list a b)) )
</syntaxhighlight>

<syntaxhighlight lang="lisp">
(freeze '(a b) '(lambda (c) (list a b c)))
</syntaxhighlight>

would return

<syntaxhighlight lang="lisp">
(lambda (c)
((lambda ((a . 1) (b . 2))
(list a b c))))
</syntaxhighlight>

Here is the definition of <code>freeze</code>:

<syntaxhighlight lang="lisp">
(defun freeze (_fvars_ _lambda-expr_)
(freeze-vars
(mapc cons _fvars_ (mapc eval _fvars_))
(cadr _lambda-expr_)
(cddr _lambda-expr_)))

(defun freeze-vars (bindings lvars lbody)
(list 'lambda lvars
(list (cons 'lambda (cons bindings lbody)))))
</syntaxhighlight>

Once we have <code>freeze</code>, we can create a list of square-returning functions and then call them:

<syntaxhighlight lang="lisp">
(defun range (from to)
(cond ((greaterp from to) '())
(t (cons from (range (add1 from) to)))))

(defun example ()
(mapc '(lambda (f) (f))
(mapc '(lambda (i)
(freeze '(i) '(lambda () (times i i))))
(range 1 10))))
</syntaxhighlight>

{{Out}}

<code>(example)</code> returns
<pre>(1 4 9 16 25 36 49 64 81 100)</pre>

=={{header|Ada}}==
=={{header|Ada}}==