summaryrefslogblamecommitdiffstats
path: root/2020/subtitles/emacsconf-2020--20-omg-macros--corwin-brust.vtt
blob: 21222a112e73fdea04ba3a7252db1a85261a5d7d (plain) (tree)
1
2
3
4
5
6
7
8
9
10

      

                             
 

                             
 

                             
 


                             

                             
                                

                             
                       

                             
                       

                             
                
 


                             
 

                             
 

                             
 


                             
 

                                   
 


                               

                             
                                

                             
                                

                             
                                  

                             
                              
 


                               

                             
                        



                                        

                                  
 

                             
 


                             
 

                             
 

                               

                             
                                       

                             
                                       
 

                                
 

                             
 

                             
 

                              
 

                                     

                             
                                   

                             
                                       
 

                             
 

                             
 

                                 
 

                             

                             
                                     
 

                             
 

                             
 

                             
 

                               
 

                                         
 

                                   
 

                                     
 

                               

                             
                               

                             
                                 
 
                             
                                    
          
 

                                    


                             
                    

                             
                                 
 

                                  
 

                             
 

                             
 

                                   
 

                                

                             
                              

                             
                              

                             
                                      

                             
                                     
 


                                 
 


                             

                             
            
 

                             
 

                             



                                      

                                 
 

                             
 

                             
 

                             
 

                                       

                             
                           

                             
                                     
 


                                 
 

                              
 

                             

                             
                                         




                                   
                    

                             
                                    

                             
                             
 

                             
 

                             
 

                             

                             
                               

                             
                         

                             
                                 

                             
                           
 

                             
 

                             

                             
                       

                             
            
 

                                 
 

                             
 

                             
 


                             

                             
                                  
 

                             
 

                             
 

                                 
 

                             
 

                             
 


                             
 

                                
 

                             
 

                             

                             
                        
 

                             
 

                             

                             
                           

                             
                                         

                             

                       

                             
                
 

                                    

                             
                             
 

                                    
 

                             

                             
                         

                             
                         
 

                             
 

                               
 


                             
 

                             




                             
                                 




                             
                           

                             
                                 
 

                             

                             
                                 

                             
                   
 

                                 
 

                             
 

                             
 

                             

                             
                                      
 


                             
 

                             
 

                             
 

                             
 

                             

                             
                            

                             
                                
 

                              

                             
                                     

                             
                                         




                             
                                  

                             
                     

                             
                           

                             
                                   
 

                             
 

                             

                             
                                  
 


                               
 

                                 

                             
                            
 

                             
 

                             
 

                                 
 

                             
 

                                 

                             
                                     

                             
                                     

                             
                 

                             
                          




                             
                  

                             
                             
 

                             
 

                             
 

                             
 

                             

                             
                              
 

                             
 


                             
 

                             
 

                               
 

                              
 


                             
 


                                  
 

                             
 

                                
 

                             
 

                             
 

                             
 

                             
 

                             
 


                             
 


                             
 

                             

                             
                           
 


                             
 

                                    

                             
                                     
 

                             
 

                             

                             
              



                                     

                             
 

                                  
 

                             
 

                               

                             
                                      
 


                             

                             
                               

                             
                          
 

                             
 

                             
 

                                    
 

                             
 

                             
 

                                       
 

                             
 

                                   

                             
                                     
 

                             
 

                             
 

                                
 

                                
 

                                

                             
                                         

                             
                   




                                        
                    
 

                             
 

                               
 

                                 
 

                                
 

                             

                             
                                   
 

                                
 

                             
 

                             
 


                             
 

                             






                                     

                             
 

                             
 

                                 

                             
                                    

                             
                           
 

                                 
 

                             




                             
                             




                                    
                     

                             
                                         

                             
                   



                             

                             
 

                             
 


                             
 

                                 
 

                             
 


                             



                                  

                                 
 


                             
 

                             
 

                             
 


                             

                             
                                  

                             
                       
 

                                 
 

                             

                             
                                    
 

                                    
 

                              
 

                                   
 


                             
 

                             
 


                             
 

                              
 

                                      
 


                             
 

                             
 


                             
 


                             

                             
                              

                             
                                  

                             
                       
 


                             
 

                               
 

                             
 


                             

                             
                                 

                             
                 

                             
                                        

                             
                                         

                             
                  
 

                                    




                                       
                                  
 

                             
 


                             
 

                             
 

                                    
 

                             

                             
                            

                             
                  
 


                             
 

                             
 

                                  
 


                             
 

                                    
 

                             
 

                                
 

                             
 

                               
 

                                   
 

                                     

                             
                                   
 

                             
 

                             
 

                               
 

                             

                             
                                       
 


                                 
 

                                
 

                             
 


                              
 

                             
 

                             
 


                             
 

                                   

                             
                                    

                             
                                   

                             
                         

                             
                             

                             
                                




                                       
                                     

                             
                                 




                                       
                      

                             
                       

                             
                           

                             
                      
 

                                 
 

                                
 


                                
 

                                 




                                      
                     

                             
                                              

                             
                          
 

                                
 


                             
 


                                  

                             
                    
 


                             
 

                             
 

                                

                             
                   
 

                                    
 

                             

                             
                                     

                             
                                        

                             
                        

                             
                                      
 

                             
 


                             
 

                             
 


                             
 

                             
 

                             
 

                              
 

                              
 

                             
 


                             
 

                                   
 

                                 
 

                               

                             
                         



                                     

                                
 

                             
 

                              
 

                             

                             
                                   
 

                             
 

                              
 

                             
 

                                    
 

                                   
 

                             
 


                             
 

                             

                             
                                 

                             
                                     
 


                             
 

                                       
 

                              
 

                             
 

                             
 

                              

                             
                              
 

                               
 

                             
 

                               
 

                                 

                             
                                         
 


                                

                             
                                  

                             
                                      

                             
                 

                             
                                       
 


                                

                             
                                   

                             
                          

                             
                                    

                             
                           
 

                                     
 


                                        
 

                             
 

                             




                                   
                




                                   
                              

                             
                                     

                             
                     
 


                             
 

                                  
 

                             
 

                             
 

                                  
 

                             
 

                             
 


                             
 

                             

                             
               
 

                             
 

                                        

                             
                                  

                             
                             

                             
                               

                             
                    
 


                             
 

                             
 

                             
 


                             
 

                                
 

                              
 


                             
 


                             
 

                             

                             
           
 

                             
 

                                  
 

                              
 


                               
 


                             
 

                             

                             
                   
WEBVTT

00:00:00.480 --> 00:00:02.796
Good evening again. I think

00:00:02.796 --> 00:00:04.319
I have a little time here

00:00:04.319 --> 00:00:06.447
to talk about macros.

00:00:06.447 --> 00:00:09.440
Is there still room in
our schedule for that,

00:00:09.440 --> 00:00:11.440
or should I just jump to some of

00:00:11.440 --> 00:00:12.559
my thoughts on the day?

00:00:12.559 --> 00:00:15.920
([Amin:] Pretty sure we

00:00:15.920 --> 00:00:17.039
have some time.)

00:00:17.039 --> 00:00:19.039
[Corwin:] All right. Great.
([Amin:] Yeah, go for it.)

00:00:19.039 --> 00:00:20.720
Well, I'll just drive into my

00:00:20.720 --> 00:00:22.384
prepared thing here then.

00:00:22.384 --> 00:00:24.720
(Amin: yeah, actually, you're
right on time, so...)

00:00:24.720 --> 00:00:27.664
[Corwin:] oh what an amazing thing.

00:00:27.664 --> 00:00:31.199
I just... You know, I have been
trying to do what I...

00:00:31.199 --> 00:00:33.040
I've got a big thank you planned

00:00:33.040 --> 00:00:36.239
at the end, but let me just say,

00:00:36.239 --> 00:00:39.200
it's been really cool to watch the

00:00:39.200 --> 00:00:42.160
way that people work together.

00:00:42.160 --> 00:00:46.800
([Amin:] Absolutely. It's...
This whole event today has been

00:00:46.800 --> 00:00:50.879
nothing but awesome, and

00:00:50.879 --> 00:00:53.120
no little part thanks to all of the help

00:00:53.120 --> 00:00:56.909
from all of you guys and everyone.

00:00:56.909 --> 00:00:59.120
Yeah, it's awesome.

00:00:59.120 --> 00:01:03.065
With that, I'll just shut up
for now.

00:01:03.065 --> 00:01:04.891
Take it away, Corwin.)

00:01:04.891 --> 00:01:06.479
[Corwin:] Who knows how to make

00:01:06.479 --> 00:01:09.840
make that the default in good old smex?

00:01:09.840 --> 00:01:12.799
All right. So I'm gonna try to continue

00:01:12.799 --> 00:01:14.551
my theme from the previous talk.

00:01:14.551 --> 00:01:16.393
I'm a longtime Emacs user,

00:01:16.393 --> 00:01:20.240
but I'm a pretty new person

00:01:20.240 --> 00:01:22.380
to trying to really understand

00:01:22.380 --> 00:01:24.960
what's going on within Emacs and make

00:01:24.960 --> 00:01:28.240
my customizations to it--simple for

00:01:28.240 --> 00:01:30.960
what I tend to just think of will work.

00:01:30.960 --> 00:01:33.566
And maybe that's a nice bow

00:01:33.566 --> 00:01:36.240
to put on that earlier talk.

00:01:40.479 --> 00:01:44.981
Let's see here now. It's C-x M-i.

00:01:44.981 --> 00:01:48.159
That's right.

00:01:48.159 --> 00:01:52.960
And let's try that again. Okay, good.

00:01:52.960 --> 00:01:55.240
So demoing is fun,

00:01:55.240 --> 00:01:57.192
but I will save most of that

00:01:57.192 --> 00:01:59.759
for tomorrow where my

00:01:59.759 --> 00:02:02.750
dear friend and co-collaborator

00:02:02.750 --> 00:02:04.799
in bringing you the dungeon-mode project,

00:02:04.799 --> 00:02:07.261
which is sort of the exciting thing

00:02:07.261 --> 00:02:10.800
that we hope you'll be interested in,

00:02:10.800 --> 00:02:15.680
gets a little more of a reveal.

00:02:15.680 --> 00:02:19.360
Tonight, I'll just close saying

00:02:19.360 --> 00:02:22.640
a few things about the process of

00:02:22.640 --> 00:02:25.680
making it and continuing my theme of
community.

00:02:25.680 --> 00:02:29.760
First of all, a specific and upfront
shout out

00:02:29.760 --> 00:02:33.120
to tv's wasamasa who

00:02:33.120 --> 00:02:36.239
absolutely shaped and guided this

00:02:36.239 --> 00:02:38.582
this program. I may have taken out

00:02:38.582 --> 00:02:39.898
a slide with your name on it,

00:02:39.898 --> 00:02:43.599
but thank you.

00:02:43.599 --> 00:02:46.479
So when we think about Emacs macros

00:02:46.479 --> 00:02:50.239
and the power that they give us,

00:02:53.280 --> 00:02:54.720
I think about them as a really

00:02:54.720 --> 00:02:56.400
deep rabbit hole. They confuse

00:02:56.400 --> 00:03:00.239
people a lot. And so, to try to center

00:03:00.239 --> 00:03:02.480
myself on that, I remember first that

00:03:03.599 --> 00:03:09.599
they're going to be talking to us
about code.

00:03:09.599 --> 00:03:13.519
Excuse me, I realize I hadn't
set my timer.

00:03:13.519 --> 00:03:18.000
Here we are.

00:03:18.000 --> 00:03:20.543
So a simple macro syntax is

00:03:20.543 --> 00:03:22.239
going to generate

00:03:22.239 --> 00:03:25.920
something that is implicitly confusing

00:03:25.920 --> 00:03:27.657
to somebody that knows the syntax

00:03:27.657 --> 00:03:28.988
of Emacs Lisp well.

00:03:28.988 --> 00:03:30.785
We see something like this

00:03:30.785 --> 00:03:32.784
and a veteran eye says

00:03:32.784 --> 00:03:36.239
"That x isn't quoted. What's going on?"

00:03:36.239 --> 00:03:39.840
but it can be hard to miss.

00:03:39.840 --> 00:03:43.040
A lot of the functions (as we'll talk

00:03:43.040 --> 00:03:46.640
about in a moment) that are built
into Emacs

00:03:46.640 --> 00:03:48.572
really are macros, so a lot of

00:03:48.572 --> 00:03:50.480
Emacs features work this way.

00:03:50.480 --> 00:03:53.040
It might be scary, but we have to look at

00:03:53.040 --> 00:03:54.640
it closely if we really want to get

00:03:54.640 --> 00:03:58.400
friendly with Emacs.

00:03:58.400 --> 00:04:01.439
Let's just jump right into defmacro,

00:04:01.439 --> 00:04:03.920
which is our key entry point.

00:04:04.720 --> 00:04:05.833
The notes from this talk

00:04:05.833 --> 00:04:09.420
include the link to that,

00:04:09.420 --> 00:04:12.000
which... Definitely

00:04:12.000 --> 00:04:14.640
read through a couple of times.

00:04:14.640 --> 00:04:16.000
That may take you through

00:04:16.000 --> 00:04:19.440
into the cl-def macro, which adds

00:04:19.440 --> 00:04:23.440
the Common Lisp extensions.

00:04:23.440 --> 00:04:28.080
Definitely challenging.

00:04:28.080 --> 00:04:30.560
I've struggled there,

00:04:30.560 --> 00:04:31.759
as we'll take a look at

00:04:31.759 --> 00:04:34.800
in a moment.

00:04:34.800 --> 00:04:36.266
So I haven't played too much with

00:04:36.266 --> 00:04:38.320
cl-maclet. Perhaps success in

00:04:38.320 --> 00:04:40.804
in that keyword space

00:04:40.804 --> 00:04:44.320
and figuring out what
the right balance is there

00:04:44.320 --> 00:04:46.000
will give me the confidence to try

00:04:46.000 --> 00:04:51.680
some more lexical macros.

00:04:51.680 --> 00:04:53.402
Let me also briefly introduce

00:04:53.402 --> 00:04:55.134
the comma (,) and back quote (`).

00:04:55.134 --> 00:04:57.389
If you have allowed your eyes

00:04:57.389 --> 00:04:59.321
to cross when you see these,

00:04:59.321 --> 00:05:03.113
that's not a shameful,
shameful thing.

00:05:03.113 --> 00:05:06.080
It's confusing, and we should be

00:05:06.080 --> 00:05:07.543
alerting each other

00:05:07.543 --> 00:05:09.520
when we stick macros in,

00:05:09.520 --> 00:05:11.199
often by putting them in

00:05:11.199 --> 00:05:12.255
different library spaces

00:05:12.255 --> 00:05:14.160
for complicated projects,

00:05:14.160 --> 00:05:17.520
or otherwise warning people

00:05:17.520 --> 00:05:19.520
that this is not an interactive function,

00:05:19.520 --> 00:05:21.919
even if you get away
with using it like one.

00:05:22.639 --> 00:05:26.000
Watch your back.

00:05:26.000 --> 00:05:32.800
The manual itself talks about macros

00:05:32.800 --> 00:05:35.840
as being a way of evaluating,

00:05:35.840 --> 00:05:39.993
as being an evaluator that will take

00:05:39.993 --> 00:05:42.800
our Emacs Lisp expression

00:05:42.800 --> 00:05:44.800
and the set of forms that

00:05:44.800 --> 00:05:47.590
will feed to it our code,

00:05:48.960 --> 00:05:50.792
but it also provides us with

00:05:50.792 --> 00:05:53.467
this concept of an environment.

00:05:53.467 --> 00:05:57.027
That's really where the power
comes in.

00:05:57.027 --> 00:05:58.240
Through that, we can have

00:05:58.240 --> 00:06:00.080
lexical variables and

00:06:00.080 --> 00:06:03.199
think about--bring in some of the

00:06:03.199 --> 00:06:06.400
capabilities that

00:06:06.400 --> 00:06:09.759
can be harder to reach with

00:06:09.759 --> 00:06:13.840
a pure declarative statement that

00:06:13.840 --> 00:06:21.440
doesn't allow for top level

00:06:21.440 --> 00:06:28.639
asynchronous... Asynchronicity...

00:06:28.639 --> 00:06:31.950
I'm gonna basically

00:06:33.520 --> 00:06:35.577
ignore the byte-compilation phase

00:06:35.577 --> 00:06:36.880
for this talk

00:06:36.880 --> 00:06:38.463
in order to have any prayer

00:06:38.463 --> 00:06:39.919
of getting through it in the

00:06:39.919 --> 00:06:43.600
remaining 9 or 11 minutes or whatever.

00:06:43.600 --> 00:06:50.441
But suffice to say,
that's a scary space,

00:06:50.441 --> 00:06:52.240
and that's really

00:06:52.240 --> 00:06:53.800
the thing that you want to

00:06:53.800 --> 00:06:55.277
start learning about

00:06:55.277 --> 00:06:57.199
as you think about

00:06:57.199 --> 00:07:02.160
taking macros on in earnest.

00:07:02.160 --> 00:07:05.919
Coming back to the comma syntax,

00:07:05.919 --> 00:07:09.759
then, having given ourselves a

00:07:09.759 --> 00:07:12.479
working definition for the Emacs Lisp

00:07:12.479 --> 00:07:14.479
runtime environment, then we can say that

00:07:14.479 --> 00:07:15.840
macros are going to

00:07:15.840 --> 00:07:21.120
inject code back into that stream,

00:07:21.120 --> 00:07:25.280
whereas backquote (`)

00:07:25.280 --> 00:07:28.479
is going to give code back.

00:07:28.479 --> 00:07:31.919
to the stream--or interject, sorry,

00:07:31.919 --> 00:07:33.632
it's going to interject

00:07:33.632 --> 00:07:35.360
back into the stream.

00:07:35.360 --> 00:07:39.840
Sort of an exclamatory "Excuse me,

00:07:39.840 --> 00:07:46.966
I'd like to have a value here."
We can take that value

00:07:46.966 --> 00:07:48.639
from the environment as it exists

00:07:48.639 --> 00:07:54.160
when our macro is evaluated.

00:07:54.160 --> 00:07:56.003
Backquote, on the other hand,

00:07:56.003 --> 00:08:00.560
takes the result from that

00:08:00.560 --> 00:08:02.201
and returns it back to the stream

00:08:02.201 --> 00:08:03.467
for evaluation at the

00:08:03.467 --> 00:08:05.680
processing level that invoked us.

00:08:05.680 --> 00:08:08.720
So in other words, perhaps back up to

00:08:08.720 --> 00:08:10.960
a top-level eval expression where our

00:08:10.960 --> 00:08:16.720
macro is invoked.

00:08:20.080 --> 00:08:22.560
I'm going to briefly bring

00:08:22.560 --> 00:08:23.759
you back to the game

00:08:23.759 --> 00:08:27.120
for just a moment.

00:08:30.240 --> 00:08:32.479
I won't linger on this slide,

00:08:32.479 --> 00:08:37.039
but briefly: this is a

00:08:37.039 --> 00:08:41.615
role-playing, pen and pencil,

00:08:41.615 --> 00:08:43.829
physical dice tradition

00:08:43.829 --> 00:08:46.320
that dates back a long time

00:08:46.320 --> 00:08:48.080
from a technology perspective.

00:08:48.080 --> 00:08:50.727
It's old in the same way

00:08:50.727 --> 00:08:58.560
that other tools that I like
are old.

00:08:58.560 --> 00:09:00.185
It's simple to understand.

00:09:00.185 --> 00:09:01.873
I can communicate a lot with it

00:09:01.873 --> 00:09:03.952
with a simple amount of typing

00:09:03.952 --> 00:09:09.120
or scribbling something
on a piece of paper.

00:09:09.120 --> 00:09:13.500
It has a complicated problem space
of its own.

00:09:13.500 --> 00:09:15.519
Again, I don't want to

00:09:15.519 --> 00:09:18.212
get too much into the game here,

00:09:18.212 --> 00:09:20.177
but in this talk,

00:09:20.177 --> 00:09:22.590
for the last five minutes,

00:09:22.590 --> 00:09:24.751
I'll focus on the process

00:09:24.751 --> 00:09:26.640
that we took to

00:09:26.640 --> 00:09:29.190
automate getting data out of

00:09:29.190 --> 00:09:31.564
the Org Mode tables
which eventually

00:09:31.564 --> 00:09:33.855
(as we'll talk about more
tomorrow)

00:09:33.855 --> 00:09:36.000
are used to draw

00:09:36.000 --> 00:09:39.440
game maps and other things.

00:09:39.440 --> 00:09:42.543
Here I talk about why we did
that.

00:09:42.543 --> 00:09:45.279
I'm going to skip briefly past that,

00:09:45.279 --> 00:09:49.360
and say instead that at a high level,

00:09:49.360 --> 00:09:51.440
it's symbolic informatics.

00:09:51.440 --> 00:09:53.519
We're giving a symbolic name

00:09:53.519 --> 00:09:58.080
to a tile set,

00:10:02.000 --> 00:10:04.000
and then assigning that tile set some

00:10:04.000 --> 00:10:04.840
some characteristics

00:10:04.840 --> 00:10:06.820
like physical speeds, screen space

00:10:06.820 --> 00:10:08.399
(a variable that we might

00:10:08.399 --> 00:10:12.800
want to swap in), and so forth.

00:10:12.800 --> 00:10:15.200
You know, our project rests heavily on

00:10:15.200 --> 00:10:21.040
Org Mode and its
fundamental capabilities.

00:10:21.040 --> 00:10:24.000
The code I'm going to show here

00:10:28.320 --> 00:10:31.360
is focused around a sticky

00:10:31.360 --> 00:10:32.380
problem space in

00:10:32.380 --> 00:10:33.861
information technology.

00:10:33.861 --> 00:10:38.240
I'm a professional software engineer

00:10:38.240 --> 00:10:40.362
turned technology architect.

00:10:40.362 --> 00:10:43.495
I support the websites for

00:10:43.495 --> 00:10:46.533
a recognizable financial services brand

00:10:46.533 --> 00:10:48.500
that I don't identify

00:10:48.500 --> 00:10:50.720
just so I don't accidentally end up

00:10:50.720 --> 00:10:54.399
inadvertently misrepresenting my firm

00:10:54.399 --> 00:10:56.456
in some financial perspective

00:10:56.456 --> 00:10:57.760
if I let some other

00:10:57.760 --> 00:11:03.300
companies' name slip, or my own.

00:11:03.300 --> 00:11:07.700
It's certainly no representation

00:11:07.700 --> 00:11:11.279
of an opinion other than my own.

00:11:18.800 --> 00:11:22.720
So ETL has to do with moving data around.

00:11:22.720 --> 00:11:26.240
We have the idea of

00:11:26.240 --> 00:11:29.200
a pipeline where we'll be able to verify

00:11:29.200 --> 00:11:30.560
certain assumptions,

00:11:30.560 --> 00:11:32.106
nominally about data quality,

00:11:32.106 --> 00:11:33.600
but it could be about anything.

00:11:33.600 --> 00:11:35.630
Before the pipeline starts, okay,

00:11:35.630 --> 00:11:36.886
we've got a state where we think

00:11:36.886 --> 00:11:38.560
it should work if we run it.

00:11:38.560 --> 00:11:41.920
We have some extraction where we'll

00:11:41.920 --> 00:11:43.973
get our sources, and we may have

00:11:43.973 --> 00:11:45.040
the opportunity to

00:11:45.040 --> 00:11:47.327
make some assertions there.

00:11:47.327 --> 00:11:50.510
In the transform stage,
as well as the load,

00:11:50.510 --> 00:11:52.720
things get a little dicer,

00:11:52.720 --> 00:11:54.079
to the point where we come out of the

00:11:54.079 --> 00:11:55.360
load stage and we should have some

00:11:55.360 --> 00:11:56.676
really solid assertions again

00:11:56.676 --> 00:11:57.724
that we can even go back

00:11:57.724 --> 00:11:59.680
and compare to the extract stage.

00:11:59.680 --> 00:12:02.639
From this, we have the rudimentaries

00:12:02.639 --> 00:12:04.959
of a data quality practice.

00:12:04.959 --> 00:12:08.120
In this case, we have a number of

00:12:08.120 --> 00:12:09.360
Org Mode files that will all

00:12:09.360 --> 00:12:12.639
be distributed across a

00:12:12.639 --> 00:12:16.720
number of players' computers,

00:12:16.720 --> 00:12:18.959
so we might not want to update every

00:12:18.959 --> 00:12:20.320
part of every buffer.

00:12:20.320 --> 00:12:22.720
I think it's a complicated problem space.

00:12:22.720 --> 00:12:24.560
So we tried to take

00:12:24.560 --> 00:12:27.839
a long-term view of

00:12:27.839 --> 00:12:30.321
the solution that we needed.

00:12:30.321 --> 00:12:32.160
So I'll go ahead

00:12:32.160 --> 00:12:36.279
and open up the function
that...

00:12:36.279 --> 00:12:39.020
Let's actually start with the one

00:12:39.020 --> 00:12:41.680
that's pretty easy to read.

00:12:41.680 --> 00:12:46.800
I'm gonna go ahead and
just crank it up huge,

00:12:46.800 --> 00:12:51.680
in case anybody's watching in 480.

00:12:51.680 --> 00:12:57.733
This program is not a work of art

00:12:57.733 --> 00:13:01.120
It's a simple implementation
of the idea that

00:13:01.120 --> 00:13:04.000
an alist of functions

00:13:04.000 --> 00:13:06.633
that return maybe some data,

00:13:06.633 --> 00:13:10.399
maybe some data and an entry
back into that alist,

00:13:10.399 --> 00:13:13.040
can be done quite extensively with

00:13:13.040 --> 00:13:15.680
very few lines of code.

00:13:15.680 --> 00:13:17.586
Neither is it an especially tight

00:13:17.586 --> 00:13:19.600
or thrifty implementation.

00:13:19.600 --> 00:13:22.000
It's just trying to get the job done

00:13:22.000 --> 00:13:25.056
with a doc statement for everything.

00:13:25.056 --> 00:13:28.595
At the heart, we see a call to

00:13:28.595 --> 00:13:32.067
this macro called dm-coalesce-hash,

00:13:32.067 --> 00:13:33.714
and that's what I'd like
to focus in on.

00:13:33.714 --> 00:13:35.360
You can see... I think

00:13:35.360 --> 00:13:38.800
that something unpleasant is
happening here.

00:13:38.800 --> 00:13:43.991
I've got an eval in what is...

00:13:43.991 --> 00:13:49.519
I will share a fairly central function

00:13:49.519 --> 00:13:52.160
that those implementing
this ETL pattern are

00:13:52.160 --> 00:13:54.933
welcome to derive from.

00:13:54.933 --> 00:13:57.680
That is, this is a
default transform

00:13:57.680 --> 00:14:00.959
that you can get when loading
certain kinds of

00:14:00.959 --> 00:14:04.560
org-mode tables that have been

00:14:04.560 --> 00:14:06.399
properly adorned. Again, we'll get

00:14:06.399 --> 00:14:09.120
into that all tomorrow.

00:14:09.120 --> 00:14:11.900
So, keeping an eye on time.
Couple minutes left.

00:14:11.900 --> 00:14:13.760
Let's look at the macro itself.

00:14:13.760 --> 00:14:15.000
I have a slide on this,

00:14:15.000 --> 00:14:24.639
but let's go ahead
and risk getting off page.

00:14:24.639 --> 00:14:27.199
Oh boy. Here we go. So this is my

00:14:27.199 --> 00:14:28.959
utilities bucket.

00:14:28.959 --> 00:14:31.920
It has such basic features as "give me a

00:14:31.920 --> 00:14:34.000
hash table with some defaults, I'll think

00:14:34.000 --> 00:14:36.000
about that later,"

00:14:36.000 --> 00:14:44.720
and "add to list," a special version

00:14:44.720 --> 00:14:47.600
that enables us to be a little cavalier

00:14:47.600 --> 00:14:49.360
in experimenting with alist versus

00:14:49.360 --> 00:14:50.967
hashes versus plists.

00:14:50.967 --> 00:14:53.178
We've made a right mess for
ourselves

00:14:53.178 --> 00:14:54.399
in the proof of concept area,

00:14:54.399 --> 00:14:57.433
and it's ripe for someone to write a

00:14:57.433 --> 00:14:58.560
whitepaper about

00:14:58.560 --> 00:15:00.240
when to prefer these things.

00:15:04.800 --> 00:15:08.000
The merge alist...

00:15:08.000 --> 00:15:12.959
Same work here.
Let's get down to business.

00:15:12.959 --> 00:15:14.667
This function has quite a...

00:15:14.667 --> 00:15:17.467
This macro has quite a doc string.

00:15:17.467 --> 00:15:20.720
I think I mentioned earlier
that I got myself into

00:15:20.720 --> 00:15:22.088
trouble with the keyword properties.

00:15:22.088 --> 00:15:23.519
You can see that we have

00:15:23.519 --> 00:15:27.359
not only quite a number of them,

00:15:27.359 --> 00:15:31.155
but a lot of default values,

00:15:31.155 --> 00:15:35.446
many of which may be relying on

00:15:35.446 --> 00:15:37.264
the values that are passed in here.

00:15:37.264 --> 00:15:40.000
This is complicated. As it turns out,

00:15:40.000 --> 00:15:44.000
I wasn't brave enough in most cases

00:15:44.000 --> 00:15:45.485
to try to write a lambda

00:15:45.485 --> 00:15:47.279
that could understand and

00:15:47.279 --> 00:15:49.300
replace its own local variable.

00:15:49.300 --> 00:15:50.399
I just didn't...

00:15:50.399 --> 00:15:53.519
It didn't save me enough time. This was

00:15:53.519 --> 00:15:56.532
really easy to read and write and
understand

00:15:56.532 --> 00:15:58.240
as I thought through my problem,

00:15:58.240 --> 00:16:00.000
but now, as I use it,

00:16:00.000 --> 00:16:02.486
I've lost a little ground with
this.

00:16:02.486 --> 00:16:04.079
I'm not even sure

00:16:04.079 --> 00:16:06.453
I like what I got from

00:16:06.453 --> 00:16:09.341
the many keyword properties
when it...

00:16:09.341 --> 00:16:11.920
And we can look, perhaps if we have

00:16:11.920 --> 00:16:17.340
the time, at what that looks like in

00:16:19.920 --> 00:16:22.720
Oh, all right, I have to separately

00:16:22.720 --> 00:16:24.480
dismiss and restart that.

00:16:24.480 --> 00:16:27.519
So that's just about my time.

00:16:27.519 --> 00:16:29.600
Being respectful of that, I want

00:16:29.600 --> 00:16:31.920
to invite presenters to just jump in at

00:16:31.920 --> 00:16:35.519
any of the many large pauses I leave.

00:16:35.519 --> 00:16:38.079
I'll just leave up the doc string

00:16:38.079 --> 00:16:40.160
for a moment and maybe split the screen

00:16:40.160 --> 00:16:45.199
and pull open an item.

00:16:45.199 --> 00:16:48.720
([Amin]: Thank you very

00:16:48.720 --> 00:16:50.720
much for your talk, Corwin.

00:16:50.720 --> 00:16:53.839
I think you still have

00:16:53.839 --> 00:16:55.027
maybe three or four more minutes,

00:16:55.027 --> 00:16:57.680
if you want to quickly wrap up.)

00:16:57.680 --> 00:17:00.644
[Corwin:] Okay, so three or four
more minutes

00:17:00.644 --> 00:17:05.439
I can easily spend on thank yous.

00:17:05.439 --> 00:17:07.280
I might switch to that if there aren't

00:17:07.280 --> 00:17:08.270
questions on the pad.

00:17:10.160 --> 00:17:12.559
([Amin:] Would you like me to pull up the pad,

00:17:12.559 --> 00:17:14.079
or are you looking at it?)

00:17:14.079 --> 00:17:16.777
[Corwin:] I am. I bookmarked it.

00:17:16.777 --> 00:17:30.840
I am pulling the tab
and I'll bring it in.

00:17:30.840 --> 00:17:38.799
Okay. All right. This is the wrong
Etherpad.

00:17:38.799 --> 00:17:44.480
Thanks for the link.

00:17:44.480 --> 00:17:54.880
All right. So I think I'm
looking for macros.

00:17:54.880 --> 00:17:57.630
Okay. Key message. Sure.

00:17:57.630 --> 00:18:01.679
So, the key message is that it's

00:18:01.679 --> 00:18:02.960
a jungle out there.

00:18:02.960 --> 00:18:05.912
Macros, along with any other design,

00:18:05.912 --> 00:18:08.559
can leave you in a position

00:18:08.559 --> 00:18:11.919
where you have a nice API. I can show

00:18:11.919 --> 00:18:13.600
you other examples (you can find them in

00:18:13.600 --> 00:18:14.960
the dungeon-mode source)

00:18:14.960 --> 00:18:18.480
of many, many other places where I use

00:18:18.480 --> 00:18:20.820
this exact same formula,

00:18:20.820 --> 00:18:23.840
quickly sketching out
how a character sheet

00:18:23.840 --> 00:18:26.180
or another big data set

00:18:26.180 --> 00:18:28.480
needs to figure out
what tables are

00:18:28.480 --> 00:18:29.320
going to be interesting

00:18:29.320 --> 00:18:30.720
from the collection of files,

00:18:30.720 --> 00:18:33.967
and then load up the tile set,

00:18:33.967 --> 00:18:38.880
and the layout file from that.

00:18:38.880 --> 00:18:40.542
And I mean, it works.

00:18:40.542 --> 00:18:42.677
The project is moving forward
with this.

00:18:42.677 --> 00:18:44.799
I have the flexibility that I need.

00:18:44.799 --> 00:18:46.559
But here I am evaling my own code

00:18:46.559 --> 00:18:48.640
to make darn sure even if I get

00:18:48.640 --> 00:18:52.400
byte-compiled, this macro

00:18:52.400 --> 00:18:55.440
does get evaluated in the user's real

00:18:55.440 --> 00:18:57.684
run time. Clearly a design fail.

00:18:57.684 --> 00:18:58.890
So that would be...

00:18:58.890 --> 00:19:00.880
The key point of my talk is to

00:19:00.880 --> 00:19:05.600
present this design fail and

00:19:05.600 --> 00:19:08.320
thank the community, but especially

00:19:08.320 --> 00:19:10.942
wasamasa for some patience.

00:19:10.942 --> 00:19:13.280
Let me add at this moment that

00:19:13.280 --> 00:19:13.333
he was so frustrated with me.

00:19:13.333 --> 00:19:17.115
They were sort of frustrated with me

00:19:17.115 --> 00:19:20.400
(I think I didn't qualify pronouns)

00:19:24.240 --> 00:19:26.287
with doing this. The first...

00:19:26.287 --> 00:19:27.985
This was one of our first
interactions,

00:19:27.985 --> 00:19:29.919
and the feedback was,

00:19:29.919 --> 00:19:34.240
"Why is this a macro. Full stop."

00:19:34.240 --> 00:19:36.640
And that's a great message, actually.

00:19:36.640 --> 00:19:39.520
I hope that maybe this
can encourage

00:19:39.520 --> 00:19:42.720
further talks across the subject about,

00:19:42.720 --> 00:19:43.808
you know, "Hey, wait a minute,

00:19:43.808 --> 00:19:45.549
macros are really fantastic,"

00:19:45.549 --> 00:19:47.018
as I hope I made clear.

00:19:47.018 --> 00:19:48.559
You can do a tremendous amount

00:19:48.559 --> 00:19:51.039
with them, and we rely on them

00:19:51.039 --> 00:19:55.200
for almost all the fun goodies,

00:19:55.200 --> 00:20:02.159
from defun, setq...

00:20:02.159 --> 00:20:04.639
I want to get to my thank yous.

00:20:04.639 --> 00:20:18.840
Let me just peek back at the pad.

00:20:20.000 --> 00:20:22.080
Well, that was actually a scratch buffer,

00:20:22.080 --> 00:20:24.720
so I'll have to read it cold off
my notes.

00:20:27.919 --> 00:20:30.320
But I'll switch to... I'll also...

00:20:30.320 --> 00:20:31.600
I'll say a couple of thank-yous if you

00:20:31.600 --> 00:20:34.320
don't mind, Amin.

00:20:34.320 --> 00:20:36.080
In addition to the big thank you that I

00:20:36.080 --> 00:20:39.360
hope was implied by my shout out
to wasamasa,

00:20:39.360 --> 00:20:42.720
I also want to thank you, Amin, for

00:20:42.720 --> 00:20:46.640
your kindness in extending

00:20:46.640 --> 00:20:51.360
to the project as well as to me, the

00:20:51.360 --> 00:20:54.320
the chance to present here.

00:20:54.320 --> 00:20:56.358
You've also done a lot of great stuff

00:20:56.358 --> 00:20:59.360
for our project. Thank you very much for
that.

00:20:59.360 --> 00:21:03.400
Sacha Chua (I'll get there),

00:21:03.400 --> 00:21:15.919
thank you so much for

00:21:15.919 --> 00:21:17.200
the inspiration that you are to our

00:21:17.200 --> 00:21:18.320
whole community.

00:21:18.320 --> 00:21:22.400
I also want to thank the presenters

00:21:22.400 --> 00:21:25.600
for just being so flexible and

00:21:25.600 --> 00:21:27.600
nagging back through the whole thing,

00:21:27.600 --> 00:21:29.120
and especially to Leo

00:21:29.120 --> 00:21:32.159
who has done so much to
drive the show today.

00:21:32.159 --> 00:21:37.242
This is a fractious tent at times,

00:21:37.242 --> 00:21:39.800
and sometimes it is indeed

00:21:39.800 --> 00:21:41.360
a little bit of a circus,

00:21:41.360 --> 00:21:44.746
but I am learning so much so fast.

00:21:44.746 --> 00:21:46.880
I'm just inspired by how much

00:21:46.880 --> 00:21:49.333
Emacs can teach us.

00:21:49.333 --> 00:21:52.901
([Amin:] thank you, Corwin,
for your kind words

00:21:52.901 --> 00:21:54.960
about me, of course,

00:21:54.960 --> 00:21:56.000
about all of us

00:21:56.000 --> 00:21:58.000
and the conference...

00:21:58.000 --> 00:22:02.400
Indeed, thanks to everyone who's helped,

00:22:02.400 --> 00:22:04.159
including the speakers, of course,

00:22:04.159 --> 00:22:05.840
without whom EmacsConf really

00:22:05.840 --> 00:22:08.960
wouldn't have been a EmacsConf.

00:22:08.960 --> 00:22:10.640
It's been a pleasure

00:22:10.640 --> 00:22:12.366
knowing you and
working with you,

00:22:12.366 --> 00:22:15.743
from afar for the most part

00:22:15.743 --> 00:22:17.360
on dungeon-mode,

00:22:17.360 --> 00:22:19.937
helping with small things
here and there

00:22:19.937 --> 00:22:21.796
but yeah, it's been my pleasure,

00:22:21.796 --> 00:22:23.840
and it's great to have you and

00:22:23.840 --> 00:22:26.582
everyone else part of the
community,

00:22:26.582 --> 00:22:29.180
and for me to be part of the
community.

00:22:29.180 --> 00:22:30.559
It's been a lot of fun.

00:22:30.559 --> 00:22:33.679
Thank you.)

00:22:33.679 --> 00:22:35.206
[Corwin]: It's an honor.

00:22:35.206 --> 00:22:37.428
I don't use that word an awful lot

00:22:37.428 --> 00:22:39.867
because I sort of smirk at it.

00:22:39.867 --> 00:22:43.941
It gets us in a lot of trouble,
honor does,

00:22:43.941 --> 00:22:46.904
but this will be a sure time
to use it.

00:22:46.904 --> 00:22:48.840
([Amin:] Thank you.)

00:22:48.840 --> 00:22:51.840
[Corwin:] Likewise.