Closures work.
[Thread Prev] | [Thread Next]
- Subject: Closures work.
- From: Ori Bernstein <ori@xxxxxxxxxxxxxx>
- Date: Sun, 27 Sep 2015 22:56:08 -0700
- To: myrddin-dev@xxxxxxxxxxxxxx
You can now capture environments. Fixing this has been a
long time coming. It should make things like std.sort
more useful, and simplify writing code that fills the
same niche as C++'s std::algorithm
Example below:
use std
const main = {
var x, y, yp, fn
x = 123
y = 234
yp = &y
fn = {
std.put("closure/pre:\tx={}, y={}, yp#={}\n", x, y, yp#)
x = 555
yp# = 666
std.put("closure/post:\tx={}, y={}, yp#={}\n", x, y, yp#)
}
std.put("outer/pre:\tx={}, y={}, yp#={}\n", x, y, yp#)
fn()
fn()
std.put("outer/post:\tx={}, y={}, yp#={}\n", x, y, yp#)
}
You can build and run, and get this output:
$ mbld -b t t.myr
t...
6m -I /home/ori/bin/lib/myr t.myr
ld -o t /home/ori/bin/lib/myr/_myrrt.o t.o -L/home/ori/bin/lib/myr -lstd -lsys
$ ./t
outer/pre: x=123, y=234, yp#=234
closure/pre: x=123, y=234, yp#=234
closure/post: x=555, y=234, yp#=666
closure/pre: x=555, y=234, yp#=666
closure/post: x=555, y=234, yp#=666
outer/post: x=123, y=666, yp#=666
Note, this demonstrates a couple of interesting things:
1) The outer variables are not modified.
2) We can get pointers to the outer environment if we need to mutate it.
3) The captured variables keep their values between invocations of the
closure
The last point can maybe be used towards implementing generators. Or maybe I should
make captures just be const.
ABI-wise, this makes function pointers fat -- they have both an env pointer
and a code pointer.
--
Ori Bernstein
| Re: Closures work. | Ryan Gonzalez <rymg19@xxxxxxxxx> |
- Prev by Date: Libthread is on the way.
- Next by Date: Re: Closures work.
- Previous by thread: Libthread is on the way.
- Next by thread: Re: Closures work.
- Index(es):