summaryrefslogtreecommitdiffstats
path: root/2025/captions/emacsconf-2025-modern--some-problems-of-modernizing-emacs--eduardo-ochs--main.vtt
blob: a89235663412d954888a1bc654f1939b6765e6ed (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
WEBVTT
Kind: captions
Language: en-GB

NOTE Introduction

00:00:00.000 --> 00:00:02.359
Hi, my name is Eduardo Ochs,

00:00:02.360 --> 00:00:06.639
and this is my video for the EmacsConf 2025.

00:00:06.640 --> 00:00:09.799
Its title is Some Problems of Modernizing Emacs,

00:00:09.800 --> 00:00:12.839
and that is the same title as a video

00:00:12.840 --> 00:00:16.199
that I tried to record in March.

00:00:16.200 --> 00:00:19.879
But my video from March had a good "beginning" and a bad "rest",

00:00:19.880 --> 00:00:23.759
and I thought, I can't release that because the rest is very bad.

00:00:23.760 --> 00:00:27.919
I need to replace... to re-record the last part of the video.

00:00:27.920 --> 00:00:29.759
But I never did that.

00:00:29.760 --> 00:00:33.199
So this video is going to be the first 12 minutes

00:00:33.200 --> 00:00:37.959
of that other video, with another ending.

00:00:37.960 --> 00:00:41.439
And in this other ending, I'm going to show some things

00:00:41.440 --> 00:00:46.639
that are very easy to test. And, if people are interested,

00:00:46.640 --> 00:00:51.799
then the rest of the old video will make more sense.

00:00:51.800 --> 00:00:55.059
Anyway, let me start.

00:00:55.000 --> 00:00:57.000
Hi! My name is Eduardo Ochs. I'm the

00:00:57.000 --> 00:01:00.000
author of an Emacs package called eev and

00:01:00.000 --> 00:01:03.000
the title of this video is

00:01:03.000 --> 00:01:05.000
"Some problems of modernizing Emacs".

NOTE The main themes of this video

00:01:05.000 --> 00:01:08.000
Here is a summary of the main themes

00:01:08.000 --> 00:01:10.000
of this video. I'm going to talk mainly

00:01:10.000 --> 00:01:12.000
about these four things here. The first

00:01:12.000 --> 00:01:15.000
one is that Emacs has changed a lot in its

00:01:15.000 --> 00:01:18.000
recent versions, and now it has lots of

00:01:18.000 --> 00:01:21.000
types... so if we want to look under the

00:01:21.000 --> 00:01:24.000
hood and to understand what Emacs

00:01:24.000 --> 00:01:27.000
really does we are going to stumble on

00:01:27.000 --> 00:01:30.000
lots of types... and the

00:01:30.000 --> 00:01:34.000
current tree of classes and types

00:01:34.000 --> 00:01:37.000
looks like this... that is,

00:01:37.000 --> 00:01:46.000
is quite big.

00:01:46.000 --> 00:01:49.000
The second theme is that people used

00:01:49.000 --> 00:01:53.000
to say things like "Anyone can learn Lisp

00:01:53.000 --> 00:01:56.000
in one day"... I'm going to explain

00:01:56.000 --> 00:02:01.000
this quote, and I'm also going to show

00:02:01.000 --> 00:02:04.000
that now this is gone... anyway. This is a

00:02:04.000 --> 00:02:08.000
very short summary... details soon.

00:02:08.000 --> 00:02:10.000
I will also show how to display

00:02:10.000 --> 00:02:13.000
better "inner views" of Emacs objects...

00:02:13.000 --> 00:02:16.000
I'm going to define what is an inner view,

00:02:16.000 --> 00:02:18.000
of course.

NOTE Inner views of Emacs objects

00:02:18.000 --> 00:02:20.000
The main trick is that we are going

00:02:20.000 --> 00:02:24.000
to use one of the ways of displaying

00:02:24.000 --> 00:02:29.000
internal objects, that is the `cl-print`

00:02:29.000 --> 00:02:32.000
family of functions, for example,

00:02:32.000 --> 00:02:35.000
`cl-prin1-to-string`, and here are some

00:02:35.000 --> 00:02:37.000
examples of the kind of output that we

00:02:37.000 --> 00:02:38.000
are going to see...

00:02:38.000 --> 00:02:44.000
for example, if we run these two lines

00:02:44.000 --> 00:02:47.000
here the first line defines a function `foo`

00:02:47.000 --> 00:02:52.000
and the second line sets `o` to the

00:02:52.000 --> 00:02:54.000
internal view of the definition of `foo`.

NOTE Older Emacses

00:02:54.000 --> 00:02:59.000
In older Emacses `o` would be just a

00:02:59.000 --> 00:03:02.000
list that looks... that would look very

00:03:02.000 --> 00:03:05.000
similar to this line here... but in newer

00:03:05.000 --> 00:03:09.000
Emacses the result of this - I mean, the

00:03:09.000 --> 00:03:12.000
the contents of `o` is this thing here,

00:03:12.000 --> 00:03:15.000
that looks quite different

00:03:15.000 --> 00:03:18.000
from this definition.

00:03:18.000 --> 00:03:21.000
So, in older Emacses

00:03:21.000 --> 00:03:25.000
the contents of the

00:03:25.000 --> 00:03:28.000
function cell of `o`...

00:03:28.000 --> 00:03:30.000
sorry, of the function cell of `foo`,

00:03:30.000 --> 00:03:32.000
would be an "old-style lambda",

00:03:32.000 --> 00:03:35.000
that would be just a list like this...

NOTE Newer Emacses

00:03:35.000 --> 00:03:39.000
and in newer Emacses uh the contents of O would

00:03:39.000 --> 00:03:42.000
be a "vector-like lambda"... look for the

00:03:42.000 --> 00:03:44.000
square brackets here - this is a

00:03:44.000 --> 00:03:47.000
vector, but it is preceded by a hash sign.

00:03:47.000 --> 00:03:49.000
So this is what we call

00:03:49.000 --> 00:03:51.000
a "vector-like lambda",

00:03:51.000 --> 00:03:53.000
and vector-like lambas do not

00:03:53.000 --> 00:03:55.000
have a canonical printed representation -

00:03:55.000 --> 00:03:57.000
they have at least two semicanonical

00:03:57.000 --> 00:03:59.000
printed representations...

00:03:59.000 --> 00:04:01.000
The first semicanonical

00:04:01.000 --> 00:04:04.000
printed representation is this one, that is

00:04:04.000 --> 00:04:07.000
generated by a family of functions with

00:04:07.000 --> 00:04:09.000
names like `prin1`...

00:04:09.000 --> 00:04:13.000
and the second semicanonical printed

00:04:13.000 --> 00:04:17.000
representation is like this -

00:04:17.000 --> 00:04:20.000
it looks like a list...

00:04:20.000 --> 00:04:23.000
it looks somewhat like this definition

00:04:23.000 --> 00:04:27.000
of `foo` here, but it has this

00:04:27.000 --> 00:04:29.000
`:dynbind` symbol here...

00:04:29.000 --> 00:04:32.000
and it turns out that when we use

00:04:32.000 --> 00:04:35.000
the `cl-print` family of functions we can

00:04:35.000 --> 00:04:37.000
reconfigure how things are printed...

00:04:37.000 --> 00:04:40.000
and I'm going to show several interesting

00:04:40.000 --> 00:04:47.000
ways of reconfiguring how lambdas are printed,

00:04:47.000 --> 00:04:49.000
and one of the ways is going to

00:04:49.000 --> 00:04:52.000
be like this.

00:04:52.000 --> 00:04:56.000
We can also use the `cl-print`

00:04:56.000 --> 00:04:59.000
functions with my indentation tricks to

00:04:59.000 --> 00:05:04.000
to display how types, or classes, are

00:05:04.000 --> 00:05:07.000
viewed internally by Emacs, and this is a

00:05:07.000 --> 00:05:10.000
big example...

00:05:10.000 --> 00:05:14.000
This is what Emacs considers as being

00:05:14.000 --> 00:05:16.000
the definition of the type

00:05:16.000 --> 00:05:18.000
`cl-structure-class`,

00:05:18.000 --> 00:05:21.000
class and it is this big thing here.

00:05:21.000 --> 00:05:24.000
I edited it very lightly...

00:05:24.000 --> 00:05:30.000
I just deleted some line breaks here.

NOTE Help buttons

00:05:30.000 --> 00:05:33.000
And another thing that I want to

00:05:33.000 --> 00:05:35.000
explain is that Emacs

00:05:35.000 --> 00:05:37.000
has some help functions that

00:05:37.000 --> 00:05:39.000
I have never liked...

00:05:39.000 --> 00:05:41.000
for most people they are good enough,

00:05:41.000 --> 00:05:44.000
but for me they aren't... they...

00:05:44.000 --> 00:05:48.000
uh, well - I'm going to say

00:05:48.000 --> 00:05:50.000
more about this later...

00:05:50.000 --> 00:05:52.000
and, for example,

00:05:52.000 --> 00:05:54.000
if we want a description of what is

00:05:54.000 --> 00:05:58.000
this type here, that we just saw in

00:05:58.000 --> 00:06:00.000
its internal view here...

00:06:00.000 --> 00:06:02.000
we can run either `describe-type`

00:06:02.000 --> 00:06:04.000
or my variant of `describe-type`,

00:06:04.000 --> 00:06:07.000
and we get a help buffer

00:06:07.000 --> 00:06:10.000
that looks like this, in which

00:06:10.000 --> 00:06:13.000
these blue things that are underlined

00:06:13.000 --> 00:06:15.000
are "buttons", in the classical sense...

00:06:15.000 --> 00:06:17.000
you can click on these buttons, or type

00:06:17.000 --> 00:06:19.000
RET on these buttons, and you will be

00:06:19.000 --> 00:06:22.000
taken to another help page, that is

00:06:22.000 --> 00:06:24.000
generated dynamically...

00:06:24.000 --> 00:06:28.000
and you can navigate back and forth...

00:06:28.000 --> 00:06:30.000
and well, whatever...

00:06:30.000 --> 00:06:33.000
and I'm going to explain my

00:06:33.000 --> 00:06:35.000
problems with these kinds of help buffers

00:06:35.000 --> 00:06:37.000
and what I'm trying to do to

00:06:37.000 --> 00:06:41.000
overcome these problems...

NOTE Anyone can learn Lisp in one day

00:06:41.000 --> 00:06:43.000
One of my slogans in this video

00:06:43.000 --> 00:06:44.540
is going to be this one:

00:06:44.541 --> 00:06:46.674
"Anyone can learn Lisp in one day".

00:06:46.675 --> 00:06:50.420
this is a part of a bigger quote

00:06:50.421 --> 00:06:53.040
that I took from a keynote presentation

00:06:53.041 --> 00:06:54.720
by Abelson and Sussman, who

00:06:54.721 --> 00:06:58.000
are two dinosaurs of Computer Science...

00:06:58.000 --> 00:07:00.000
Here is the full quote:

00:07:00.000 --> 00:07:04.000
"Anyone can learn Lisp in one day -

00:07:04.000 --> 00:07:06.000
except that if they already know Fortran

00:07:06.000 --> 00:07:11.000
then it would take three days."

00:07:11.000 --> 00:07:24.000
This is a frame of the video...

00:07:24.000 --> 00:07:28.000
By the way I am going to to add

00:07:28.000 --> 00:07:32.000
this... "and if the person is starting

00:07:32.000 --> 00:07:34.000
with Doom Emacs then it would take 5 years."

00:07:34.000 --> 00:07:39.000
why? I'm going to explain why.

00:07:39.000 --> 00:07:43.000
This is how Emacs used to be.

00:07:43.000 --> 00:07:46.000
If we execute these two expressions here

00:07:46.000 --> 00:07:51.000
the first one... sorry, each symbol can

00:07:51.000 --> 00:07:53.000
have two "values",

00:07:53.000 --> 00:07:54.000
one is its "value as a variable"

00:07:54.000 --> 00:07:58.000
and another one is its "value as a function"...

00:07:58.000 --> 00:08:02.000
and if we run this we store 42

00:08:02.000 --> 00:08:07.000
in the "value cell" of the symbol `foo`, and

00:08:07.000 --> 00:08:11.000
if we run this defun here it stores a

00:08:11.000 --> 00:08:14.000
certain anonymous function in the

00:08:14.000 --> 00:08:18.000
"function cell" of the symbol `foo`...

00:08:18.000 --> 00:08:22.000
and in Emacs, until some time ago

00:08:22.000 --> 00:08:27.000
if we did that and and if we ran

00:08:27.000 --> 00:08:30.774
this expression here the result

00:08:30.775 --> 00:08:32.574
would be 42,

00:08:32.575 --> 00:08:35.000
because of this line here, and if we

00:08:35.000 --> 00:08:37.840
ran this line here the result would be

00:08:37.841 --> 00:08:40.000
the anonymous function corresponding to

00:08:40.000 --> 00:08:41.000
this defun here...

00:08:41.000 --> 00:08:45.000
but now this has changed...

00:08:45.000 --> 00:08:48.000
the result of this thing here is this

00:08:48.000 --> 00:08:50.999
vector-like lambda here - but that doesn't

00:08:51.000 --> 00:08:53.279
matter much now...

00:08:53.280 --> 00:08:57.599
So, until some time ago

00:08:57.600 --> 00:09:00.839
if we did that and if we ran

00:09:00.840 --> 00:09:02.839
this expression here, (foo foo)...

00:09:02.840 --> 00:09:04.599
Emacs would do this: it would

00:09:04.600 --> 00:09:06.000
replace the first `foo` by this

00:09:06.001 --> 00:09:09.000
anonymous function here, it would replace

00:09:09.000 --> 00:09:12.040
the second `foo` by the value of `foo` as a

00:09:12.041 --> 00:09:14.459
variable, that is 42,

00:09:14.460 --> 00:09:16.774
and it would evaluate this, and the

00:09:16.775 --> 00:09:20.000
result would be 420.

00:09:20.000 --> 00:09:23.000
So, again, we used to have this slogan

00:09:23.000 --> 00:09:26.000
here, "anyone can learn Lisp in one day"...

00:09:26.000 --> 00:09:28.000
but now this is gone.

00:09:28.000 --> 00:09:30.000
Let me show... let me talk

00:09:30.000 --> 00:09:34.000
a bit more about why...

NOTE Lambdas for beginners broken

00:09:34.000 --> 00:09:36.000
the title of this slide is

00:09:36.000 --> 00:09:38.000
"Lambdas for beginners broken"...

00:09:38.000 --> 00:09:41.000
if we run this, as I've shown

00:09:41.000 --> 00:09:43.000
in the previous slide...

00:09:43.000 --> 00:09:46.474
in the old style, in old Emacses,

00:09:46.475 --> 00:09:49.279
the result of (symbol-function 'foo)

00:09:49.280 --> 00:09:52.279
would be this anonymous function here...

00:09:52.280 --> 00:09:56.319
and now we get this strange thing here.

00:09:56.320 --> 00:10:00.159
So, this is an "old-style lambda",

00:10:00.160 --> 00:10:03.999
this is a "vector-like lambda",

00:10:04.000 --> 00:10:07.599
and until the middle of 2024

00:10:07.600 --> 00:10:09.399
beginners could learn a lot of Lisp

00:10:09.400 --> 00:10:11.359
by thinking only in terms of

00:10:11.360 --> 00:10:12.960
objects like these...

00:10:13.000 --> 00:10:15.000
this is a function and this

00:10:15.000 --> 00:10:17.000
is an anonymous function, and

00:10:17.000 --> 00:10:20.000
they would learn how to draw cons cell

00:10:20.000 --> 00:10:23.000
diagrams like this thing here and this

00:10:23.000 --> 00:10:25.000
thing here...

00:10:25.000 --> 00:10:26.339
they would think on lists as

00:10:26.340 --> 00:10:29.000
being these trees here, and they

00:10:29.000 --> 00:10:32.000
would be able to understand a lot of

00:10:32.000 --> 00:10:35.000
Lisp just by thinking in these terms...

00:10:35.000 --> 00:10:39.000
and then vector-like lambdas started

00:10:39.000 --> 00:10:43.239
to appear in many places... and if we use

00:10:43.240 --> 00:10:46.474
"vector-like lambdas" in a wide sense,

00:10:46.475 --> 00:10:50.000
to mean all the new objects,

00:10:50.000 --> 00:10:54.000
these new objects, that are

00:10:54.000 --> 00:10:56.000
difficult to visualize... they also started

00:10:56.000 --> 00:10:58.000
to appear in many places.

00:10:58.000 --> 00:11:01.000
This is a continuation of the

00:11:01.000 --> 00:11:04.000
previous slide - this part here is a copy

00:11:04.000 --> 00:11:06.000
of things that were in the previous slide...

00:11:06.000 --> 00:11:12.000
before 2024 beginners could

00:11:12.000 --> 00:11:17.000
open black boxes like this...

00:11:17.000 --> 00:11:20.000
they could try to see what was in the

00:11:20.000 --> 00:11:24.000
function cell of the symbol `foo`...

00:11:24.000 --> 00:11:27.000
and they would see something elegant and

00:11:27.000 --> 00:11:29.000
mind-blowing... and they would start to love

00:11:29.000 --> 00:11:31.000
Lisp immediately.

00:11:31.000 --> 00:11:33.674
Now what they get - what they see -

00:11:33.675 --> 00:11:37.040
is a tiny part of a very complex structure

00:11:37.041 --> 00:11:39.640
that is very powerful but that is

00:11:39.641 --> 00:11:41.000
very difficult to understand...

00:11:41.000 --> 00:11:44.919
and now our beginners are overwhelmed

00:11:44.920 --> 00:11:51.339
instead of mind-blown. Note that I said "black box" here.

00:11:51.340 --> 00:11:53.400
Let me explain the term.

00:11:53.401 --> 00:11:57.539
We can open what's inside of `foo`...

00:11:57.540 --> 00:12:00.140
we can open `foo` to see the contents of

00:12:00.141 --> 00:12:03.007
the symbol `foo`, and we can try to see

00:12:03.008 --> 00:12:06.620
what's in the function cell of the

00:12:06.621 --> 00:12:08.000
symbol `foo`...

00:12:08.000 --> 00:12:10.940
so we can open the box, but what we get

00:12:10.941 --> 00:12:13.000
is something very difficult to understand,

00:12:13.000 --> 00:12:17.000
and so I'm going to say that

00:12:17.000 --> 00:12:21.000
when this happens that box is black.

00:12:21.000 --> 00:12:24.579
It is not totally black - we can open open it -

00:12:24.580 --> 00:12:27.374
but we don't understand what is going on there,

00:12:27.375 --> 00:12:30.000
so we declare that that is black.

00:12:30.000 --> 00:12:36.574
And... when these things started to happen

00:12:36.575 --> 00:12:38.974
_I_ was overwhelmed -

00:12:38.975 --> 00:12:41.974
and in this video I'm going to pretend

00:12:41.975 --> 00:12:44.000
that I was not the only person

00:12:44.000 --> 00:12:47.007
that was overwhelmed

00:12:47.008 --> 00:12:51.240
by these new structures

00:12:51.241 --> 00:12:52.000
that are not so elegant

00:12:52.000 --> 00:12:54.000
as the ones that we had before.

00:12:54.000 --> 00:12:56.000
Anyway...

NOTE Demo

00:12:59.302 --> 00:13:00.599
In the beginning of the video,

00:13:00.600 --> 00:13:02.879
I said that I was going to replace

00:13:02.880 --> 00:13:06.359
the second part of my video from March

00:13:06.360 --> 00:13:08.799
by something that was very easy to test.

00:13:08.800 --> 00:13:11.839
So this is a quick demo for the _very_ impatient.

00:13:11.840 --> 00:13:16.919
I'm recording this in December for the EmacsConf 2025.

00:13:16.920 --> 00:13:18.999
This is the demo that I'm going to present.

00:13:19.000 --> 00:13:21.759
The idea is that people can run the demo a first time

00:13:21.760 --> 00:13:24.399
just to check that everything works

00:13:24.400 --> 00:13:27.559
and to have a notion of how things look like,

00:13:27.560 --> 00:13:29.239
and then, in a second moment,

00:13:29.240 --> 00:13:32.279
they can rerun the demo more slowly

00:13:32.280 --> 00:13:34.879
to understand what each step does.

00:13:34.880 --> 00:13:38.799
So... we are in a file called "00-try-this"...

00:13:38.800 --> 00:13:42.199
and the idea is that we can execute most of this file

00:13:42.200 --> 00:13:45.359
just by typing `f8`​s in the right places.

00:13:45.360 --> 00:13:47.479
Remember that when we type `f8`

00:13:47.480 --> 00:13:49.839
on a line that starts with two red stars,

00:13:49.840 --> 00:13:53.199
eev treats that line as a comment.

00:13:53.200 --> 00:13:58.007
So I'm going to start here... Note that it says in the bottom

00:13:58.008 --> 00:13:59.740
of the screen that this is a comment.

00:13:59.741 --> 00:14:09.879
We are going to run this to download some files...

00:14:09.880 --> 00:14:12.959
Now the files are there...

00:14:12.960 --> 00:14:17.319
This `find-2a` here shows a certain file

00:14:17.320 --> 00:14:19.159
at the window at the right,

00:14:19.160 --> 00:14:22.479
but we don't need to pay attention to that.

00:14:22.480 --> 00:14:24.199
And this thing `load`​s that file.

00:14:24.200 --> 00:14:27.519
So when we load that file, it defines some functions here

00:14:27.520 --> 00:14:29.799
that are going to be used by the rest of the examples.

00:14:29.800 --> 00:14:34.019
Now we can run this thing here... Note that

00:14:34.020 --> 00:14:34.879
we just defined some functions

00:14:34.880 --> 00:14:39.359
and then we ran these functions here... `find-eoutput-2a`...

00:14:39.360 --> 00:14:42.679
and they show some things in the window at the right.

00:14:42.680 --> 00:14:45.679
These things are boring.

00:14:45.680 --> 00:14:49.679
When we run `adt-insert` with argument 42,

00:14:49.680 --> 00:14:52.399
it just shows a 42, in this way...

00:14:52.400 --> 00:14:55.639
The other ones show other numbers... and so on.

00:14:55.640 --> 00:14:59.479
And... what happens when we modify

00:14:59.480 --> 00:15:02.359
this function here, `adt-2`,

00:15:02.360 --> 00:15:05.199
by adding and removing advices to it?

00:15:05.200 --> 00:15:06.919
The idea is that people can run

00:15:06.920 --> 00:15:08.679
this thing here several times,

00:15:08.680 --> 00:15:10.799
watching the window at the right,

00:15:10.800 --> 00:15:14.719
because the results are going to be shown there.

00:15:14.720 --> 00:15:17.799
So, in the first moment, when we run...

00:15:17.800 --> 00:15:21.679
no, no, sorry, sorry, let me run it again.

00:15:21.680 --> 00:15:24.039
In the first moment when we run `adt-2`

00:15:24.040 --> 00:15:28.239
it just shows a 2, and then we modify it in a certain way,

00:15:28.240 --> 00:15:29.479
and we run it again,

00:15:29.480 --> 00:15:33.799
and now before showing the 2 it shows a 1, mysteriously,

00:15:33.800 --> 00:15:37.119
and then we add something to be run after the 2,

00:15:37.120 --> 00:15:38.479
And we run it again,

00:15:38.480 --> 00:15:41.839
and now `adt-2` shows these three things.

00:15:41.840 --> 00:15:43.959
And then we remove the advices,

00:15:43.960 --> 00:15:45.159
we remove these other things,

00:15:45.160 --> 00:15:49.079
and when we run `adt-2` again, it shows only `;; --> 2`.

00:15:49.080 --> 00:15:51.879
It's impossible to understand that in the first time,

00:15:51.880 --> 00:15:57.879
so we can run that several times... to see how things work.

00:15:57.880 --> 00:16:02.279
And now we want to understand

00:16:02.280 --> 00:16:04.959
what changes in the function `adt-2`...

00:16:04.960 --> 00:16:08.639
how it is modified internally.

00:16:08.640 --> 00:16:11.479
I'm calling that the internal view of the function,

00:16:11.480 --> 00:16:13.599
and we are going to compare

00:16:13.600 --> 00:16:16.679
several internal views of the function `adt-2`.

00:16:16.680 --> 00:16:19.999
I'm going to reset the function `adt-2`

00:16:20.000 --> 00:16:25.679
by removing the advices and placing the advices on it again...

00:16:25.680 --> 00:16:28.507
and if we just pretty-print this function here,

00:16:28.508 --> 00:16:36.319
the symbol... the value of this symbol here as a function,

00:16:36.320 --> 00:16:38.639
it is something very ugly.

00:16:38.640 --> 00:16:43.839
But if we print it in another way, with `cl-prin1`,

00:16:43.840 --> 00:16:47.239
then we get something that is much nicer...

00:16:47.240 --> 00:16:51.159
but that is not indented. And if we use this thing here,

00:16:51.160 --> 00:16:55.839
`cl-prin2` instead of `cl-prin1`, it becomes indented.

00:16:55.840 --> 00:17:00.839
So let's try it again.

00:17:00.840 --> 00:17:06.799
Here is the current view of what is `adt-2`.

00:17:06.800 --> 00:17:09.999
So, the original `adt-insert` is here...

00:17:10.000 --> 00:17:11.839
and here are some modifications

00:17:11.840 --> 00:17:13.519
that were added by the advices.

00:17:13.520 --> 00:17:16.759
And we can run these things many times

00:17:16.760 --> 00:17:19.239
to understand what each step does.

00:17:19.240 --> 00:17:21.239
But my suggestion is: in the first time

00:17:21.240 --> 00:17:23.879
just run everything very quickly...

00:17:23.880 --> 00:17:25.199
and then you run it again,

00:17:25.200 --> 00:17:29.119
paying attention to the parts that look more interesting.

NOTE Printing something in different ways for lambdas

00:17:29.120 --> 00:17:37.373
Now, I'm going to... Remember that here

00:17:37.374 --> 00:17:42.559
I printed the contents of `adt-2` in several different ways,

00:17:42.560 --> 00:17:47.119
and now I'm going to show how we can do the same idea

00:17:47.120 --> 00:17:51.599
of printing something in different ways for lambdas...

00:17:51.600 --> 00:17:52.919
that is something that I explained

00:17:52.920 --> 00:17:54.639
in the first part of the video.

00:17:54.640 --> 00:18:00.639
In this part of the demo we define a function `foo`...

00:18:00.640 --> 00:18:06.360
this `setq` here defines `o` as

00:18:06.361 --> 00:18:08.959
the contents of the function cell of `foo`...

00:18:08.960 --> 00:18:12.999
And now we are going to print

00:18:13.000 --> 00:18:15.399
that `o` in several different ways.

00:18:15.400 --> 00:18:19.199
The default way is this one, it's very ugly,

00:18:19.200 --> 00:18:22.239
but we can redefine how these things are printed

00:18:22.240 --> 00:18:24.559
by just running these lines...

00:18:24.560 --> 00:18:28.719
and if we pay attention at what's happening

00:18:28.720 --> 00:18:30.519
at the window at the right,

00:18:30.520 --> 00:18:33.559
we can see that we have several different

00:18:33.560 --> 00:18:35.759
printed representations for the same thing...

00:18:35.760 --> 00:18:36.879
and then at the last step,

00:18:36.880 --> 00:18:41.079
we reset the printer to the default representation.

00:18:41.080 --> 00:18:43.279
And the details are here.

00:18:43.280 --> 00:18:44.999
If we run these lines here,

00:18:45.000 --> 00:18:48.759
they show the definitions at the window at the right.

00:18:48.760 --> 00:18:53.879
And this... now comes the difficult part,

00:18:53.880 --> 00:18:56.679
in which we have to do something

00:18:56.680 --> 00:19:02.079
besides just running things with F8. We need

00:19:02.080 --> 00:19:04.919
a help buffer with buttons...

00:19:04.920 --> 00:19:08.919
buttons in the traditional sense,

00:19:08.920 --> 00:19:11.559
and we need to choose a certain button there,

00:19:11.560 --> 00:19:13.439
or any button there,

00:19:13.440 --> 00:19:17.940
and run `M-x ee-set-button` on that button.

00:19:17.941 --> 00:19:24.719
So, let me define a `struct` here,

00:19:24.720 --> 00:19:29.359
and this is some help on what is that structure.

00:19:29.360 --> 00:19:33.599
I'm going to choose this button here

00:19:33.600 --> 00:19:40.159
and I'm going to type `M-x ee-set-button`.

00:19:40.160 --> 00:19:43.559
The message is a bit obscure.

00:19:43.560 --> 00:19:47.959
And now we have something that displays

00:19:47.960 --> 00:19:51.079
a lot of information about that button...

00:19:51.080 --> 00:19:53.919
And we can also run that with just `F8`s.

00:19:53.920 --> 00:20:00.279
By the way, if we want to understand

00:20:00.280 --> 00:20:02.319
the code that's behind these things,

00:20:02.320 --> 00:20:04.839
we can run this sexp here.

00:20:04.840 --> 00:20:07.219
It is going to show the code here at the right.

00:20:07.220 --> 00:20:10.759
But anyway, these first lines here...

00:20:10.760 --> 00:20:15.479
they display the output in the echo area... Let's try...

00:20:15.480 --> 00:20:20.559
And each one of them extracts a different part

00:20:20.560 --> 00:20:22.559
of the information on that button.

00:20:22.560 --> 00:20:26.039
And these other lines here create a three-window setting

00:20:26.040 --> 00:20:29.639
in which the help buffer is shown here,

00:20:29.640 --> 00:20:33.119
and the result of some other thing

00:20:33.120 --> 00:20:39.979
is shown in the third window. Let's try...

00:20:39.980 --> 00:20:46.107
So now that we have... well... I said

00:20:46.108 --> 00:20:48.407
that we needed to choose a certain button

00:20:48.408 --> 00:20:53.439
and run `M-x ee-set-button` there. We have done that...

00:20:53.440 --> 00:20:55.919
so now this variable `ee-button`

00:20:55.920 --> 00:20:58.439
contains information about the button...

00:20:58.440 --> 00:21:01.119
And now we can run this part here

00:21:01.120 --> 00:21:03.479
as many times as we want to...

00:21:03.480 --> 00:21:07.479
try to understand what are the values of these things here...

00:21:07.480 --> 00:21:11.679
and how some things start with a value that is very complex

00:21:11.680 --> 00:21:13.839
and very difficult to understand,

00:21:13.840 --> 00:21:16.839
and then we extract the more interesting parts.

00:21:16.840 --> 00:21:22.279
And the details, as I said, are here.

00:21:22.280 --> 00:21:26.759
That was the end of the demo, and my question is,

00:21:26.760 --> 00:21:28.559
what was your reaction to that?

00:21:28.560 --> 00:21:32.679
If your reaction was more like "wow" than like "blergh"

00:21:32.680 --> 00:21:37.039
then you might like the last part of the video that I recorded in March,

00:21:37.040 --> 00:21:38.399
that was very technical...

00:21:38.400 --> 00:21:42.719
When I recorded it, I thought, oh my god, this video is very bad...

00:21:42.720 --> 00:21:47.279
only the hardcore eev users are going to like that,

00:21:47.280 --> 00:21:51.039
and there are less than five hardcore

00:21:51.040 --> 00:21:52.839
eev users in the world...

NOTE Exploring buttons

00:21:52.840 --> 00:21:56.639
But anyway, if you saw that introduction

00:21:56.640 --> 00:21:59.079
and you think that these things are interesting,

00:21:59.080 --> 00:22:02.999
you can execute any one of these S-expressions here

00:22:03.000 --> 00:22:05.999
and take a look at the final part of that video

00:22:06.000 --> 00:22:09.559
that describes how I wrote some functions

00:22:09.560 --> 00:22:14.239
for exploring buttons. If you execute this sexp here,

00:22:14.240 --> 00:22:19.559
it plays a part of the video starting from that position.

00:22:19.560 --> 00:22:26.919
If you execute this one, you go to the subtitles in HTML...

00:22:26.920 --> 00:22:30.559
and if you run this one, you go

00:22:30.560 --> 00:22:36.159
to the subtitles in another format. And... that's it!

00:22:36.160 --> 00:22:40.119
No, no, sorry, I said "that's it",

00:22:40.120 --> 00:22:42.159
but I forgot a very important part...

NOTE Some design decisions behind eev

00:22:42.160 --> 00:22:45.159
I had prepared this slide here

00:22:45.160 --> 00:22:48.507
to explain some design decisions behind eev

00:22:48.508 --> 00:22:53.679
and why there are so few users of eev... and let me do that.

00:22:53.680 --> 00:22:57.919
The thing is that my working memory is very small,

00:22:57.920 --> 00:23:01.279
and I need examples that are easy to visualize...

00:23:01.280 --> 00:23:04.959
ideally, examples that are easy to run

00:23:04.960 --> 00:23:10.307
and that I can compare the outputs

00:23:10.308 --> 00:23:12.159
of different ways of running them.

00:23:12.160 --> 00:23:16.359
For me, understanding specifications

00:23:16.360 --> 00:23:20.679
in an API is not enough... examples work much better for me.

00:23:20.680 --> 00:23:24.439
Also, I make lots of mistakes when I type...

00:23:24.440 --> 00:23:28.399
so I need ways to run my executable notes

00:23:28.400 --> 00:23:31.879
by just typing `f8` and `M-e`...

00:23:31.880 --> 00:23:37.039
and... most people in the #emacs channel and in other places

00:23:37.040 --> 00:23:44.519
recommend executing sexps by typing `M-:`, like this...

00:23:44.520 --> 00:23:49.239
But I hate that... I think that `M-:` and IELM are

00:23:49.240 --> 00:23:54.559
for people who type well, so not me...

00:23:54.560 --> 00:23:58.839
And also, 99% of what I do is scratch code.

00:23:58.840 --> 00:24:01.639
Very few things that I do go

00:24:01.640 --> 00:24:05.799
into "production" - between quotes.

NOTE Tests

00:24:05.800 --> 00:24:10.199
So most of my tests are not automated tests.

00:24:10.200 --> 00:24:12.439
They are just things that I run with F8,

00:24:12.440 --> 00:24:15.879
and they don't include the expected result.

00:24:15.880 --> 00:24:19.159
Many people feel that this is very, very, very wrong.

00:24:19.160 --> 00:24:23.279
Tests MUST MEAN automated tests.

00:24:23.280 --> 00:24:25.639
Also, and this is very frustrating,

00:24:25.640 --> 00:24:28.399
eev has lots of "non-users",

00:24:28.400 --> 00:24:31.519
I mean, people who have tried to use it,

00:24:31.520 --> 00:24:34.759
but they said that they couldn't figure out how to use it.

00:24:34.760 --> 00:24:36.159
They couldn't understand

00:24:36.160 --> 00:24:38.079
what would be the workflows for eev.

00:24:38.080 --> 00:24:43.679
And that's the same that happens with me with code blocks in Org...

00:24:43.680 --> 00:24:48.759
I'm still at the point in which code blocks in Org just feel wrong.

00:24:48.760 --> 00:24:55.199
I still don't understand how to organize my workflows around code blocks.

00:24:55.200 --> 00:24:58.999
I said that eev has very few users,

00:24:59.000 --> 00:25:02.239
and they are all very weird and very busy,

00:25:02.240 --> 00:25:06.359
and I decided that all my blog-ish posts about eev

00:25:06.360 --> 00:25:09.719
would be things that they can run in a few minutes...

00:25:09.720 --> 00:25:13.039
just like the demo that I showed a few minutes ago.

00:25:13.040 --> 00:25:16.119
I said "like the examples in the rest of the video",

00:25:16.120 --> 00:25:17.399
but I forgot this slide,

00:25:17.400 --> 00:25:19.639
and I'm recording this after the demo.

00:25:19.640 --> 00:25:22.520
So... that's it. Thanks!