►
From YouTube: SES Meeting: Boxes ad nauseam
Description
Mathieu Hofman and Daniel Ehrenberg lead a discussion on Boxes and their design trade-offs.
A
All
right
welcome
to
the
test.
Meeting
matteo
you
and
daniel
have
a
conversation
about
boxes.
B
Yeah,
so
I
I
need
to
so
after
the
conversation
last
week
I
was
sent
an
existing
guest
where
the
interaction
of
boxes
and
proxies
was
already
being
discussed
like
and
analyzed
last
year,
really
great
stuff
there,
and
I
think,
thinking
about
that,
like
it
comes
down
to
the
fact
that
a
proxy
in
front
of
a
box,
in
my
opinion,
no
matter
what
will
always
will
never
be
fully
transparent,
you
will
be
able
to
realize
it
is
a
proxy,
no
sorry
not
for
a
box
for
a
record
or
a
couple,
because
when
you
create
a
new
record
or
tuple
that
contains
the
same
data,
it's
no
matter
what
it's
supposed
to
give
you
back
something
that
has
the
same
identity.
B
So
if
you
go
in
and
spread
a
record
all-
and
you
can
verify
that
what
you
get
from
just
the
spreading
is-
is
triple
equal
to
what
you
gave
it
to
what
you
spread.
Of
course,
if
what
you
spread
is
actually
a
proxy
of
something
that
will
give
you
a
real
record
and
not
a
proxy
of
the
thing,
so
you
will
be
able
to
realize
that
what
you
had
in
the
first
place
was
a
proxy
and
not
a
a
record.
B
So
if
we
move
away
from
like
trying
to
make
proxies
of
record
and
tuples
behave
like
records
and
tuples
like
their
identity
and
just
them
being
objects,
then
it
then
they're
just
any
other
object
that
has
the
same
content
as
a
record
in
tuple.
What
might
happen
is
that
their
prototype
might
actually
be
a
tuple
prototype,
but
again
you
should
be
able
to
construct
an
object
that
way.
B
Actually,
I'm
not
sure
how
that
would
behave,
but
you
you
have
the
instance
of
behavior
and
and
and
in
general,
like
a
full
membrane,
would
probably
create
a
proxy
for
the
prototype
object.
So
it's
not
really
a
problem.
You
wouldn't
be
able
to
re.
It
would
behave
like
an
object.
Basically,
in
the
context
of
membranes,
I
believe
we
still
do
want
to
be
able
to
efficiently
somewhat
efficiently
pass
records
and
tuples
through
without
having
to
go
and
deeply
find
or
and
by
efficiently.
B
I
mean
a
way
to
go
in,
find
all
the
boxes
and
be
able
to
replace
the
content
of
the
box
with
a
proxy
of
the
box
and
the
the
difference
with
a
regular
object
in
between
regular
object
and
record
in
temples
is
that
you
have
to
deeply
go,
find
all
those
mutable
places
in
the
record
or
temple.
B
B
So
what
I'm
suggesting
is
helpers
for
boxes
that
allow
to
find
boxes
in
a
record
or
temple?
However,
deep
they
may
be,
and
a
map
helper
to
be
able
to
map
a
box
with
another
box,
and
I
think
the
last
interaction
with
the
callable
realm
or
whatever
name
it
will
be,
would
be
maybe
to
have
boxes
of
functions,
be
automatically
replaced
for
a
box
box
of
an
exotic
wrapper
function.
So
the
same
way,
currently
you
pass
a
function
through
the
callable
boundary.
B
B
The
membrane
would
be
able
to
go
in
and
say
like:
okay,
all
those
identity,
things
in
the
boxes,
replace
them
with
the
magic
function
that
similar
to
what
is
done
currently
in
in
the
membrane.
B
B
On
the
other
side,
you
have
boxes
with
all
those
you
again
tear
it
over
those
boxes
that
function
and
you
create
a
proxy
from
all
those
wrapped
functions
on
the
other
side,
and
so
now
you
re
you
recreate
a
record
on
the
other
side
that
has
the
same
structure
and
now
that
contains
proxy
objects
for
everything
that
had
an
identity
on
before
sending
through
the
membrane.
C
D
Now
so
before
we
go
down
to
the
rabbit
hole
there.
I'm
from
my
understanding
up
to
this
point
it
was
that
the
record
would
not
be
duplicated
when
going
through
the
the
callable
boundary
you
get.
The
record
on
the
other
side
is
when
you
try
to
access
something
out
of
the
box,
that
we
can
do
something
about
it
and
the
second
part
of
it
is
that
initially
we
say
well,
if
you
do
have
a
box,
then
you
cannot
send
it.
D
C
Sorry,
carry
that
doesn't
correspond
to
the
current
version
of
the
proposal.
The
current
version
of
the
proposal
is
that
it
would
throw
if
the
box
contains
an
object.
It
wouldn't
do
this
deferred,
deferred
error,
and
the
reason
for
that
was
because
this
round-tripping
concern
that
that
bradley
raised
that
you
know
you
can
kind
of
round
trip
an
object
if
we
allowed
that
through
a
box,
and
so
we
decided
to
just
be
more
restrictive
at
first
about
the
membrane
over
record
and
temple.
C
There
were
some
parts
that
there
of
that
idea
that
I
that
I
liked
that
seemed
interesting,
and
there
were
some
parts
that
I
wasn't
quite
convinced
by.
So
I'm
pretty
sure
that
if
we
have
a
membrane
over
record
or
tuple,
it
should
preserve
that
they,
it
is
a
record
or
tuple.
So
that
means
two
things.
C
One
thing
is
that
it
would
return
true
from
like
record
dot
is
record
and
double
dot
is
tuple,
which
I
think
are
predicates
that
we
agree
would
need
to
exist,
and
the
other
thing
is
that
the
triple
equals,
or
that
is
based
structural,
deep
equality
works.
I
think
it's
important.
Those
are,
those
are
key
to
the
programming
model
and
and
membrane
should
should
work
with
them.
D
C
D
This
thing
sorry,
sorry
danny,
like
I'm,
trying
to
understand
so
based
on
the
idea
that
we
would
that
any
idea
that
we
already
agree
on
at
some
point
that
you
would
not
be
able
to
send
any
record
tuple
if
he
has
a
box
on
it.
Okay,
so
if
that's
a
case,
then,
when
the
record
goes
through
the
membrane,
while
the
expectation
is
that
the
record
will
just
be
passed
through
like
any
other
primitive
value,
you
don't
need
to
throw
a
proxy
around
it
is
that
it.
C
No,
the
no
the
expectation
is
written
in
nicolo's
document
is
that
if
it
contains
a
box
that
contains
an
object,
then
you
have
to
eagerly
convert
it.
So
I
liked
the
idea
from
matthieu's
exposition
that
we
could
have
some
way
to
look
through
some
nested
records
and
tuples
and
find
all
the
boxes
containing
objects
all
these
exit
points
and
map
them.
So
right
now,
that's
possible
to
do
manually
eagerly
and
what
I
think
what
we
would
want
is
a
way
to
do
this
lazily.
C
So
what
if
we
had
a
form
of
record
or
tuple
or
box
that
was
like
well,
this
is
a
mapped
record
or
tuple
or
box.
So
when
you
access
it,
when
you
reach
one
of
these
exit
points,
then
if
it's
the
first
time
you
reach
one
of
these
exit
points,
then
a
function
gets
applied
to
the
contents
of
the
box
or
it
gets
applied
to
something
I'm
not
sure
exactly
what
the
contents
of
the
box.
I
guess
that
doesn't
really
work
because
you're
on
the
wrong
side
of
the
membrane.
Already,
oh.
C
It
will,
you
know,
linearly,
go
through
it,
compare
the
different
parts
and
so
it'll
end
up
forcing
in
terms
of
where
by
force
I
mean
like
in
lazy,
evaluation
terms,
any
parts
of
it
that
it
reaches
and
once
those
are
forced
then
they'll
be
cached
in
the
object
in
the
record
or
chapel.
A
A
A
So
I
have
two
mappings
just
like
we're
talking
about
right
now
and
when
you
go,
and
you
actually
want
to
look
up
the
value
of
that
symbol,
it
fires
a
trap
which
is
essentially
a
getter.
It's
not
as
full
featured
as
a
getter.
It
just
causes
you
to
reify
the
identity
and
once
it's
reified,
it
never
changes.
A
So
it
sounds
like
similar
to
what
I'm
doing
here.
We
want
to
perform
a
map
operation
on
a
record
or
tuple,
which
is
a
deeply
immutable
data
structure,
and
it
has
some
small
parts
of
it
which
we
want
to
lazily
compute,
the
value
of
when
they're
accessed
and
those
need
to
be
accessed
in
order
to
form
an
identity.
A
C
Well,
then,
we
have
a
choice
between
either
we're
going
to
trap
the
either
we're
going
to
do
what
you
suggested
and
say.
Well,
these
are
just
no
longer
records
and
tuples.
They
don't
have
this
identity
or
we're
going
to
have
to
force
the
entire
thing
whenever
the
identity
is
needed.
Yeah,
I
don't
think
there's
a
third
path.
E
I
think
there
is
a
third
path.
The
I
I'll
lay
out
the
third
path
before
explaining
why
I
think
the
paths
laid
out
so
far
break
fundamental
invariance
that
we
must
not
break
so
the
third
path.
E
I
depends
on
an
idea,
I
think,
originally
from
daniels
from
daniel,
and
let
me
start
with
the
duncan
experiment
in
a
world
without
records
and
tuples
with
just
the
world
of
objects
that
we
have
now
and
membranes
that
we
have
now
also,
you
know
no
callable
boundary,
so
we
don't
have
to
worry
about
the
complexity
of
a
columnar
boundary
right
now,
when
you
do
a
membrane,
you
have
to
do
a
shadow
target
if
the
shadow
target
is
if
the,
if
the
original,
if
the
object,
if
the
you
know
the
the
real
target
is
a
a
frozen
object,
then
the
shadow
target
will
eventually
be
a
a
similarly
frozen
object.
E
But
it's
shadow
because
the
properties
point
at
correspond.
You
know
the.
If
the.
If
the
real
target
is
yellow,
yellow,
then
the
shadow
target
is
blue
and
the
the
properties
of
the
real
target
point
at
other
yellow
objects.
The
property
of
the
shadows
target
pointed
other
blue
targets,
which
is
why
there's
a
shadow
target
now
the
gedonka
experiment
is
in
the
case
where
there
is
no
distortion.
E
Do
you
need
a
a
proxy
on
the
shadow
target,
or
could
the
blue
object
corresponding
to
the
yellow
real
target?
Could
the
blue
object
instead
just
be
the
shadow
target
itself?
In
other
words,
having
constructed
the
blue
shadow
target
to
represent
the
yellow
real
target
is.
Are
you
if
there's
no
distortion
is
any
purpose
being
served
by
wrapping
a
proxy
around
the
shadow
target,
rather
than
just
using
the
shadow
target?
E
The
way
you
would
have
used
the
proxy
and
there
and
there's
one
issue
in
the
gaddafi
experiment
that
I
want
to
set
aside,
which
is
cycles
in
order
to
use
the
shadow
target
immediately,
you
can't
lazily
create
it.
The
thing
the
proxy
gives
you
is
the
ability
to
lazily
create
it.
E
E
D
E
Yeah-
and
I
think
I
think
I
think
that
I
think
that
breaking
the
lazy,
I
think
of
all
the
things
we
need
to
break
here.
I
think
the
lazy
creation
is
the
thing
is
the
thing
that
we
can
most
afford
to
break
and
because
there's
no
cycles,
it's
just
an
issue
of
taking
the
cost
upfront
versus
spreading
it
out
over
time.
B
I
think
this
is
not
quite
what
I
was
saying,
so
what
I
was
saying
is-
and
I
think
we
all
agree
here,
since
there
is
no
way
what
I
said
is
like
a
proxy
in
front
of
recordable,
especially
if
it's
implemented
as
a
identity-less
object,
so
type
off
equals
object
will
always
be
observable
as
as
is
so.
The
only
path
that
you
have
at
that
point
is
to
eagerly
create
your
your
deeply
frozen
object
or
slash
record.
B
I
want
a
next
step
after
that,
which
is
why
why
can't
we
use
records
and
tuples?
Can
we
somehow
use
records
and
tuples
to
efficiently
recreate
that
that
that
duplicate,
that
structure.
D
E
C
E
Points
as
well
about
how
some
of
the
other
solutions
here
break
some
things
that
I
think
we
desperately
need
not
to
break
for
for
reasons
much
deeper
than
you
know,
much
much
bigger
than
performance
reasons.
One
thing
is
identity.
Checks
must
be,
must
not
introduce
potential
interleaving
points.
A
trap
on
an
identity
check
introduces
an
interleaving
point
right
now,
where
javascript
is
safe
from
interleaving
points.
I
know
that
I
can.
E
I
can
take
two
objects
that
I
don't
trust
a
and
b
and
say
a
triple
equal
b
without
turning
control
over
to
code
that
I
that
that
I'm
not
in
control
of
code
provided
by
the
providers
of
a
and
b
exactly.
D
D
To
I
was
trying
to
I,
I
feel
that
you
guys
are
a
lot
ahead
of
myself,
so
I'm
still
stuck
back
in
in
in
a
very
specific
question,
okay,
which
I
believe
correspond
to
what
mark
was
saying
and
the
the
the
description
that
you
gave
about
the
shadow
target
and
so
on.
So
I
want
to
see
you
can
help
me
to
clarify
what
the
position
is
there.
D
It
is
important
that
the
to
understand
that
the
callable
boundary
doesn't
give
you
access
to
both
sides
of
the
fence.
That's
the
principle
that
you
don't
have
access
to
both
objects
graph.
Therefore,
if
you
get
a
record
on
one
side
and
you
want
to
create
a
similar
record
on
the
other
side-
that's
problematic
on
itself
and
when
you
bring
boxes
into
the
picture
is
also
very
problematic.
D
I
I
believe
the
problem
the
it
might
be-
that
is,
efficiency,
is
one
of
the
problems
that,
but
I'm
not
sure,
so
I'm
trying
to
explain
what
what
I
believe
the
problems
are.
Let
me
explain
it
very
quickly.
So
if
I
get
the
record
here
and
I
detect
that
the
record
is
going
to
go
through
the
call
of
a
boundary,
I
need
to
do
some
operations
to
either
create
a
similar
record.
On
the
other
side,
somehow-
or
I
built
a
record
that
I
gave
to
you-
those
are
the
two
options.
D
The
problem
with
the
second
option
is
that
the
new
record
that
we
create
is
the
same
color
of
the
side
of
the
membrane.
That
is,
that
has
the
original
record,
so
you
want
to
traverse
and
find
out
the
boxes
and
replace
those
boxes
with
something
else
that
doesn't
work
right,
because
the.
D
So
if
that's
the
case,
if
they
it's
obviously
more
efficient,
it's
the
identity
issue,
it's
no
longer
a
problem
because
they
go
go
back
and
forward.
Then
the
problems
are
the
boxes
like
how
can.
A
C
C
Record
and
temple
proposal
says
you
cannot
transport
them
across
the
boundary
if
they
contain
a
box
that
contains
an
object,
and
you
can
if
they
don't
contain
a
box
that
contains
an
object.
So
the
way
that
to
get
back
to
matthew's
question
about
efficiency
is
the
way
that
the
record
and
trouble
proposal
enables
efficiencies
by
providing
this
operation
to
check
whether
you
deeply
contain
an
object.
This
is
where
we
came
to
in
the
discussion
a
while.
D
C
C
D
C
Deal
so
when
we
have
boxes,
we
pass
it
over
in
piece
by
piece
and
when
we
don't
have
boxes,
then
we
pass
the
whole
thing
over.
So
the
the
case
with
boxes
is
just
like
when
you
have
an
object
and
want
to
kind
of
represent
it
on
the
other
side,
and
you,
you
know,
pass
over
different
incremental
pieces
of
information
in
terms
of
primitives.
C
E
In
the
same
way,
it
would
mean
the
same
thing
that
there
cannot
be
if
a
if
a
object
is
b,
there
can't
be
any
observable
difference
between
a
and
b
and
therefore,
a
record
and
tuple,
and
a
proxy
with
behavior
on
a
record
in
tuple
cannot
be
triple.
E
Equal
cannot
be
object
is
so,
therefore,
I
believe
that
this
eager
creation
of
the
what
what
corresponds
to
the
shadow
target,
it's
as
if
you're
creating
the
shadow
target
structure,
but
without
wrapping
it
with
a
proxy
that
that
that's
really
the
only
solution
for
the
record
and
tuple
superstructure
over
the
box.
B
Which
yeah,
so
I
think
the
problem
in
what
I
presented
earlier
is
that
I
went
straight
to
my
conclusion
without
going
through
the
steps
of
my
thinking
last
week,
and
I
probably
should
have
gone
through
that
to
help
answer
a
lot
of
charities
and
mark's
questions.
So
basically
we
all
arrived
at
the
same
conclusion.
You
need
to
eagerly
recreate
the
structure.
On
the
other
end,
the
immutable
structure.
B
B
You
recreate
a
record
that
has
same
structure
on
on
the
other
side,
where
all
the
boxes
have
been
substituted
for
a
box
of
a
proxy
and
as
daniel
mentioned
like
you
can
do
that
multiple
ways
you
can
remove
all
the
boxes
and
then
say
at
all
these
locations
in
the
record,
you're
gonna
be
recreating
a
box
with
all
this
information
and
to
make
that
somewhat
more
optimal,
I
figured
we
could
rely
on
the
callable
boundary
to
allow
a
box
of
a
function
and
for
it
to
be
automatically
substituting
substituting
it
for
a
box
of
a
function.
B
Exotic
wrapper
so
now,
when
it
gets
on
the
other
side,
the
other
side
can
go
in
and
create
a
proxy
with
just
that.
It
doesn't
have
to
eagerly
go
deep
in
that
in
that
proxy.
It
just
can
create
those
proxy
objects.
Those
exit
points
in
in
and
and
recreate
a
record
that
way,
so
that
that
is
the
eager
recreation
of
the
immutable
structure.
D
So
a
couple
of
comments
on
these,
so
the
efficiency
side
of
things.
I
think
we
could
kind
of
solve
it
somehow
I
it
would
be
tricky,
but
it
would
be
a
good
exercise
to
try
to
recreate
a
record
tuple
on
the
other
side
that
has
boxes
and
then
proxy
those
boxes.
Somehow,
on
the
other
side,
I
imagine
that
we
could
create
a
kind
of
a
a
a
record
that
where
the
box
exists,
you
put
a
symbol
that
you
understand.
That
is
a
symbol
that
needs
to
be
replaced
with
the
box.
D
D
The
final
record
tuple
on
the
other
side,
not
super
efficient,
but
I
I
I
hope
that
we
can
make
it
fast
enough
and
providing
some
library,
so
people
can
do
that
efficiently
or
at
least
not
super
slow,
but
the
the
second
part
of
allowing
boxes
to
be
to
to
go
through
when
they
are
boxing
over
a
collar
ball.
D
That
seems
a
very
interesting
thing
to
me
to
explore.
I
feel
that
then,
the
api
of
determining
something
has
boxes
on
it
might
be
insufficient
because
you,
you
need
to
know
okay,
it
has
boxes,
but
add
those
boxes,
functions,
callables
and
then
go
and
do
a
a
a
a
a
type
off
or
something
on
all
these
things
to
see.
If
it's
callable
and
then
you
let
it
pass.
Otherwise
you
do
something
else.
I
rather
prefer
to
have
a.
D
We
tell
you
that
there
are
boxes.
We
tell
you
that
information,
you
decide
whether
or
not
you
wanted
to
pass
it
anyways,
you
pass
it
anyways,
you
try
to
access,
and
then
it
throws
on
axis.
If
it
is
not
a
a
callable
boundary,
it
seems
like
to
me
that
that
that
seems
a
little
bit
better
easier
and
more
efficient.
B
Wouldn't
the
membrane
always
even
for
a
function
always
create
a
proxy
for
that
function,
because
we
don't
know
what
might
be
attached
to
that
function
anyway.
So
for
the
efficiency
of
the
membrane,
the
membrane
would
go
in
and
no
matter
what
it
gets,
an
objective
function
or
whatever
it
would,
it
would
create
it
would.
Oh
yeah.
D
D
Sorry
just
to
answer
that
question
it
will
help,
but
you
still
have
to
traverse
and
create
a
new,
a
new
record
before
you
let
the
record
to
pass
through.
Like
you
had
the
arena
yellow
record,
you
had
to
create
like
a
a
similar
to
a
shadow
target
as
a
shadow
record,
let's
say
shadow
record
that
one
has
to
have
the
the
the
the
the
same
shape.
But
then
you
have
to
change
the
boxes
with
the
proxies
of
the
arena
box
value.
E
The
easy,
the
easy
way
to
say
it
is
that
if
the
real
record
points
of
blue
things,
I'm
sorry
yellow
things,
then
the
shadow
record
has
the
same
shape
at
points
of
blue
things.
Yep.
B
Yeah
and
that's
where
I
believe,
a
native
helper
to
map
boxes
in
an
existing
record
can
be
a
lot
more
efficient,
because
the
structure
of
the
record
itself
doesn't
change.
It's
just
the
boxes
and
that
that
does
so.
D
B
Optimizations
possible
if
the
engine
natively
can
do
the
mapping
of
the
boxes,
so
I
think
that
I'd
be
interested.
D
You're
right
daniel
you're
right
it
doesn't
work.
It
doesn't
work
because
for
you
to
create
a
record
that
points
to
blue
things,
you
will
not
be
able
to
transfer
that
through
the
call
of
a
bundle
anymore.
You
do
too
much.
B
You
do
mapping,
so
the
the
membrane
on
one
side
does
a
mapping
of
all
the
boxes
that
contain
objects,
functions
or
whatever
to
the
special
membrane
function,
and
so
now
the
record
only
contained
boxes
of
the
membrane
function
that
can
be
used
that
can
be
transferred.
On
the
other
side,
it
will
be
exotic
wrapped.
On
the
other
side,
you
map
again
that
record
with
the
same
structure
again,
and
you
create
boxes
of
proxies
using
your
your
membrane
function.
That
has
been.
D
B
Yeah
advantage
is
that
if
you
keep
a
box
in
the
same
place,
you
keep
the
structure
entirely.
You
keep
the
structure
the
same.
You
just
have
boxes
with
different
content,
so
my
hope
is
that
the
engine
can
somehow
optimize
that
by
being
able
to
copy
the
structure
and
replace
the
content
of
of
the
boxes,.
C
Yeah
I'd
be
curious
to
understand
what
kind
of
optimizations
you
think
the
engine
can
apply
to
to
do
that.
I'm
also
curious
what
kind
of
api
you're
picturing
over
this,
and
also
it
seems
like
we're
in
agreement
that
this
is
a
potential
performance
optimization,
and
so,
if
it
is,
then
can
this
be
post
mvp.
C
And
finally,
I
want
to
say
that
this
this
mapping
of
boxes
does
relate
to
feature
requests
that
we've
heard
from
other
people,
where
some
people
say
that
they'd,
like
boxes
to
serve
this
kind
of
template
use
case
and
honestly.
I
still
don't
understand
this
use
case,
but
I
wonder
if
maybe
you
could
work
with
advocates
of
that
on
a
follow-on
proposal
to
that
would
enable
both
this
kind
of
templating
use
case
and
this
optimization
for
for
membranes.
B
Yeah,
I
I
got
the
inspiration
from
the
vdom
advocates
where
they
were
like.
Oh,
we
want
to
compare
the
structure
which
basically
would
be
the
dom
tree
structure,
but
with
different
elements
substituted
in
it.
So
different
content,
yeah.
C
So,
honestly,
I
don't
understand
what
any
of
you
think
that
engines
do
like.
What
do
you
think
engines
are
going
to
be
able
to
do
better
when,
with
this,
I'm
sorry
that.
E
B
B
So
insulting,
I
think
I
I
have
somehow
an
impossible
implementation
in
my
mind,
of
a
of
a
box
of
a
record
structure
with
holes
and
a
side
linked
list
for
the
box
contents
for
all
of
those.
And
you
would
just
be
able
to
substitute
the
the
linked
list
of
of
the
boxes
and
and
create
a.
C
B
That
has
different
identity,
but
it
would
have
the
same
structure:
that's
stored
separately
from
the
box
content,
so.
E
C
Problems
with
this
one
problem
is
part
of
that
side.
Table
might
become
unreachable,
while
other
parts
are
reachable,
and
then
it's
unclear
how
the
engine
should
deal
with
that
and
then
the
other
problem,
which
is
more
basic,
is
okay.
Now
you
have
another
level
of
indirection,
and
so
getting
the
contents
of
a
box
becomes
like
one
extra
indirection
slower,
and
you
really
want
to
do
that.
D
Your
previous
question,
whether
or
not
this
is
a
should
be
part
of
the
mvp,
I'm
shifting
the
focus
from
the
membrane.
D
I
still
think
that
there
is
usefulness
on
letting
the
record
to
go
through
and
and
throw
on
access
if
it
is
not
a
function,
as
I
like
forget
about
membranes
for
a
second,
you
want
to
implement
some
sort
of
coordination
between
the
call,
the
the
the
incubator
realm
and
the
new
realm,
and
then
you
want
to
have
some
sort
of
logic
in
between
something
like
that.
D
D
E
D
Say
that
I
want
to
implement
some
sort
of
a
iterator
over
the
async
iterator
over
the
the
callable
membrane,
so
I
need
to
provide
some
metadata
about
what
position
I'm
in
the
iterator
and
so
on,
and
then
providing
maybe
the
functions
that
you
can
call
once
you
have
to
go
to
the
next
item
in
the
list
and
so
on.
So
you
have
to
provide
multiple
values
to
the
other
side,
but
the
problem
is
that
the
other
side
calls
you
once
and
receive
only
one
return
value.
D
The
return
value
could
be
only
a
primitive
value
or
a
callable,
but
you
want
to
provide
more
values.
You
want
to
provide
data,
some
primitive
values
and
a
function.
So
how
you
do
that
you
cannot
return.
You
have
to
go
multiple
round
trips,
just
to
get
the
information
that
you
want.
That's
one
of
the
problems
of
optimizations
that
we
have
today
with
the
with
the
implementation.
D
So
if
I
can
provide
a
record
that
contains
all
the
metadata
that
I
want,
plus
the
functions
that
will
do
the
operation,
some
coordination,
then
that's
easier,
because
I
just
produce
every
time
you
call
a
function
on
the
other
side.
That
returns
a
record.
That
record
contains
all
information
that
I
need,
which
is
primitive
and
all
the
functions
that
I
might
need
to
call
to
do
more
coordination
and
then
the
other
side
does
the
same.
So
the
coordination
becomes
a
lot
more
simple.
C
So
I
agree
that
this
would
be
nice.
I
guess
there's
two
parts
to
it.
One
part
is
ergonomics,
and
another
part
is,
is
performance
overhead
as
far
as
performance
overhead
goes
sure
yeah,
I
guess
doing
the
check
at
the
time
of
access
would
help
reduce
the
performance
overhead
of
like
having
two
function.
Calls
versus
one
function,
call
yeah.
I
don't.
C
Overhead,
there
really
is
to
having
two
function
calls
because
the
only
thing
that
happens
at
the
boundary
is
you
know
this
check,
whether
it's
a
primitive
the
you
know,
the
other
thing
is
ergonomics
that
it's
kind
of
annoying
to
set
up
a
protocol
where
you
have
to
like
make
these
different
function,
calls
and
interpret
either
the
positionality
or,
like
the
other
things
that
were
sent
before
or
after
it
to
to
to
build
this
awkward
protocol.
C
D
I
mean
so
I
don't
know
I
I
don't
know
what
the
expect
the
core
instead
of
this
state
of
the
spec
for
recording
triple
h,
I
looked
into
it
for
sure,
but
if
the
access
is
simply,
if
the
record
somehow
or
the
box
somehow
has
information
about
what
rom
was
that
record
created
off
and
when
you
try
to
access
the
value,
we
apply
the
exact
same
routines
that
we
have
today,
which
is
just
saying.
Okay,
who
is
the
caller
a
record,
the
the
color
rom?
D
And
then
you
go
through
the
get
value,
get
wrap
function,
value
thing
that
you
have
that
that's
a
very
straightforward
process.
I
think
it's
very
generic.
C
C
Okay,
so
just
to
summarize,
you
know,
I
previously
proposed
the
thing
that
charity
is
saying,
which
is
that
you
have
boxes
that
contain
whatever
and
sure
you
can
transfer.
You
can
transfer
those
to
a
realm.
C
It's
just
that
when
you
access
it,
then
it
still
remembers
where
it
came
from,
and
you
know,
throws
an
error
if
it's
not
a
callable
or
wraps
the
callable,
if
needed,
and
your
objection,
if
I
remember
correctly
had
to
do
with
this-
would
be
kind
of
anti
or
asymmetrical
compared
to
if
you
just
pass
the
function
outside
of
a
box,
because
if
you
round
trip
it,
you
don't
get
the
same
identity,
whereas
with
the
box,
suddenly
you
can
get
the
same
identity
is
that
is
that
a
correct
and.
A
D
C
C
A
This
has
like
a
litany
of
weird
things
that
start
to
occur,
especially
if
you
preserve
identity.
Can
you.
C
If
you
and
then
you
like,
pass
it
back
so
then,
if
you
invoke
that
identity
function
or
like
so
you,
you
have
an
identity
function
from
you
know
past
past
from
another
realm
or
you
so
it
so
it's
going
to
do
this
callaway
boundary
thing.
Basically,
it's
just
an
identity
function
with
the
caldwell
boundary
applied
with
with
the
callable
boundary
like
double
applied.
C
So
if
you
pass
a
a
primitive
to
it,
okay,
you
get
the
same
primitive.
If
you
pass
a
box
to
it,
yeah
you
get
the
same
box
back.
If
you
pass
a
function,
you
don't
get
the
same
function
back.
You
get
an
observably
different
function
because
it's
wrapped
twice,
and
so,
if
you
pass
a
box
that
contains
a
function
and
you
look
at
what
it
contains
well,
this
is
kind
of
asymmetrical
that
it's
not
containing
the
same
thing.
I.
D
C
D
C
A
D
A
B
I'm
not
sure
I
followed
everything,
but
when
I
thought
about
this,
my
my
conclusion
was:
when
you
get
a
record
that
has
identity
bearing
objects
in
it,
you
should
be
able
to
put
it
in
a
weak
map
before
going
into
the
membrane,
see
if
you've
already
created
a
mapping
for
that
on
the
other
side,
and
so,
if
you
ever.
B
It
back
you
just
like
say:
oh
this
is
this
record
somehow.
D
Right,
but
I
think
we
passed
the
membrane
discussion
like
we're,
not
really
looking
into
the
at
least
I
wasn't
really
looking
into
the
membrane,
but
just
generic
communication
between
the
two
sides.
We
are
a
custom-made
protocol
that
could
be
the
membrane
protocol
yeah,
but
so
more
generic,
more
simple
one,
so
yeah.
So
I
like
to
understand
more
why
so?
Checkpoint
access
will
be
an
issue.
A
The
problem
is
preserving
the
identity;
it
is
not
necessarily
access
by
preserving
an
identity
if
you've
ever
done
remote
objects
across
distributed
systems.
Preserving
identities
across
distributed
systems
is
a
plague
of
memory
leaks.
So
generally
you
create
new
identities
in
a
localized
system.
A
Here
we
have
realm
a
and
realm
b.
If
realm
a
passes,
a
function,
let's
say
we're
preserving
identity
for
all
times,
because
this
is
the
only
problematic
case.
If
realm
a
passes,
a
function
foo
to
realm
b,
you
get
foo,
prime,
and
if
realm
b
passes
it
to
function
a
you
get
foo,
not
foo,
prime.
A
So
this
means
that
for
both
realms,
you
have
to
preserve
a
table
of
potential
incoming
things
that
need
to
be
mapped
to
their
counterparts
in
the
opposite
realm
doing
so
cannot
realistically
be
garbage
collected
until
the
entire
realm
is
garbage
collected.
Unfortunately,
or
any
communications
channel
between
the
realms
is
completely
cut
off
again.
B
Is
the
weak
map
type
structure
on
even
in
terms
of
engine
not
sufficient?
There.
A
Even
if
you
have
the
weak
map
on
realm
b,
it's
kept
alive
by
realm,
a
the
what's
capital
knife,
the
the
prime,
is
kept
alive
by
foo
in
realm
a
yeah.
I.
A
C
Understand
that
so
into
realm
cycles
can
be
constructed
already.
Just
with
the
function.
Wrapping
thing
yeah,
you
need
a
unified
garbage,
collector
yeah,
you
you.
E
C
A
E
A
E
This
all
comes
from
the
history
of
garbage
collection
concepts
in
the
e-language,
the
weak
maps
and
proxies
together
were
designed
exactly
to
enable
good
membranes
for
synchronous.
You
know
single
address
space,
garbage
collection
under
one
garbage
collector,
where
the
ephemeron
collection
logic
enabled
both
the
collection
of
cycles
that
cross
the
membrane
as
well
as
if
the
membrane
is
revoked.
Collecting
everything
within
the
now
inaccessible
object
graph.
E
I
believe
we
preserve
that
with
the
callable
boundary
under
the
assumption
that
the
that
the
that
that
both
sides,
the
the
realms
jointly,
are
under
one
garbage
collector
and
that
if
the
exotic
function
is
not
referenced,
then
the
function
that
it's
an
exotic
for
is
also
collected
and
that,
if
that
function
is
holding
on
to
an
exotic
that
you
know
if
a
blue
exotic
is
holding
on
to
a
regular
yellow
that
holds
onto
a
yellow
exotic
for
a
blue,
regular
that
holds
on
to
the
blue
exotic.
E
If
you've
got
that
cycle,
but
you've
all
got
it
under
one
garbage
collector
we're
assuming
that
cycle
goes
away
now
for
the
distributed
case,
weak
maps
don't
help
at
all.
What
helps
what
helps
exactly
is
weak
references
and
finalization.
That
was
the
motivating
use
for
that
and
that
does
not
collect
cycles
that
collects
acyclic
distributed
garbage
at
electric
communities.
E
We
did
do
a
further
elaboration
which
we're
not
proposing
that
matthew,
amazingly
rediscovered.
I
think
almost
the
identical
logic
for
actually
described
in
this
in
a
substantially
simpler
manner,
but
we're
still
not
proposing
that
the
actual
experience
we
generally
have
with
distributed
garbage
is
distributed.
Garbage
is,
is
quite
often
a
cyclic.
The
fact
that
we
lake
distributed
cycles
so
far
has
not
bit
us,
although
at
some
point
I
expected
well,
but
that's
pr.
I
wouldn't
be
surprised
if
that's
decades
out
before
we
have
to
face
that
problem.
A
A
Correct
so
the
problem
here
is
you
don't
necessarily
have
a
cycle,
it's
not
a
strong
cycle,
at
least
but
weak
cycles
leak.
E
D
A
E
A
Just
not
hold
on
I'm
going
to
try
to
finish
the
example.
Okay,
sorry
so
so
you
have
fu
still
alive
for
whatever
reason
in
realm
a
it's
going
to
want
to
be
garbage
collected,
it
has
gained
a
reference
to
foo
prime
correct
and
then
foo
prime
is
held,
and
if
you
do
not
hold
both
weekly,
you
leak
memory,
so
foo
prime,
has
to
be
held
weekly
by
b
and
foo
has
to
be
held
weekly
by
a
in
order
for
a
cycle
to
be
collected.
That
means
fluke.
C
A
E
B
I
have
a
clarifying
question
here.
Bradley
is
your
concern
that
basically
objects
that
are
only
weakly
referenced
in
realm.
A
might
be
kept
alive
because
there
is
a
strong
reference
to
a
wrapper
of
such
object
in
realm
b.
A
E
Right,
if
you
simply
if
the
application
has
a
pointer
into
a
cycle
of
objects,
all
within
one
realm
within
you
know
where
there's
no
ben,
you
know
with
no
boundaries,
no
realm
boundaries,
no
membrane
boundaries.
If
you
just
have
a
pointer
into
a
cycle,
then
that
causes
a
leak.
A
C
Is
that
so
I
feel
like
we're
missing
some
context.
Why
is
there
a
strong
reference
to
this,
but
it's
like
not
just
strong
references
are.
A
Very
common
in
javascript
they're
really
hard
to
get
rid
of
if
you
use
typescript,
because
you
can't
delete
function,
definitions
and
things
like
that,
because
typescript
gets
angry
so
just
passing
a
function
of
any
form
or
fashion,
I
my
presumption
is
you're
going
to
strongly
hold
it
in
most
cases
via
javascript
source
text,.
C
I'm
still,
I'm
still
missing
a
lot
of
context.
When
is
that,
when
is
a
function
closing
over
something,
but
you
want
the
thing
that
closes
over
to
actually
be
collected,
like
maybe
you
can
give
a
concrete
example,
rather
than
this,
this
more
general
thing.
A
A
C
A
A
Of
what
no
longer
has
a
direct,
so
if
you
so
one
thing
we
haven't,
talked
about
a
concern
of
these
autoboxing
behavior.
If
you
have
a
function
with
a
static
property
on
it
on
the
function
itself,.
A
A
Correct,
but
we
keep
it
alive
if
this
identity
is
preserved
yeah,
so
I
think
there's
a
disagreement
on
what
we
are
calling
a
leak
here.
A
C
So
so
bradley,
I'm
I'm
on
board
with
you,
this
more
expensive,
pragmatic
definition
of
leaks,
and
I
guess
what
I'm
missing
is
your
your
history
and
experience.
Debugging
memory
leaks
in
practice,
so
the
example
of
okay,
you
have
a
static
property.
That's
that's!
On
the
function!
Yeah,
I
see
how
that's
unreachable
engines
might
be
able
to
be
taught
how
to
collect
that,
because
the
only
thing
you
can
access,
if
it's
wrapped,
is
its
callableness
yeah.
This.
D
D
C
Very
specific
property
I
feel
like
it
would
have
been
easier
if
you
led
with
this.
If
you
were
to
say
well.
C
E
Let
me
let
me
let
me
propose
a
level.
You
know
a
a
distinction
that
that'll
help
us
distinguish
what
level
of
ambition
we
should
be
shooting
for
and
what
level
of
ambition
we
should
not
be
shooting
for
without
any
boundaries
without
any
membranes
without
any
callable
boundaries.
Just
regular
javascript
in
the
software
engineering
sense
that
bradley's
talking
about
it's
leaky.
People
have
leaked
bugs
in
programs
because
they're
strongly
holding
on
to
things
that
they
didn't
notice.
E
However,
whatever
that
level
of
hazard
is
in
normal
javascript,
when
you
introduce
boundary
mechanisms
like
membranes
or
like
callable
boundaries,
we
should
not
expect
that
hazard
to
go
down
if
there's
no
reason
why
an
introduced
boundary
should
cause
that
how
you
cause
us
to
to
make
progress,
reducing
the
hazard
that
we
would
have
had
without
the
boundary.
D
When
you
don't
know
if
the
other
side
is
even
going
to
do
anything
with
it,
but
they
in
principle,
if
we
give
you
the
record,
and
you
hold
the
record
strongly
you
only
going
to
get
into
the
box
and
access
the
content
of
the
box
when
you
need
to,
and
at
that
point
that's
equivalent
to
just
simply
call
the
function
on
the
other
side
and
return,
something
that
you
hold
onto
it
like.
D
C
I
think
I
think,
there's
a
huge
difference
with
whether
we
allow
boxes
here.
It's
a
huge
conceptual
difference,
because
it
it
really
changes
between
whether
we
want
to
allow
identities
to
be
directly
modeled
to
be
shareable
between
between
realms.
C
C
But
another
example
of
where
this
comes
up
this
decision
about
whether
we
want
identities
to
be
shared,
maybe
a
more
profound
case
is,
is
multi-threading.
Do
we
want
to
I
mean
it
would
be
cool
if
records
and
doubles
could
be
shared
between
multiple
threads,
and
in
that
multi-threading
case,
should
we
allow
boxes
to
be
shared?
C
You
know,
the
easy
answer
is
obviously
no
on
the
web.
This
could
happen
sooner
than
later,
with
the
structured
clone
definition
for
records
and
tuples.
So
there
are
a
few
alternatives.
One
alternative
is,
you
know,
first
of
all,
I'm
not.
I
don't
think
the
web
is
going
to
immediately
embrace
multi-threaded
cycle
collection,
and
but
if
it
did
one
day
then
you
know
it'd
be
pretty
cool
if
we
could
have
boxes
to
represent
the
identities
in
in
records
and
tuples
and
pass
them
back
and
forth.
C
So
you
could
have
this
opaque
mapping
to
an
object
and,
and
so
as
a
as
in
your
term,
question,
there's
the
question
between
whether
putting
a
box
in
a
record
or
tuple
that
points
to
an
object
when
you
structure
clone
that,
should
it
throw
or
should
it
just
structured
clone
the
contents
of
the
box
and
throw
would
be
kind
of
the
answer
that
we
would
choose
if
we
want
to.
You
know
future
proof
ourselves
for
a
later
possibility
of
actually
just
directly
passing
the
identity
across
threats.
A
Also,
to
be
clear,
I'm
not
opposed
to
changing
my
opinion,
I'm
just
trying
to
explain
it.
I
do
think
this
is
the
real
practical
memory
leak
that
I'm
gonna
debug
very
soon
after
people
start
using
it.
I
do
think
we
can,
at
least
if
we
match
the
behavior
of
a
boxed
and
unboxed
thing
for
function.
A
B
A
B
Suggesting
that
I
was
suggesting
to
have
the
same
behavior
passing
a
box
function
with
a
non-box
function.
C
C
I
could
see
how
we
could
later
add
this
loosening
to
permit
it
with
various
possible
semantics,
and
I
think
that's
something
that
we
could
do
later
and
start
with
this
very
minimal
semantics
that
that
we
know
is
is
expressive
enough
for
everything
that
it's
going
to
be
kind
of
inconvenient,
but
but
it
seems
like
it
should
be
good
enough.
D
Yeah,
I
I
rather
prefer
to
just
to
spend
more
time
thinking
more
about
these
and
trying
to
figure
if
we,
if
we
could
do
this,
I'm
very
worried
about
the
efficiency
of
of
the
communication
between
the
two
realms.
When
you
have
records
on
tuple
and
the
complications
and
the
complexities
you
will
be
adding
the
ergonomics
of
it
will
be
horrible.
D
You
have
to
now
traverse
dick
traverse
reconstruct
the
record
without
those
things
and
and-
and
you
just
want
to
pass
something
to
the
other
side
and
then
do
more
coordination,
which
is
already
complicated
through
the
call
of
a
wonder
now.
You
have
to
make
it
for
records
and
tupo
would
be
just
a
lot
more
difficult.
Finally,.
E
Yeah,
korea,
I
have
a
question
for
you
something
I've
been
curious
about
that
bears
on
this
issue,
completely
forgetting
records
and
tuples,
just
with
the
existing
work
that
you've
done
on
the
callable
boundary
and
on
rebuilding
membranes
on
top
of
the
callable
boundary.
What
do
you
expect?
The
overhead
of
a
full
distortion
free
membrane
on
top
of
the
coral
boundary,
is
compared
to
a
normal
distortion,
free
membrane
without
a
callable
boundary
just
constructed
by
normal
means.
D
I
don't
know
we
we
are
actually
in
the
process
of
right
now,
so
we
wrote,
I
wrote
the
example
of
a
callable
boundary
membrane,
yeah
distortion
free.
I
have
that
and
now
we
are
in
the
process.
D
That's
kind
of
a
very
simple
implementation
doesn't
have
a
lot
of
wheel
cells
and
such
and
now
we
are
in
the
process
of
moving
those
concepts
back
into
the
production
code
that
we
have
trying
to
align
then
shooting
for
six
months
or
something
to
try
to
align,
to
the
point
where
the
membrane
that
we
have
can
work
across
a
call
of
a
boundary,
and
we
were
finding
new
optimizations
using
bit-wise
operations
and
such
to
send
the
metadata
between
the
two
sides
and
all
that
which
it
might
be
like
the
shape
of
the
target.
D
On
the
other
side,
you
can
serialize
it
into
a
big
wise
operations
that
you
will
carry
on
on
the
other
side,
which
will
speed
up
things,
we're
doing
some
stuff
there
without
numbers.
Yet,
but
but
my
concern
is
okay,
let's
say
that
is
about
the
same
or
it
cannot
be.
Better
cannot
be
better
because.
D
I
think
it
would
be
the
same,
because
the
same
concepts
can
be
applied
to
the
regular
ones
in
a
optimized
way
and
again,
I'm
talking
about
getting
a
membrane
that
is
sufficiently
strong,
meaning
you
never
leak
anything
to
the
other
side,
which
is
the
overhead
that
you
add
in
a
regular
membrane
like
you
have
to
put
all
this,
I
would
say
it
is
a
compensation
effort,
because
in
a
regular
membrane,
you
have
to
cover
all
the
cases
of
throwing,
on
the
other
side,
leaking
an
error.
Doing
all
these
things
in
this
one.
D
You
don't
have
to
do
that
because
that's
covered
by
the
engine
so,
but
you
have
to
cover
the
cases
that
you
don't
have
direct
access
to
the
target
on
the
other
side
and
so
on.
So
I
think
it
would
be
about
the
same
okay,
but
the
problem
that
we're
describing
here
is
what
words
means,
because
the
minute
you
add
records
and
tuples
to
the
equation.
Now
you
have
to
go
and
add
terms
of
complexity.
On
top
of
it.
C
Wait
but
records
records
and
tuples
are
handled
pretty
analogously
to
objects.
I
mean
there's
two
things.
There's
one
thing
you
were
talking
about,
making
a
more
ergonomic
way
to
communicate
across
the
boundary
using
records
and
tuples
as
an
implementation
detail,
and
I
think
we
would
be
saying
like
sorry
this
isn't
what
we're
getting
right
now.
D
C
D
You're
right
like
if
we
say
you
can
only
pass
a
record
that
doesn't
have
any
boxes
on
it,
but
when
you
are
constructing
a
membrane
that
doesn't
work,
you
have
to
build
the
record
on
the
other
side
equivalent
to
this
one,
and
that
complexity
has
to
be
added
to
the
membrane
implementation,
to
recreate
the
record,
with
the
boxes
peroxide
on
the
other
side
and
all
that.
So
I'm
worried
about
that
complexity
to
be
at
all.
E
I
agree
that
there's
the
eager
versus
lazy,
so
it's
not
just
a
duplication
of
the
same
code,
but
I
think
that
the
eager
doing
it
eagerly
should
not
be
more
complex
than
the
code
that
does
it
for
objects.
Laserly.
C
A
E
Think
we
can't
do
it
lazily.
I
think
that
means
that
if
you're
only
going
to
touch
a
tiny
portion
of
the
structure
that
you've
paid
an
overhead
of
doing
eagerly
something
you're
only
using
a
small
piece
of,
but
that's
not
going
to
be
the
common
case,
and
if
you
do
eventually
use
all
of
it,
then
you
still
have
the
same
amortized
overhead.
You
just
took
the
hit
up
front
rather
than
spreading
it
out
over
time
and.
E
D
C
Access
really,
if
you
pass
over
recorded
tuple,
that's
like
the
thing
that
you
want
to
wrap
and
you
pass
it
over
the
membrane
boundary
and
you
expect
the
box
the
default
box
handling
to
do
something
meaningful
it.
Just
it
just
won't.
Do
anything.
Meaningful,
you're
gonna
have
to
transfer
the
contents
of
the
boxes
over
in
some
other
way,
so
you're
still
going
to
have
to
traverse
the
original
structure.
Yeah.
D
C
D
Abstraction,
when,
if
we
get
records
and
tuples
to
to
to
be
able
to
pass
functions
through
boxes
and
be
able
to
use
that
information
to
do
better
coordination
between
the
two
sides
of
lanes,
we
definitely
will
be
able
to
create
a
better
membrane.
A
faster
membrane.
C
D
C
D
Can
write
something
down
some
examples
of
the
coordination
that
we
do
today
and
the
coordination
that
we
will
do
tomorrow
if
we
have
the
records
and
tuples
with
the
wrapper
functions
on
it,
try
to
illustrate
why
I
feel
that
this
would
be
way
better,
but
I
understand
that
adding
that
introduces
the
identity
issues
that
we
discussed.
D
I
understand
that
as
a
different
kind
of
problem
that
we
have
to
think
about
I'll,
try
to
think
about
it.
B
Something
I
would
like
to
discuss
next
week
is
also
the
need
of
being
able
to
box
non-identity
bearing
objects,
slash
primitives
or
other
records.
A
All
right,
let's
call
it
here
and
and
resume
next
week
thanks.
Everyone.