►
From YouTube: RFC 2229 Resync Discussion (2020.05.12)
Description
Discussion of RFC 2229 implementation plann
A
A
Okay,
you
all
can
see
that
what
yeah
first
question
I
assume
you
all
read
the
RC
right.
So
we
kind
of
know
the
general
idea
of
what
we're
trying
to
do.
A
A
A
A
A
It
actually
makes
it
does
make
kind
of
a
struct
like
thing,
but
the
struct
looks
a
little
different
for
one
thing
has
and
has
this
type
parameter?
You
can't
actually
express
this
in
real
rust,
I
guess,
but
it
has
it
has.
It
has
some
special
type
rumors
in
here,
and
one
is
a
tuple
like
known
to
be
a
tuple
which
has
for
each
of
the
captured
variables
XY.
A
There's
various
reasons
that
we
do
it
this
way,
but
it
is
just
kind
of
how
we
encode
it
and
then
the
other
type
parameters
actually
I'm
gonna
pull
up
the
rusty
Forks
here,
the
other
tech
rameters
encode.
Other
information
about
this.
A
And
I'm
assuming
you're,
not
that
familiar
with
how
rusty
works
either
no
yeah
that
particularly
just
I'll
dive
in
the
middle
and
then
I'll
pull
my
way
back
out.
So
this
is
documentation.
This
type
closure
substance.
A
It's
basically,
let
me
just
throw
in
this
link
here.
So
it's
easy
to
find
later.
This
basically
defines
the
customer
utility
functions,
we're
working
with
the
substitutions
of
a
closure
and
substitutions
means
the
value
is
provided
for
the
generic
arguments.
Alright,
so
I,
guess
these!
These
types
are
the
closure
substance.
A
A
The
interesting
ones
will
ignore
this
first
set
anyway.
There's
because
these
basically
three
parameters,
three
types,
the
closure,
kind,
closure
signature
and
these
types
of
the
up-up
variables
is
our
name
for
captured
variables
and
the
closure
kind.
Is
this
really
happy
thing
where
we
just
we
use
like
a
number?
So
we
want
to
record
if
that
closure
turned
out
to
be
basically
which
traits
it
turned
out
to
implement,
and
we
do
that
by
encoding.
A
I,
don't
know,
I,
think
I,
don't
know
what
it
is
exactly
but
like
FN
is
I
ate
and
FM
you
desire,
32
or
something
like
that.
It
doesn't
really
matter.
Okay,
so
I,
just
kind
of
records
for
us
what
things
the
closure
implements
and
then
this
encodes,
the
closure
signature.
So
the
actual
type
would
look
something
like
in
this
case
the
closure
signature.
It
doesn't
take
any
arguments
right,
no
and
it's
Vimes
gonna
call
this
I
ate
or
sorry
be
like
see.
A
Kc
is
the
actual
type
here
would
be
like
I
ate,
maybe
or
whatever
it
is.
That
says
it
implements
the
F
entry
and
then
signature,
and
then
the
types
the
imperialism
so
that
that's
kind
of
how
the
compiler
encodes
these
types
internally.
But
you
can
see
it
Maps
pretty
closely
yeah
the
other
one
yeah
and.
A
A
A
A
A
A
To
sort
of
view
them
as
a
list
of
closure
substitutions
as
opposed
to
a
list
of
substitutions
for
some
other
kind
of
type,
because
that
same
type
sub
stress
is
used
for
all
kinds
of
things.
So
that's
how
the
compiler
represents
closures
internally
and
I.
Don't
know
why.
Let's
see
how
why
I
chose
to
start
it
there
well
now,
what
I
want
to
say
is
basically
what
we
want
to
change
here.
A
Right
is
the
other
part
of
what
the
compiler
does
is.
It
has
to
figure
out
couple
things
that
are
gonna
have
to
change
if
we're
gonna
implement
this
RFC.
For
one
thing,
we
currently
do
some
analysis.
We
assume
that
there's
one
this
tuple
has
one
type
in
it.
We
basically
assume
there's
one
field
per
local
variable
that
we
access
and
therefore
the
tuple
has
exactly
one
entry
per
local
variable.
Then
we
access
right
and.
A
A
A
A
Check
expert
closure,
but
we're
not
expected
the
idea
of
dumping.
All
these
details
in
here
in
case,
it's
not
clear,
is
just
that
stuff.
You
can
follow
up
on
later,
have
some
survey
of
what's
going
on
the
ideas
when
we
see
the
closure
expression,
the
we
type
check
it
and
we
can
kind
of
figure
out
its
type
and
we
actually
don't
know
a
lot
of
the
details
yet
so
you
know
currently
we
know
that
it's
gonna
have.
We
know
how
many
before
we
do
this
change.
A
A
Which
we
call
the
up
for
analysis
to
figure
out
how
they're
captured,
which
depends
on
how
their
years
within
the
closure
so
like
in
these
examples,
we're
only
reading
from
them,
and
you
see
that
I
captured
them
by
by
reference
yeah,
but
if
they
were
getting
moved,
we
would
have
captured
them
by
value.
If
they
were
getting
mutated,
we
would
have
done
a
mutable
capture
and
to
figure
that
out,
we
kind
of
have
to
know
you
kinda
have
to
know
the
types
enough
of
the
types
to
figure
out
what's
going
on.
A
A
A
A
C
A
You
kind
of
be
able
to
be
called
from
as
many
click
from
up
from
a
wide
variety
of
places,
because
you
do
very
few
things.
Fn
mute
means
you
have
to
be
called
with
a
mutable
reference,
because
you
mutate
things,
and
so
in
this
case
you
can
be
called
from
fewer
places
because
you
do
more
stuff
right
and
the
interesting
thing
about
this
is
that
if
I
have
something
that
implements
FN
that
only
read
things,
I
can
also
treat
it
as
if
it
was
FM,
muted
right,
because
I'm,
basically
being
more
conservative
that
makes
sense.
A
I
can
call
it
I
can
say
well.
I
could
have
called
this
from
a
shared
reference,
but
I
have
a
mutable
reference
and
I'm
going
to
use
that
instead,
an
FM
once
says
I
can
be
called
at
most
once
because
I
move
things
so
I'm
kind
of
phrasing.
This
a
little
confusing
that
I
guess.
But
my
point
is
anything
that
implements
FM
also
implements
FM:
u
+
FN
once
because,
if
I
could
call
it
many
times,
I
could
surely
call
it
just
once.
Ok,.
A
C
A
Basically
so
it's
kind
of
the
key
building
block
of
type
infants
right,
you
can
create
an
infant's
variable
and
it
represents
some
type
that
you
don't
yet
know,
but
that
you'll
figure
out
later,
as
you
type
do
the
rest
of
your
type
checking.
Hopefully
right
and
until
you
figure
it
out
so
infants
variables
have
two
states.
A
They
start
out,
unbound,
meaning
you
don't
know
what
it
is
and
at
some
point
they
become
bound
where
you
you
now
have
assigned
it
a
value
and
then
it
never
changes
again
and
so
what
we
do
for
the
closure
type.
You
know
I
mentioned
they
have
these
these
various
variables
so
for
a
closer
type,
some
of
the
values
in
its
substitutions
are
variables.
The
way
it
works
today
it
would
be
like.
Oh
this
question
notation
is
just.
A
Means
infants
variable
like
so
you
would
start
out
with
this
is
how
it
works
today.
We
kind
of
this
is
what
we
know
when
we
first
create
the
closure.
We
know
that
it
I'm
not
very
much.
We
know
that
it
has
some
kind,
but
we
don't
know
what
it
is.
It's
some
signature,
but
we
don't
know
what
it
is.
But
one
thing
we
do
know
is
that
it
has
a
tuple
of
a
certain
arity.
We
know
how
many
up
bars
there
are
all
right.
A
A
Basically,
well
after
we've
analyzed
the
body
of
the
closure,
and
we
saw
what
it
does
this,
this
will
run
after
we've
done
all
the
tech
points.
So
we
know
everything
now
we
know
what
push
is
and
then
we
can
figure
out,
for
example,
that
we
need
to
assign
this
value.
That
is
corresponds
to
FM
mute
and
we
have
to
assign
this
value
for
an
n
mute
capture
right.
That's
kind
of
the
idea.
B
How
are
how
do
we
actually
calculate
the
size
of
like
the
upward
couple,
because
can
we
not
just
modify
it
to
not
actually
drive
kids
apparent
that
actually
owns
members?
If
that
makes
sense,.
A
A
B
So
I
guess
my
follow-up
would
be
so
when
we
see
a
local
variable
as
access-
and
let's
say
it's:
do
we
at
that
point
figure
out
like
I
assume
we
do
that
it's
actually
a
member
of
a
local
variable,
then
actually
a
local
variable
itself.
If
that
mean
what
I'm
so,
instead
of
having
like,
let's
say,
P
dot
X
like
like
over
here
when
when
we
are
doing
this
name
resolution
like
what
we
see
in
court
is
actually
that
we
are
accessing
P,
dot,
X
and
not
be
so.
A
A
A
A
A
A
A
So
now,
if
I
use
a
closure
in
rust
today,
that's
that's
fine
because
well
not
drop
X
tubby,
but
maybe
XIV
dot,
LAN
or
something
yeah,
because
let's
make
this
a
move
closure
just
to
capture
X,
but
we
might
want
it
to
or
if
it
didn't
implement
drop.
You
probably
would
want
to
capture
xiv,
but
it
does
drop.
So
we
probably
want
to
capture
X
and
we
can't
really
know
without
knowing
thanks.
B
No,
no
I.
My
question
is
more
like
when
we
do
our
first
pass
before
we
do
any
type
analysis.
Why
don't
do
basically
capture
all
information
that
we
can
from
the
poacher?
So
basically
we
are
over
here.
Okay,
in
this
example,
we
just
say:
okay,
we
will
be
capturing
extra
V,
dot
Len
and
we
have
okay,
I
guess.
My
point
is
more
on
the
fact
that
the
number
of
variables
that
we
capture
at,
like
just
from
a
syntactic
analysis,
will
always
be
more
than
then.
B
A
A
A
It's
basically
assuming
we
figured
the
way
I
originally
was
expecting,
and
the
only
thing
that
changes
is
that,
instead
of
having
a
tuple
of
infant's
variables,
it's
now
just
an
infant's
variable
and
in
fact
it
sort
of
removes
a
special
case,
whereas
before
we
instantiate
everything
with
infants
variables,
except
for
this
one
I'll
show
you
where
that
is
in
the
code.
Actually,
this
is
the
code
that
creates
it's
kind
of
complicated,
but
they
create
it.
Creates
that
you
should.
You
can
see
here
it
says
somewhere.
A
A
B
Basically,
if
you
go
online
in
96
or
I,
guess
what
used
to
be
lame?
Can
you
scroll
down
no,
no
back
on
the
Yammer
done,
I
think
around
my
96,
so
yeah
96.
Basically
what
I
was
thinking
was
we
just
captured
that
we're
capturing
star,
V,
V,
dot,
one
dot
o
and
star
V
dot,
one
dot
one
and
basically,
then
we
can
reuse
that
list.
Yeah.
A
A
What
I
kind
of
described
here
was.
First,
we
would
rename
the
query
to
like
raw
up
far
as
there
are
syntactic,
afar's
or
I
forget
what
I
called
it
yeah
and
then,
and
then
we
can
kind
of
go
through
and
just
it
turns
out
that,
like
the
actual
format
of
the
data
right
now
is
the
same.
So
it's
a
pretty
small
refactoring
we're
basically
we've
taken
quality
is
very
imperative
to
this
part
and
should
be
should
work
more
or
less,
but
then
the
advantage
now
is.
A
B
A
So
so
what
so?
What
is
Technic
tables
type
check
tables
is
basically
the
output
from
type
Jack
and
writes
the
type
of
every
expression
and
a
bunch
of
other
bits
and
bobs
of
data.
That
type
check
figures
out
like
how
many
Auto
D
reps
you
get
at
each
spot
and
stuff
like
that,
and
one
of
the
things
that
it
contains,
which
they're
added
earlier
there's
a
list
called
a
parts
list.
A
A
C
B
B
Okay,
so
if
I,
okay,
again,
let's
say,
can
you
go
back
to
your
if
a
very
heavily
pattering
yeah,
so
basically
TC
exit,
type
table
or
tables
dot?
Deaf
ID
is
going
to
be
the
same
for
all
closures
that
are
defined
within
the
same
spot.
Yes,
like
the
first
part,
and
the
second
part
is
just
now
specific
to
that
very
closure.
Okay,
I
use
the
same
deaf
ID
here,
because
not
that
makes
sense.
B
A
Right
so
I
looked
over
all
the
places
that
we
invoked
it
a
farz
query
and
there's
not
that
many,
that's
the
good
news
and
most
of
them
I
think,
are
pretty
straightforward.
The
only
reason
they're
the
reason
that
things
get
complicated
has
to
do
with
dependencies
within
the
compiler.
Basically,
you
can't
have
cyclic
dependencies
between
queries.
A
All
I'm
computing,
the
type
check
tables
I,
can't
use
the
type
50
for
a
given.
You
know
for
the
same
definite.
No,
the
problem
is
these:
these
bits
of
code
are
these.
Are
these
are
exactly
the
code
that
the
up
for
analysis
uses
the
analysis
to
figure
out
which
how
the
up
bars
are
used
within
a
given
closure,
and
they
can't
use
this
query,
because
if
they
did
well,
that's
the
functions,
they
are
computing.
The
result
of
that
query.
A
B
A
A
A
A
Probably
won't
I
think
it
would
be
worth
like
the
actual
PR
here
is
not
very
long,
maybe
literally
one
line
for
each
of
these
files,
but
it's
a
good
exercise
to
do
it
because
it
kind
of
you
know
it
gets
you
familiar
with
how
PR
the
whole
PR
process,
and
maybe
you've
already
done
that
this
renaming.
You
know,
that's
also
its
own
PR
kind
of
orthogonal
from
these
I
suppose
there.
A
A
Because
in
writing
a
game
tells
birth
is
more
complicated,
but
basically
that's
where
we
want
to
go
and
say:
okay,
now
we
have
this
list
of
up
bars
and
right
now
what
happens?
Is
we
map?
Oh
the
here,
ID?
That's
the
identification
of
some
expression
within
audio
up.
Our
ideas
like
identifies
a
local
variable
in
the
outer
context,
and
what
we
want
to
do
is
change
this
notion
of
a
place
and
a
place
is
a
mirror
term
that
we
use.
A
We
call
it
a
place,
it's
kind
of
like
a
path,
I
think
it's
more
common,
like
a
dot,
B
dot
C.
But
the
idea
is
it's
a
place
in
memory.
That's
why
it's
called
a
place.
There
might
be
a
field
with
the
local
variable,
but
it's
some
location
and
luckily
there's
actually
already
so
we
can't
use
the
mere
place
because
mirror
is
built
after
type
check,
but
this
other
version
of
place,
that's
already
been
made
for
us
very
nicely,
didn't
exist.
You
last
tried
to
do
this
work
now.
It
exists.
A
A
A
A
Def
ID
identifies
like
the
top-level
thing,
and
the
here
ID
identifies
something
within
a
def
ID
and
sometimes
at
the
moment.
Sometimes
these
things
also
have
deaf
IDs,
which
I'll
explain
like
closures
are
a
good
example
actually,
but
so,
if
I
have
this
right,
the
function
foo
has
a
def
ID,
let's
call
it
D
and
then
this
is
actually
like
some
ast,
like
or
rather
some
here,
hi
which,
by
the
way,
stands
for
high
level
intermediate
representation.
A
Okay,
so
that
wasn't
clear
as
I.
Imagine
you
probably
wasn't-
and
this
might
be-
you
know
whatever
a
let
statement
with
like
a
destination
pattern
that
is
X.
You
know
it's
some
kind
of
some
kind
of
tree,
and
each
of
these
has
a
here
ID
and
if
you
look
actually
at
how
your
ID
is
defined,
you
will
see
that
it
has
an
owner
which
is
the
DEF
ID
and
then,
within
that
def
ID
it
has
a
local
ID.
A
So
we
want
to
remap
yes,
so
we
basically
want
to
refactor
this
far
this
map
so
that
the
values
are
here
places
and
that's
well,
I,
don't
say
much
more
at
this
moment,
because
I
think
we're
first
of
all
running
out
of
time
and
secondly,
and
probably
dumping
nothing
of
information
on
you
for
the
time
being.
But
what
that's
going
to
involve
is
and
currently
the
only
capturing
local.
So
this
is
kind
of
an
increase
in
expressiveness
right
now
we
can
express
capturing
star,
V
or
V
of
zero
or
whatever
right
and.
A
A
Your
matches
reasonably
closely
to
what
you
title,
it's
somewhat
different,
but
it's
pretty
close,
but
the
mir
is,
is
quite
a
bit
D,
sugar
and
and
especially
around
closures.
This
is
true,
so
when
you
get
to
the
mir
level,
this
picture
of
closures
that
I
showed
up
here
where
it's
a
struck
field.
This
is
exactly
what
you
see
in
there.
Yeah
closer
body
is
completely
separate.
A
You
know
different,
like
different
in
a
different
mirror:
there's
a
mirror
for
every
function,
body
and
I
mean
closures
are
separated
out
into
their
own
mirrors,
okay,
and
so
that
that
Mir
construction
step
will
read.
These
kind
of
currently
is.
A
What's
the
local
variable
and
what's
the
mode
that
I
capture
it
in
and
then
it
construct
this
arguments
right
based
on
those
two
bits
of
information.
What
it
would
now
do
is
say
what
is
the
mode
and
what
is
the
place
that
I'm
capturing
so
instead
of
just
being
ampersand
X,
it
might
be.
You
understand,
x,
dot
y
dot
Z.
A
Well,
probably,
we
would
start
with
those
things
are
always
local
variables.
So
nothing
really
changes,
there's
no
deep
change,
but
it
just
is
more
able
to
handle
it
when
we
generally
that'll
involve
some
amount
of
refactoring,
because
you
have
to
make
these
data
structures
more
general
and
we
have
to.
A
Write
the
code
that
can
convert
them
into
a
mirror
and
so
on.
It
shouldn't
be
too
hard,
but
it's
gonna
be
some
some
interesting
work,
so
that's
sort
of
once.
We've
got
that
far.
Then.
We've
done
a
lot,
but
we're
getting
now
to
like
at
that
point
we're
getting
through
the
we
kind
of
are
able
to
do
the
optimization
and
I
think
will
be.
It
will
turn
it
on
we'll
be
able
to
turn
it
on
and
have
it.
A
That's
not
that
the
feature
is
ready
to
ship,
but
the
future
is
ready
to
be
experimented
with,
but
then
the
next
step
before
we
can
actually
ship
it
is
well
have
to
figure
out
how
we
want
to
deal
with
those
breaking
changes,
whether
we
want
to
them.
In
addition,
if
they
actually
matter
or
what-
and
maybe
if
we
need
to
do
any
optimizations,
because
now
we're
gonna
be
capturing
the
way
I
described
it,
we're
capturing
a
lot
more.
A
We
used
to
capture
just
the
local
variable
now
we're
capturing
potentially
many
paths
from
within
the
local
variables,
so
the
closure
will
get
bigger.
They'll
have
more
pointers
in
it,
it'll
be
less
efficient,
but
more
more
ergonomic,
and
that
might
not
matter
at
all,
but
it
might
matter
in
which
case
we
want
to
optimize
it.
Somehow.
That's
all.
B
A
It
doesn't
matter
for
this,
like
this
example,
is
a
good
case
where
you
probably
don't
care
you
remember,
it
gets
freed
either
way
it
gets
freed
a
little
earlier
or
later
you
might
care,
but
you
probably
don't,
but
but
sometimes
jobs
have
side
effects
and
then
it's
very
visible.
Okay,.
A
I
think
I
think
what
we
would
do
well,
yeah
I
think
my
preferred
plan
would
be
that
we
make
the
change
we
change
when
drop
runs,
but
we
do
it
on
an
addition
boundary
and
we
warn
people
like
if,
if,
when
you're
converting
between
additions,
if
we
see
the
closure
it
would
capture
like
it
will
change
drop
order
and
we
probably
look
a
little
bit
make
a
good
heuristic
like
in
this
case.
We
might
be
change
not
make
any
change
because
we're
guessing
you
don't
care,
but
suppose
it
had
side
effects.
A
Then
we
would
rewrite
the
code
to
insert
it
like
this,
but
this
is
all
for
the
next
year
to
figure
out.
My
goal
for
this
year
is
that
we
are
actually
in
the
place
to
like
that.
We
have
the
breaking
change
implemented,
not
the
fixing
change,
let's
start,
but
if
you
did
that
you
know
now
we
preserve
the
semantics
of
the
program
and
then
the
user
can
come
back
and
say
like
I,
don't
really
care,
I'm
gonna
delete
that
line,
or
maybe
I
do
right.
Maybe
we
Adam
fix
me
comment,
yeah,
whatever
that's.
B
A
B
B
Okay,
I'm
just
gonna,
actually
other
stand.
Okay,
I'll
just
explain
my
god:
I
would
have
to
kill
the
session
my
own
session.
Okay,
so
basically,
let's
say
so.
We
have
within
our
closure.
Let's
your
call
to
print
point.
So
endpoint
is
our
member.
Like
a
local
variables,
a
point
will
get
captured
and
it
will
do
its
thing
now.
Let's
say
the
print
function,
all
it
does.
Is
it
only
accesses
point
with
P
dot
X?
So
it's
point
is
basically
an
X
Y
I
tell
you
to
fear,
so
it
only
captures
P
dot
X.