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
|
WEBVTT timed by sachac, captioned by ramin
00:00:00.000 --> 00:00:02.780
Hi, my name is Ramin Honary,
00:00:02.781 --> 00:00:04.480
and I'm here to talk to you today
00:00:04.481 --> 00:00:08.940
about my clone of Emacs and Emacs Lisp that I've written in
00:00:08.941 --> 00:00:12.980
Scheme so far.
00:00:12.981 --> 00:00:19.102
So I am an Emacs enthusiast since 2017,
00:00:19.103 --> 00:00:22.664
currently employed as a full stack developer,
00:00:22.665 --> 00:00:25.225
mostly working with Python and JavaScript,
00:00:25.226 --> 00:00:27.079
although my true love is functional
00:00:27.080 --> 00:00:30.559
programming, especially Haskell, and Scheme. I started
00:00:30.560 --> 00:00:33.679
learning Scheme about two years ago. And for the past year,
00:00:33.680 --> 00:00:36.279
I've been working on a project that I'm tentatively calling
00:00:36.280 --> 00:00:40.794
Gypsum. Naming things is hard. It's not a great name.
00:00:40.795 --> 00:00:43.376
I'm open to suggestions.
00:00:43.377 --> 00:00:45.897
But yes, this is the project in which
00:00:45.898 --> 00:00:53.319
I am trying to write an Emacs Lisp interpreter in Scheme.
00:00:53.320 --> 00:00:58.199
There are many clones already of Emacs. You've probably
00:00:58.200 --> 00:01:04.799
heard of Edwin, Jed, Jedit, Jove, Lem, MG, Yi, Zile. Edwin
00:01:04.800 --> 00:01:10.519
itself is also written in Scheme--MIT Scheme. These only
00:01:10.520 --> 00:01:16.159
clone the key bindings of Emacs and not Emacs Lisp itself.
00:01:16.160 --> 00:01:21.199
The only alternative to GNU Emacs that I'm aware of is
00:01:21.200 --> 00:01:26.679
XEmacs, which is a fork of GNU Emacs.
00:01:26.680 --> 00:01:30.359
Most people don't use Emacs for the key bindings. I mean,
00:01:30.360 --> 00:01:34.039
this is anecdotally speaking, but the people who I've
00:01:34.040 --> 00:01:39.519
talked to, I would say don't use Emacs for the key bindings.
00:01:39.520 --> 00:01:42.679
They use it really more because of the power of Emacs Lisp.
00:01:42.680 --> 00:01:48.439
Emacs is as powerful as any system shell, perhaps even more
00:01:48.440 --> 00:01:53.105
powerful than system shells like Bash.
00:01:53.106 --> 00:01:55.207
The reason why it's so powerful is because
00:01:55.208 --> 00:01:56.959
there's a good programming language
00:01:56.960 --> 00:02:00.039
which you can use to control everything on your system. You
00:02:00.040 --> 00:02:01.732
can control processes. You can load and save files.
00:02:01.733 --> 00:02:06.416
You can create files. You can configure things.
00:02:06.417 --> 00:02:10.219
You can capture the output of processes in buffers.
00:02:10.220 --> 00:02:13.421
You can filter text through buffers.
00:02:13.422 --> 00:02:17.839
And a good programming language is what
00:02:17.840 --> 00:02:23.479
you need in order to do all of this. So one big goal of this
00:02:23.480 --> 00:02:29.239
project is to try to stick as closely as possible to the R7RS
00:02:29.240 --> 00:02:33.859
standard Scheme definition. That is the latest Scheme
00:02:33.860 --> 00:02:38.919
standard: R7. And this is just because I want my project to
00:02:38.920 --> 00:02:43.519
work on many scheme implementations, not just Guile.
00:02:43.520 --> 00:02:45.499
Although Guile certainly is the reference
00:02:45.500 --> 00:02:50.239
implementation.
00:02:50.240 --> 00:02:56.459
So another goal is to be able to run any "init.el".
00:02:56.460 --> 00:02:59.740
So you can take your existing "init.el"
00:02:59.741 --> 00:03:01.720
and run it in my program without
00:03:01.721 --> 00:03:05.340
significant changes. That's one of my goals in the end.
00:03:05.341 --> 00:03:07.315
I should be able to do that.
00:03:07.316 --> 00:03:09.119
A lot of people invest significant
00:03:09.120 --> 00:03:12.717
time in their configs, and it's kind of disruptive
00:03:12.718 --> 00:03:14.300
if you want to change editors,
00:03:14.301 --> 00:03:16.500
not be able to use your Emacs Lisp
00:03:16.501 --> 00:03:21.646
config. And so I think a useful Emacs clone
00:03:21.647 --> 00:03:25.127
would be able to clone Emacs Lisp well enough
00:03:25.128 --> 00:03:29.799
that you can run your "init.el".
00:03:29.800 --> 00:03:33.879
And so overall, why am I doing this? It's just because I like
00:03:33.880 --> 00:03:37.999
the Scheme programming language. I love its simplicity and
00:03:38.000 --> 00:03:42.439
its power. It's an extremely well thought-out language.
00:03:42.440 --> 00:03:46.159
It's one of those languages where you can understand the
00:03:46.160 --> 00:03:48.739
entire language from top to bottom. You can read the entire
00:03:48.740 --> 00:03:52.879
specification and understand it yourself.
00:03:52.880 --> 00:03:57.239
It's like the computers I grew up with when I was a kid.
00:03:57.240 --> 00:03:59.319
They were all very simple computers
00:03:59.320 --> 00:04:02.559
in the late 80s, early 90s. And back then,
00:04:02.560 --> 00:04:05.579
theoretically, an engineer could understand the entire
00:04:05.580 --> 00:04:07.959
system at the software level all the way down to the circuit
00:04:07.960 --> 00:04:12.159
level. You can't do that nowadays. And so nowadays, my
00:04:12.160 --> 00:04:16.859
computer is not really a physical computer anymore. It's
00:04:16.860 --> 00:04:21.079
the Scheme language standard itself. That is the core of
00:04:21.080 --> 00:04:25.599
computation, of all of computation for me. And I would like
00:04:25.600 --> 00:04:30.579
to use it as more than just an academic curiosity. It was
00:04:30.580 --> 00:04:36.359
originally designed for teaching at MIT, but it's found use
00:04:36.360 --> 00:04:41.399
in industry. And the R7RS standard is still
00:04:41.400 --> 00:04:44.270
relatively new. It's over 10 years old at this point,
00:04:44.271 --> 00:04:47.999
but hasn't, I mean, the
00:04:48.000 --> 00:04:52.980
Scheme ecosystem itself is already fairly small.
00:04:52.981 --> 00:04:54.341
There still, I don't think,
00:04:54.342 --> 00:04:56.359
has been a whole lot of adoption of R7RS
00:04:56.360 --> 00:04:58.785
quite yet. Kind of a shame.
00:04:58.786 --> 00:05:01.119
So I'd like a project like this, a
00:05:01.120 --> 00:05:04.009
very large scale, kind of a killer-app-like project
00:05:04.010 --> 00:05:05.920
where you're developing a text editor
00:05:05.921 --> 00:05:09.060
and perhaps even an integrated development environment
00:05:09.061 --> 00:05:11.920
in Scheme, I think would be very useful
00:05:11.921 --> 00:05:13.799
just even as a study of, you know, what
00:05:13.800 --> 00:05:18.461
can this language do? And just overall,
00:05:18.462 --> 00:05:21.220
there seems to be a lot of interest in
00:05:21.221 --> 00:05:24.320
Guile-based Emacs and well, maybe a
00:05:24.321 --> 00:05:27.163
Scheme-based Emacs, but Guile in particular.
00:05:27.164 --> 00:05:28.220
There has been talk of
00:05:28.221 --> 00:05:33.660
changing Emacs Lisp or the core of the Emacs Lisp over to
00:05:33.661 --> 00:05:38.469
Guile for about 30 years or so,
00:05:38.470 --> 00:05:41.199
talks originally in the early
00:05:41.200 --> 00:05:44.799
mid 90s. There were discussions between Richard Stallman,
00:05:44.800 --> 00:05:49.919
Tom Lord, and Aubrey Jaffer. They considered
00:05:49.920 --> 00:05:53.219
actually replacing Emacs Lisp with Scheme.
00:05:53.220 --> 00:05:56.827
In 1999, and going for about 10 years,
00:05:56.828 --> 00:06:01.079
someone named Ken Raeburn actually started
00:06:01.080 --> 00:06:07.240
a project where he started writing Emacs in Guile.
00:06:07.241 --> 00:06:11.859
My project is very similar to this.
00:06:11.860 --> 00:06:15.120
Here's a quote from his webpage, which is still up, even
00:06:15.121 --> 00:06:18.399
though it hasn't been updated in 15 years.
00:06:18.400 --> 00:06:20.519
This project that I have started
00:06:20.520 --> 00:06:23.101
is for converting GNU Emacs to Guile
00:06:23.102 --> 00:06:24.121
as its programming language.
00:06:24.122 --> 00:06:26.082
Support for Emacs Lisp will continue to exist,
00:06:26.083 --> 00:06:27.760
of course, but it may be through
00:06:27.761 --> 00:06:29.244
translation and/or interpretation.
00:06:29.245 --> 00:06:30.339
The Lisp engine itself
00:06:30.340 --> 00:06:32.906
may no longer be the core of the program.
00:06:32.907 --> 00:06:38.538
And this is my goal as well. In 2010,
00:06:38.539 --> 00:06:41.879
Andy Wingo and Ludovic Courtes
00:06:41.880 --> 00:06:46.402
took maintainership of the Guile project.
00:06:46.403 --> 00:06:52.719
From 2009, so while Andy... 2009
00:06:52.720 --> 00:06:59.399
to 2011, the first Emacs Lisp interpreter was already being
00:06:59.400 --> 00:07:02.089
implemented in Guile. And even to this day,
00:07:02.090 --> 00:07:05.651
this Emacs Lisp interpreter ships with Guile.
00:07:05.652 --> 00:07:06.599
And so this was happening
00:07:06.600 --> 00:07:10.112
while Andy Wingo took control of the project.
00:07:10.113 --> 00:07:13.833
In 2011, so shortly after Andy Wingo
00:07:13.834 --> 00:07:15.119
took control of the project,
00:07:15.120 --> 00:07:22.279
Guile 2.0 was released. And also in 2011, in the summertime,
00:07:22.280 --> 00:07:27.279
someone named Robin Templeton, I believe it was a Google
00:07:27.280 --> 00:07:33.519
Summer of Code project, started actually trying to
00:07:33.520 --> 00:07:38.719
incorporate libguile, that's the guile interpreter, as a
00:07:38.720 --> 00:07:45.199
linkable or loadable library, linking it to the Emacs
00:07:45.200 --> 00:07:49.179
executable, and then providing some built-in functions in
00:07:49.180 --> 00:07:54.759
Emacs that allows you to call the scheme
00:07:54.760 --> 00:07:58.739
interpreter, the Guile Scheme interpreter, from Emacs.
00:07:58.740 --> 00:08:02.239
And so it's not like a wrapper around the REPL like Geiser or
00:08:02.240 --> 00:08:08.959
SLIME. It's actually the whole Scheme interpreter loaded
00:08:08.960 --> 00:08:13.939
into your Emacs process. And that means your Emacs will have
00:08:13.940 --> 00:08:20.079
the ability to actually load compiled Scheme programs and
00:08:20.080 --> 00:08:25.879
actually run them and share memory with Emacs Lisp
00:08:25.880 --> 00:08:29.799
processes. And, well, Robin Templeton will explain all of
00:08:29.800 --> 00:08:33.039
this. They're presenting today, and I'm very excited to
00:08:33.040 --> 00:08:37.079
actually see their presentation. They'll explain
00:08:37.080 --> 00:08:40.179
everything.
00:08:40.180 --> 00:08:45.679
So, let's see. Moving on. 2020, someone named Vasilij
00:08:45.680 --> 00:08:49.039
Schneidermann, I'm not sure how you pronounce that, published
00:08:49.040 --> 00:08:53.639
an overview called The State of Emacs Lisp on Guile. Let's see
00:08:53.640 --> 00:08:58.399
if I have that here. Yep, it's this page right here. He goes
00:08:58.400 --> 00:09:04.879
into detail about who has done what so far, and what can you do
00:09:04.880 --> 00:09:09.759
in Guile with Emacs Lisp so far, and so on. Like, what is the
00:09:09.760 --> 00:09:12.717
state of the project overall?
00:09:12.718 --> 00:09:15.899
And so (speak of the devil)
00:09:15.900 --> 00:09:20.960
(Andy Wingo on social media).
00:09:20.961 --> 00:09:24.339
So, 2020 to present. Guile Emacs
00:09:24.340 --> 00:09:32.071
is dead? So there's GCC Emacs now.
00:09:32.072 --> 00:09:35.752
Emacs Lisp now has its own JIT compiler.
00:09:35.753 --> 00:09:39.259
And it seems like over the past few years,
00:09:39.260 --> 00:09:44.319
Emacs Lisp has kind of moved off into the direction of
00:09:44.320 --> 00:09:48.439
becoming its own programming language in its own right,
00:09:48.440 --> 00:09:51.839
and it is decidedly Common Lisp-flavored. It is
00:09:51.840 --> 00:09:54.166
very similar to Common Lisp,
00:09:54.167 --> 00:09:56.519
and that seems to be the direction
00:09:56.520 --> 00:10:00.719
that it's headed now, and I don't know if there's really any
00:10:00.720 --> 00:10:05.559
interest anymore amongst the Emacs maintainers of
00:10:05.560 --> 00:10:09.799
continuing with a Guile-based Emacs.
00:10:09.800 --> 00:10:13.319
But as far as I know, there's still a lot of interest in the
00:10:13.320 --> 00:10:19.599
community amongst Scheme and Lisp and Emacs users who are
00:10:19.600 --> 00:10:24.779
interested in maybe continuing to try to get Guile to become
00:10:24.780 --> 00:10:28.079
the core of Emacs, or if not, you know, what Robin Templeton
00:10:28.080 --> 00:10:31.639
has been doing, at least trying to get Guile a
00:10:31.640 --> 00:10:37.279
language, a first class supported language in Emacs. So
00:10:37.280 --> 00:10:39.999
that's enough talking. Let me just show you what I have so
00:10:40.000 --> 00:10:45.239
far. The GUI is barely working, because I have very little
00:10:45.240 --> 00:10:50.039
experience with GTK or GObject Introspection. It's very
00:10:50.040 --> 00:10:53.639
difficult to debug, so it's very slow to develop. Any crash
00:10:53.640 --> 00:10:58.199
at C level produces no stack traces. So far, most of the
00:10:58.200 --> 00:11:03.199
crashes that I've experienced are due to simple mistakes
00:11:03.200 --> 00:11:09.399
like passing the wrong data type. So, so far, no, not a whole
00:11:09.400 --> 00:11:14.174
lot of need for GDB or rebuilding all GTK, glib,
00:11:14.175 --> 00:11:17.877
and so on with the debugging symbols.
00:11:17.878 --> 00:11:19.319
But yes, still development's been
00:11:19.320 --> 00:11:25.499
very slow. I'm learning as I go. I've chosen to use Guile GI as
00:11:25.500 --> 00:11:30.499
the foundation for the GUI. Let me just load it up quick here.
00:11:30.600 --> 00:11:39.899
"load main-guile.scm". And this will launch the GUI. I also
00:11:39.900 --> 00:11:44.199
happen to have a REPL that runs in a separate thread and
00:11:44.200 --> 00:11:49.759
submits any form that you type to be evaluated inside of the
00:11:49.760 --> 00:11:57.079
running GUI environment. But you can just type stuff. So
00:11:57.080 --> 00:12:02.903
"hello world." And of course there is...
00:12:02.904 --> 00:12:08.059
as you can see, it's not quite rendering correctly.
00:12:08.060 --> 00:12:11.090
This "*Messages*" thing here,
00:12:11.091 --> 00:12:13.760
that should be over here, obviously. I haven't been able to
00:12:13.761 --> 00:12:17.820
figure out how to get those little details down. But yeah,
00:12:17.821 --> 00:12:23.215
you can do M-:, and you get your eval,
00:12:23.216 --> 00:12:26.637
and you can just evaluate, like (what's an emacs,)
00:12:26.638 --> 00:12:29.280
(or what's a Scheme-specific thing?)
00:12:29.281 --> 00:12:37.679
Like "(import (srfi 1))", and
00:12:37.680 --> 00:12:44.888
let's see, do "(iota 20)", for example.
00:12:44.889 --> 00:12:46.780
And so that is the procedure
00:12:46.781 --> 00:12:52.900
that iterates and produces some 20 elements of a
00:12:52.901 --> 00:12:58.419
list. Or you can do something like, let's see,
00:12:58.420 --> 00:13:08.114
string-append "hello" with space "world".
00:13:08.115 --> 00:13:10.259
And you get the result and so on. And,
00:13:10.260 --> 00:13:13.039
you know, scheme allows you to return multiple values. So
00:13:13.040 --> 00:13:14.998
what I have done here is just
00:13:14.999 --> 00:13:17.979
every value is captured in a list
00:13:17.980 --> 00:13:21.001
and it prints all of the return values in the list.
00:13:21.002 --> 00:13:23.462
So if a procedure returns no values,
00:13:23.463 --> 00:13:26.144
you get an empty list.
00:13:26.145 --> 00:13:29.405
And that's that. It's still quite buggy.
00:13:29.406 --> 00:13:31.519
So like, here's a bug
00:13:31.520 --> 00:13:37.319
that I can reproduce fairly consistently.
00:13:37.320 --> 00:13:41.407
I can, yeah, if you do...
00:13:41.408 --> 00:13:46.199
there seems to be a problem with a
00:13:46.200 --> 00:13:49.719
widget being freed too soon, so it will crash. I'm going to
00:13:49.720 --> 00:13:53.319
try and solve that, hopefully, before this presentation
00:13:53.320 --> 00:13:57.109
goes live. Let's see here.
00:13:57.110 --> 00:13:59.839
The Emacs Lisp parser is based on
00:13:59.840 --> 00:14:04.399
Guile Emacs Lisp. So the Guile Emacs Lisp interpreter that
00:14:04.400 --> 00:14:09.039
ships with Guile, that is what I am using. I've actually
00:14:09.040 --> 00:14:15.719
copied and pasted the source code from the Guile source base
00:14:15.720 --> 00:14:20.639
into my own project so that I can iterate on it more quickly.
00:14:20.640 --> 00:14:25.799
And I've already had to make some modifications to the
00:14:25.800 --> 00:14:29.899
Emacs Lisp interpreter in Guile. So here's the evaluator.
00:14:29.900 --> 00:14:33.079
I've actually already modified the parser and the lexer a
00:14:33.080 --> 00:14:37.858
little bit. And it's at least able to parse
00:14:37.859 --> 00:14:43.149
all of the "subr.el" program, the Emacs Lisp program.
00:14:43.150 --> 00:14:44.599
It can actually load that, but not
00:14:44.600 --> 00:14:47.570
evaluate it, or parse it, but not evaluate it...
00:14:47.571 --> 00:14:51.719
Read, not eval.
00:14:51.720 --> 00:14:53.959
By the time this goes live, I will have submitted a patch
00:14:53.960 --> 00:14:57.559
upstream. And that's another goal of this project,
00:14:57.560 --> 00:15:01.199
incidentally, is that anything that we can contribute to
00:15:01.200 --> 00:15:08.359
Guile and any built-in functions that we can implement
00:15:08.360 --> 00:15:10.999
I would like to, for this project, I would like to try and
00:15:11.000 --> 00:15:15.679
contribute upstream to Guile. The Emacs Lisp interpreter
00:15:15.680 --> 00:15:21.359
is not working well, unfortunately. So this copy, this is
00:15:21.360 --> 00:15:29.479
the copy of the code base (from this commit in particular)
00:15:29.480 --> 00:15:34.979
and well, I can't get it working. I can't actually get the
00:15:34.980 --> 00:15:37.759
non-copy, the actual built-in version of
00:15:37.760 --> 00:15:41.211
the Emacs Lisp interpreter to work properly quite yet.
00:15:41.212 --> 00:15:47.033
So let me quick go to, (what is this here?)
00:15:47.034 --> 00:15:51.879
Guile Elisp. So suppose you have this
00:15:51.880 --> 00:15:55.999
"eval-elisp" procedure here and it takes
00:15:56.000 --> 00:16:00.639
an Elisp environment and then it evaluates an expression in that
00:16:00.640 --> 00:16:03.599
environment. And evaluates to a value. So this
00:16:03.600 --> 00:16:05.084
is the standard way of doing it in Guile.
00:16:05.085 --> 00:16:06.039
If you can see here,
00:16:06.040 --> 00:16:09.946
you've got this expression, "compile" expression.
00:16:09.947 --> 00:16:16.859
This is like "eval". And so actually trying to load this.
00:16:16.860 --> 00:16:24.672
So let's do "load gypsum". (Let's see here. This is, no),
00:16:24.673 --> 00:16:35.759
I wanted to "import gypsum backend guile Elisp".
00:16:35.760 --> 00:16:39.039
And if I actually want to do this... So elisp eval, first of all,
00:16:39.040 --> 00:16:42.879
it says it failed because there's an unbound variable
00:16:42.880 --> 00:16:45.348
"elisp-eval". Don't know what it's talking about.
00:16:45.349 --> 00:16:48.229
There's no such variable in any of my programs.
00:16:48.230 --> 00:16:51.151
I have no idea what's going on here.
00:16:51.152 --> 00:16:59.279
You can try to run eval elisp on some simple form like
00:16:59.280 --> 00:17:04.759
(+ 1 2). And it gives you this exception. This works.
00:17:04.760 --> 00:17:09.579
This is the same issue that I have with all of the,
00:17:09.580 --> 00:17:13.200
every version of the Emacs Lisp Interpreter in Guile.
00:17:13.201 --> 00:17:18.751
I can get it to work with this big ",L" mode.
00:17:18.752 --> 00:17:21.593
So I can actually do (+ 1 2) here.
00:17:21.594 --> 00:17:26.816
I can do "princ" like here.
00:17:26.817 --> 00:17:30.119
That all works fine. It gives me, for some reason,
00:17:30.120 --> 00:17:34.940
a stack trace here.
00:17:34.941 --> 00:17:43.926
And yeah, so it's a bit, it's not well-documented.
00:17:43.927 --> 00:17:45.887
The code base is fairly old.
00:17:45.888 --> 00:17:50.399
As I said, it was developed around 2011,
00:17:50.400 --> 00:17:53.239
and it's fairly opaque, and I have not been able to figure out
00:17:53.240 --> 00:17:57.959
how to get Emacs Lisp in Guile working smoothly. So I have
00:17:57.960 --> 00:18:04.539
started writing my own Emacs Lisp interpreter. And, uh,
00:18:04.540 --> 00:18:13.399
"gypsum/elisp/eval-tests.scm".
00:18:13.400 --> 00:18:18.269
It's, uh, not entirely ready.
00:18:18.270 --> 00:18:21.695
I can show you some of the tests at least.
00:18:21.696 --> 00:18:25.036
Here is a simple Emacs Lisp program
00:18:25.037 --> 00:18:25.856
that you can evaluate.
00:18:25.857 --> 00:18:31.139
You got "progn", "setq" a to 3, "setq" b to 5,
00:18:31.140 --> 00:18:35.839
"setq" c to the sum of a and b, return c.
00:18:35.840 --> 00:18:39.059
And this at least works correctly.
00:18:39.060 --> 00:18:43.279
As you can see here, the result is eight. Um, but
00:18:43.280 --> 00:18:46.520
the "let*" semantics are not completed yet.
00:18:46.521 --> 00:18:51.103
Lots of work left to do there.
00:18:51.104 --> 00:18:54.464
So in the time I have left, I guess I can just,
00:18:54.465 --> 00:18:56.759
talk a little bit about what my plans
00:18:56.760 --> 00:18:59.387
are for the future.
00:18:59.388 --> 00:19:02.599
I would like to begin by evaluating or
00:19:02.600 --> 00:19:06.759
actually loading the "subr.el" into my Emacs Lisp
00:19:06.760 --> 00:19:09.639
interpreter. I actually have tests set up for that as well,
00:19:09.640 --> 00:19:15.909
so I can actually select any form I want from "subr.el".
00:19:15.910 --> 00:19:18.832
I can just run this through my interpreter
00:19:18.833 --> 00:19:21.593
and test to see if everything is working
00:19:21.594 --> 00:19:28.779
once I get that far.
00:19:28.780 --> 00:19:33.239
And yeah, let me just say that this is my formal appeal to the
00:19:33.240 --> 00:19:37.799
community for help on this project. Emacs Lisp has
00:19:37.800 --> 00:19:41.179
1,393 built-in functions.
00:19:41.180 --> 00:19:45.039
I could never implement that many functions on my own, so if
00:19:45.040 --> 00:19:47.599
this project is going to be useful to anybody in any
00:19:47.600 --> 00:19:51.114
reasonable amount of time, I'm going to need help.
00:19:51.115 --> 00:19:53.476
And I know that there are people out there
00:19:53.477 --> 00:19:56.398
who are very interested in a Guile-based Emacs,
00:19:56.399 --> 00:19:58.999
and so if you're watching this,
00:19:59.000 --> 00:20:00.521
please feel free to contact me
00:20:00.522 --> 00:20:05.699
on social media or over e-mail.
00:20:05.700 --> 00:20:09.647
My job, the way I see it, is if there's enough interest,
00:20:09.648 --> 00:20:12.064
and I do get a lot of people interested in
00:20:12.065 --> 00:20:13.199
starting to contribute,
00:20:13.200 --> 00:20:17.919
my job will be to document the building and testing process
00:20:17.920 --> 00:20:21.039
and make sure that it is as easy as possible to contribute
00:20:21.040 --> 00:20:24.079
code to this project. I want to document the system
00:20:24.080 --> 00:20:27.599
architecture. I'll write blog posts. I'll do videos on
00:20:27.600 --> 00:20:31.879
PeerTube explaining how everything works. And I will
00:20:31.880 --> 00:20:34.199
prioritize which built-in functions
00:20:34.200 --> 00:20:36.462
I think are probably going to be the most necessary,
00:20:36.463 --> 00:20:40.878
the most essential to get the interpreter running,
00:20:40.879 --> 00:20:42.559
and then find low-hanging fruit,
00:20:42.560 --> 00:20:46.519
functions that are easy for people to implement
00:20:46.520 --> 00:20:50.845
as a good introduction to getting them started
00:20:50.846 --> 00:20:53.947
on contributing to the project.
00:20:53.948 --> 00:20:56.679
And then, of course, I will take
00:20:56.680 --> 00:21:01.719
responsibility myself of making sure that we can
00:21:01.720 --> 00:21:03.774
get the Elisp interpreter to the point
00:21:03.775 --> 00:21:09.079
where it can run the Emacs regression tests.
00:21:09.080 --> 00:21:13.333
These are the test suites that are used
00:21:13.334 --> 00:21:20.359
to test Emacs Lisp itself in the GNU Emacs code base. And so
00:21:20.360 --> 00:21:24.559
ERT is itself written in Emacs Lisp. And so
00:21:24.560 --> 00:21:27.033
I think if we implement enough of the built-in functions
00:21:27.034 --> 00:21:29.933
to be able to run ERT,
00:21:29.934 --> 00:21:31.195
then we can actually start
00:21:31.196 --> 00:21:33.617
using the GNU Emacs regression tests
00:21:33.618 --> 00:21:39.248
to test our own interpreter, our own Emacs clone.
00:21:39.249 --> 00:21:41.199
And of course, I'll make sure that there's at least
00:21:41.200 --> 00:21:45.833
one usable GUI. I'm currently working on Guile GI
00:21:45.834 --> 00:21:51.396
and GTK. It would be great to have an...
00:21:51.397 --> 00:21:53.879
ANSI terminal based...
00:21:53.880 --> 00:21:58.219
something that works in your terminal emulator.
00:21:58.220 --> 00:22:00.283
And yeah, it would be great if someday soon,
00:22:00.284 --> 00:22:03.159
hopefully, we get enough done
00:22:03.160 --> 00:22:06.094
that you can actually contribute a patch to this project
00:22:06.095 --> 00:22:11.778
from within the Gypsum editor itself.
00:22:11.779 --> 00:22:13.380
I was going to do an overview,
00:22:13.381 --> 00:22:19.679
but that would be for more of an hour-long presentation.
00:22:19.680 --> 00:22:22.927
So I'm out of time. I guess the last thing
00:22:22.928 --> 00:22:25.449
I should quickly say is there's no
00:22:25.450 --> 00:22:27.159
meta object protocol in this
00:22:27.160 --> 00:22:29.001
project. I think that's a little bit too difficult
00:22:29.002 --> 00:22:30.962
to port to various scheme implementations.
00:22:30.963 --> 00:22:33.739
So I've created a substitute, which I'm
00:22:33.740 --> 00:22:36.959
calling "functional lenses", which is inspired by the
00:22:36.960 --> 00:22:42.059
Haskell project of the same name.
00:22:42.060 --> 00:22:47.511
Everything in this project is based on functional lenses.
00:22:47.512 --> 00:22:52.603
Yeah, also a lot a work went into the keymaps data structure.
00:22:52.604 --> 00:22:55.206
The point being that I think I have
00:22:55.207 --> 00:22:58.589
a pretty good foundation here upon which we can build,
00:22:58.590 --> 00:23:00.839
even though there isn't an actual, there isn't
00:23:00.840 --> 00:23:04.699
a lot done in the actual prototype itself, not yet anyway,
00:23:04.700 --> 00:23:08.419
but I made sure to get the fundamentals down
00:23:08.420 --> 00:23:11.080
from the beginning. And so I think we have something
00:23:11.081 --> 00:23:16.308
like a solid foundation on which to build.
00:23:16.309 --> 00:23:21.230
So, I'm going to conclude it there.
00:23:21.231 --> 00:23:24.599
And here's my contact details. Like I said,
00:23:24.600 --> 00:23:29.319
this is a project, I'm appealing to the community of all
00:23:29.320 --> 00:23:31.899
people who are interested in Guile and Emacs to help
00:23:31.900 --> 00:23:35.839
contribute to this project. I see myself as just getting the
00:23:35.840 --> 00:23:40.600
ball rolling. Again, taking-off from the work
00:23:40.601 --> 00:23:46.278
that Ken Raeburn left behind, with my own
00:23:46.279 --> 00:23:50.637
from-the-ground-up implementation. So yeah,
00:23:50.638 --> 00:23:53.858
contact me: e-mail, you can take a look at my blog
00:23:53.859 --> 00:23:57.419
where I talk about what I have done.
00:23:57.420 --> 00:24:00.759
My source code, the code for this project, is up on
00:24:00.760 --> 00:24:06.139
Codeberg... The presentation... this
00:24:06.140 --> 00:24:09.379
presentation, the home page for this presentation, you
00:24:09.380 --> 00:24:15.559
can find more details there. Oh, I'm on
00:24:15.560 --> 00:24:19.139
ActivityPub as well, so my handle is
00:24:19.140 --> 00:24:27.119
@ramin_hal9001@fe.disroot.org, and I'm on everyday.
00:24:27.120 --> 00:24:30.939
So yeah, please feel free to contact me if you're interested,
00:24:30.940 --> 00:24:35.640
and thank you for your attention.
|