From 5d4e91ed9fe87ddb2c6e83bfbef0b2901981275d Mon Sep 17 00:00:00 2001 From: Sacha Chua Date: Mon, 25 Dec 2023 12:35:27 -0500 Subject: add opus files, repl captions from eduardo --- ...latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt | 4031 ++++++++++++-------- 2023/info/emacsconf-before.md | 2 +- 2023/info/flat-before.md | 2 +- 2023/info/one-before.md | 2 +- 2023/info/repl-after.md | 794 ---- 2023/info/repl-before.md | 2 +- 2023/info/sat-close-before.md | 4 +- 2023/info/sun-close-before.md | 2 +- 2023/info/test-before.md | 2 +- 2023/schedule-details.md | 20 +- 10 files changed, 2559 insertions(+), 2302 deletions(-) diff --git a/2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt b/2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt index 600d07b5..723fc45a 100644 --- a/2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt +++ b/2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt @@ -1,2273 +1,3324 @@ -WEBVTT captioned by sachac +WEBVTT captioned by eduardo +Kind: captions +Language: en-GB NOTE Intro -00:00.000 --> 00:00:00.014 -Hi, my name is Eduardo Ochs +00:00:00.000 --> 00:00:03.079 +Hi! My name is Eduardo Ochs -00:00:00.015 --> 00:00:05.020 -and the title of this talk is +00:00:03.080 --> 00:00:05.519 +and the title of this talk is: REPLs -00:05.020 --> 00:07.840 -REPLs in Strange Places: Lua, LaTeX, +00:00:05.520 --> 00:00:09.399 +in strange places - Lua, LateX, LPeg, LPegRex, -00:07.840 --> 00:10.440 -LPeg, LPegRex, and TikZ. +00:00:09.400 --> 00:00:12.119 +and TikZ. I'm the author of an Emacs -00:10.440 --> 00:13.400 -I'm the author of an Emacs package called eev, +00:00:12.120 --> 00:00:14.879 +package called eev, and this is a talk -00:13.400 --> 00:17.280 -and this is a talk at the EmacsConf 2023, +00:00:14.880 --> 00:00:18.479 +at the EmacsConf 2023, that is happening in -00:17.280 --> 00:21.560 -that is happening in December 2023 at the Internet. +00:00:18.480 --> 00:00:22.519 +December 2023, at the internets. NOTE Diagrams -00:21.560 --> 00:00:24.243 -This is one of the examples of diagrams +00:00:22.520 --> 00:00:23.079 +This is one of the -00:00:24.244 --> 00:00:25.920 -that we are going to see. +00:00:23.080 --> 00:00:24.919 +examples of diagrams that we are -00:25.920 --> 00:28.400 -Let me show how I generated it. +00:00:24.920 --> 00:00:27.639 +going to see - let me show how I generate -00:28.400 --> 00:33.600 -One second, I have to use a smaller font here. +00:00:27.640 --> 00:00:30.599 +it... one second, -00:34.560 --> 00:39.080 -This is a file called parse32.lua. +00:00:30.600 --> 00:00:35.799 +I have to use a smaller font here... -00:39.080 --> 00:42.600 -Let me go back to this block of tests again. +00:00:35.800 --> 00:00:39.159 +this is a file called ParseTree2.lua... -00:42.600 --> 00:45.520 -Now, if I run this, +00:00:39.160 --> 00:00:42.919 +let me go back to this block of tests again... -00:46.720 --> 00:51.520 -we get these outputs here at the right. +00:00:42.920 --> 00:00:43.879 +and now if I run -00:51.520 --> 00:53.800 -Then in this line here, +00:00:43.880 --> 00:00:47.759 +this... -00:53.800 --> 00:55.420 -it generates a PDF, +00:00:47.760 --> 00:00:50.159 +we get these outputs here at the -00:55.420 --> 00:57.780 -and if I type `F8` here, +00:00:50.160 --> 00:00:53.959 +right, and then in this line here it -00:57.780 --> 01:02.560 -it shows the PDF in the lower right window. +00:00:53.960 --> 00:00:58.119 +generates a PDF, and if I type f8 here it + +00:00:58.120 --> 00:01:03.919 +shows the PDF in the lower right window. NOTE eev -01:03.320 --> 01:08.920 -Let me start by explaining briefly what is eev. +00:01:03.920 --> 00:01:06.079 +Let me start by explaining + +00:01:06.080 --> 00:01:09.839 +briefly what is eev. + +00:01:09.840 --> 00:01:12.239 +First: it is something that -01:08.920 --> 00:01:10.889 -First, it's something +00:01:12.240 --> 00:01:14.759 +appeared by accident in the mid-90s - I -00:01:10.890 --> 00:01:14.560 -that appeared by accident in the mid 90s. +00:01:14.760 --> 00:01:16.799 +explained this story in my -01:14.560 --> 01:20.640 -I explained this story in my presentation at EmacsConf 2019. +00:01:16.800 --> 00:01:20.159 +presentation at the EmacsConf 2019... -01:20.640 --> 01:25.420 -It's an Emacs package that is part of ELPA. +00:01:20.160 --> 00:01:23.159 +it's a package... it's an Emacs -01:25.420 --> 01:28.720 -It has at least 10 users. +00:01:23.160 --> 00:01:26.519 +package that is part of ELPA... it has at -01:28.720 --> 01:32.480 -Those are the ones that I know by name. +00:01:26.520 --> 00:01:29.679 +least 10 users - those are the ones -01:32.480 --> 01:36.960 -eev means "Emacs, execute verbosely". +00:01:29.680 --> 00:01:32.559 +that I know by name... -01:36.960 --> 00:01:38.847 +00:01:32.560 --> 00:01:38.439 +eev means `emacs-execute-verbosely'... + +00:01:38.440 --> 00:01:40.959 eev is something that treats eval-last-sexp -00:01:38.848 --> 00:01:43.400 -as the central feature of Emacs. +00:01:40.960 --> 00:01:43.999 +as the central feature of Emacs... + +00:01:44.000 --> 00:01:45.599 +eev blurs the distinction between + +00:01:45.600 --> 00:01:48.919 +programmers and users, and it replaces -01:43.400 --> 01:47.280 -eev blurs the distinction between programmers and users, +00:01:48.920 --> 00:01:51.679 +the slogan "users should not be forced to -01:47.280 --> 01:49.960 -and it replaces the slogan, +00:01:51.680 --> 00:01:53.679 +see Lisp", that is something that Richard -01:49.960 --> 01:52.360 -"users should not be forced to see Lisp" +00:01:53.680 --> 00:01:57.559 +Stallman told me once, by "users should see -01:52.360 --> 01:55.280 -(that is something that Richard Stallman told me once), +00:01:57.560 --> 00:02:00.479 +Lisp instead of buttons" and "new users -01:55.280 --> 01:59.240 -by "users should see Lisp instead of buttons," +00:02:00.480 --> 00:02:03.999 +should see Lisp in the first 5 minutes"... -01:59.240 --> 02:03.400 -and "new users should see Lisp in the first five minutes." +00:02:04.000 --> 00:02:05.279 +I'm going to show -02:03.400 --> 02:08.160 -I'm going to show some examples of that soon. +00:02:05.280 --> 00:02:08.959 +some examples of that soon. -02:08.160 --> 00:02:11.565 -eev uses code in the comments a lot +00:02:08.960 --> 00:02:11.959 +Eev uses code in comments a lot, -00:02:11.566 --> 00:02:14.120 -and also tests in comments. +00:02:11.960 --> 00:02:15.119 +and also tests in comments... -02:14.120 --> 00:02:16.781 -I changed my way of presenting it, +00:02:15.120 --> 00:02:17.679 +I changed my way of presenting it -00:02:16.782 --> 00:02:19.190 +00:02:17.680 --> 00:02:19.679 and it became very REPL-centric -00:02:19.191 --> 00:02:22.200 -in the last few years, in the sense that +00:02:19.680 --> 00:02:22.319 +in the last few years, in the -02:22.200 --> 00:02:26.460 -I start by explaining its main features +00:02:22.320 --> 00:02:24.399 +sense that I start by explaining its -00:02:26.461 --> 00:02:29.520 -by its support for REPLs. +00:02:24.400 --> 00:02:28.679 +main features by its support for REPLs... -02:29.520 --> 00:02:32.078 -eev supposes that we want to keep +00:02:28.680 --> 00:02:31.079 +eev supposes -00:02:32.079 --> 00:02:34.560 -executable notes of everything. +00:02:31.080 --> 00:02:32.639 +that we want to keep -02:34.560 --> 02:37.800 -I'm also going to show examples of this in a second. +00:02:32.640 --> 00:02:35.199 +executable notes of everything - I'm also -02:37.800 --> 02:42.120 -eev has lots of videos for people who hate videos, +00:02:35.200 --> 00:02:37.159 +going to show examples of this in a -02:42.120 --> 00:02:44.270 -and it tries to do everything +00:02:37.160 --> 00:02:40.479 +second... eev has lots of "videos for -00:02:44.271 --> 00:02:47.640 -with very little magic and without black boxes. +00:02:40.480 --> 00:02:43.559 +people who hate videos", and it tries to -02:47.640 --> 02:51.360 -I'm going to explain many of these things very soon. +00:02:43.560 --> 00:02:46.159 +do everything with very little magic and + +00:02:46.160 --> 00:02:48.839 +without black boxes - I'm going to explain + +00:02:48.840 --> 00:02:50.319 +many of these things very soon. NOTE Another figure -02:51.360 --> 02:58.200 -This is a figure that I'm going to show in detail soon +00:02:50.320 --> 00:02:52.799 +This is a figure that that I'm going + +00:02:52.800 --> 00:02:57.119 +to show in details soon, that is + +00:02:57.120 --> 00:02:59.959 +about something important about Lua... + +00:02:59.960 --> 00:03:03.959 +the font is very bad now, so let me + +00:03:03.960 --> 00:03:07.559 +change the font... the figure is this one... + +00:03:07.560 --> 00:03:08.239 +and... + +00:03:08.240 --> 00:03:12.519 +what most people do when they + +00:03:12.520 --> 00:03:14.479 +visit a file with something + +00:03:14.480 --> 00:03:16.479 +interesting on it is that they just go + +00:03:16.480 --> 00:03:18.679 +there and they set a bookmark there, or + +00:03:18.680 --> 00:03:21.959 +they put the position in a register... + +00:03:21.960 --> 00:03:26.959 +but I prefer to keep + +00:03:26.960 --> 00:03:29.199 +links to everything that is interesting + +00:03:29.200 --> 00:03:32.119 +as elisp hyperlinks. So, for example, this is + +00:03:32.120 --> 00:03:35.079 +an elisp hyperlink to a file, that goes -02:58.200 --> 03:01.640 -that is about something important about Lua. +00:03:35.080 --> 00:03:37.599 +to this anchor here, and to this string -03:01.640 --> 03:03.400 -Oops, the font is very bad now, +00:03:37.600 --> 00:03:41.439 +after this anchor... this is a variant -03:03.400 --> 03:05.200 -so let me change the font. +00:03:41.440 --> 00:03:44.239 +that opens that file in the window -03:05.200 --> 03:07.760 -The figure is this one. +00:03:44.240 --> 00:03:45.479 +at the right - -03:09.880 --> 00:03:12.935 -What most people do when they visit a file +00:03:45.480 --> 00:03:48.879 +here... and this is -00:03:12.936 --> 00:03:15.280 -with something interesting in it, +00:03:48.880 --> 00:03:53.279 +a sexp that changes the font. I -03:15.280 --> 03:18.360 -is that they just go there and they set a bookmark there, +00:03:53.280 --> 00:03:56.679 +have a command with a very short name -03:18.360 --> 03:22.640 -or they put the position in the register. +00:03:56.680 --> 00:03:59.439 +that does that, but I -03:22.640 --> 00:03:29.781 -But I prefer to keep links +00:03:59.440 --> 00:04:02.959 +prefer to keep that as a one-liner. -00:03:29.782 --> 00:03:30.221 -to everything that is interesting +00:04:02.960 --> 00:04:06.919 +About the videos... we can see -00:03:30.222 --> 00:03:30.480 -as an Elisp hyperlink. +00:04:06.920 --> 00:04:10.079 +the list of first-class videos of eev -03:30.480 --> 00:03:34.236 -For example, this is an Elisp hyperlink to the file +00:04:10.080 --> 00:04:14.759 +by executing this, M-x find-1stclassvideos, -00:03:34.237 --> 00:03:36.520 -that goes to this anchor here, +00:04:14.760 --> 00:04:18.639 +or by running this alias here, M-x 1c... -03:36.520 --> 03:39.280 -and to this string after this anchor. +00:04:18.640 --> 00:04:20.679 +and then what we see is this... -03:39.280 --> 00:03:43.388 -This is a variant that opens that file +00:04:20.680 --> 00:04:24.239 +the first sexp here -00:03:43.389 --> 00:03:46.760 -in the window at the right here, +00:04:24.240 --> 00:04:26.959 +regenerates this buffer - so we can make a -03:46.760 --> 03:53.640 -and this is a sexp that changes the font. +00:04:26.960 --> 00:04:29.399 +mess here and then run this and the -03:53.640 --> 03:57.880 -I have a command with a very short name that does that, +00:04:29.400 --> 00:04:33.519 +original buffer is regenerated again in -03:57.880 --> 04:03.680 -but I prefer to keep that as a one-liner. +00:04:33.520 --> 00:04:34.959 +a clean way... -04:03.680 --> 00:04:04.281 -About the videos, we can see +00:04:34.960 --> 00:04:36.919 +each of these things here -00:04:04.282 --> 00:04:11.440 -the list of first-class videos of eev by executing this, +00:04:36.920 --> 00:04:40.879 +opens a buffer with information about -04:11.440 --> 00:04:14.190 -`M-x find-1stclassvideos`, +00:04:40.880 --> 00:04:43.999 +a video... let me take a specific -00:04:14.191 --> 00:04:18.480 -or by running this alias here, `M-x 1c`, +00:04:44.000 --> 00:04:49.159 +example here... this video here is about -04:18.480 --> 04:21.160 -and then what we see is this. +00:04:49.160 --> 00:04:51.039 +one of the ancestors of this talk, that -04:21.160 --> 04:25.560 -The first sexp here regenerates this buffer, +00:04:51.040 --> 00:04:53.479 +is a library that I wrote -04:25.560 --> 04:29.120 -so we can make a mess here and then run this, +00:04:53.480 --> 00:04:58.479 +for creating diagrams in LaTeX using -04:29.120 --> 04:34.120 -and the original buffer is regenerated again in a clean way. +00:04:58.480 --> 00:05:03.519 +a package called Pict2e using REPLs... -04:34.120 --> 00:04:36.951 -Each of these things here +00:05:03.520 --> 00:05:03.959 +anyway... -00:04:36.952 --> 00:04:41.960 -opens a buffer with information about a video. +00:05:03.960 --> 00:05:06.599 +the thing is that if we -04:41.960 --> 04:45.320 -Let me take a specific example here. +00:05:06.600 --> 00:05:11.599 +run a sexp like this one and we don't -04:45.320 --> 00:04:50.278 -This video here is about one of the ancestors of this talk +00:05:11.600 --> 00:05:14.679 +have a local copy of the video eev -00:04:50.279 --> 00:04:52.800 -that is a library that I wrote +00:05:14.680 --> 00:05:17.599 +will try to download to the local copy - -04:52.800 --> 00:04:56.906 -for creating diagrams in LaTeX +00:05:17.600 --> 00:05:20.119 +and instead of doing that by asking -00:04:56.907 --> 00:05:03.000 -using a package called [pict2e-lua] using REPLs. +00:05:20.120 --> 00:05:21.719 +something like "do you want me -05:03.000 --> 00:05:10.028 -Anyway, the thing is that if we run a sexp like this one +00:05:21.720 --> 00:05:23.999 +to download the local copy? Blah -00:05:10.029 --> 00:05:16.314 -and we don't have a local copy of the video, +00:05:24.000 --> 00:05:27.999 +blah blah blah blah..." it simply opens a -00:05:16.315 --> 00:05:19.581 -eev will try to load the local copy +00:05:28.000 --> 00:05:30.719 +buffer like this, I mean, if we don't -00:05:19.582 --> 00:05:20.560 -and instead of doing that by asking something +00:05:30.720 --> 00:05:33.359 +have a local copy yet it will open a -05:20.560 --> 00:05:25.381 -like "do you want me to download the local copy" +00:05:33.360 --> 00:05:36.359 +buffer like this one, in which these -00:05:25.382 --> 00:05:29.240 -blah, blah, blah, it simply opens a buffer like this. +00:05:36.360 --> 00:05:39.199 +things here in comments are links to the -05:29.240 --> 00:05:35.514 -And if we don't have a local copy yet, +00:05:39.200 --> 00:05:43.839 +documentation... I mean, this thing here -00:05:35.515 --> 00:05:37.220 -it will open a buffer like this one, +00:05:43.840 --> 00:05:46.159 +explains the idea of local copies -00:05:37.221 --> 00:05:40.030 -in which these things here in comments +00:05:46.160 --> 00:05:48.759 +of files from the internet... -00:05:40.031 --> 00:05:42.678 -are links to the documentation. +00:05:48.760 --> 00:05:54.759 +there are more details here, and here... -00:05:42.679 --> 00:05:45.780 -This thing here explains the idea +00:05:54.760 --> 00:05:57.159 +and this is a script that we -00:05:45.781 --> 00:05:50.278 -of local copies of files from the internet. +00:05:57.160 --> 00:06:00.519 +can execute line by line, so instead of -00:05:50.279 --> 00:05:54.120 -There are more details here and here, +00:06:00.520 --> 00:06:02.359 +this script being hidden behind the -00:05:54.121 --> 00:05:59.580 -and this is a script that we can execute line by line. +00:06:02.360 --> 00:06:06.119 +button that we just press after a -05:59.580 --> 00:06:04.276 -So instead of this script being hidden behind the button +00:06:06.120 --> 00:06:08.399 +question like "Do you want me to do -00:06:04.277 --> 00:06:07.160 -that we just press after a question +00:06:08.400 --> 00:06:10.239 +something blah blah blah? Yes or no?" -06:07.160 --> 00:06:10.708 -like "do you want me to do something," blah, blah, blah, +00:06:10.240 --> 00:06:13.639 +the script is visible here and we can -00:06:10.709 --> 00:06:13.228 -"yes or no?", the script is visible here +00:06:13.640 --> 00:06:17.599 +execute it step by step... it creates a -00:06:13.229 --> 00:06:15.380 -and we can execute it step by step. +00:06:17.600 --> 00:06:20.799 +terminal with a shell here in the -06:15.380 --> 00:06:22.457 -It creates a terminal with a shell here in the right window +00:06:20.800 --> 00:06:24.799 +right window, and when we type f8 in -00:06:22.458 --> 00:06:26.988 -and when we type `F8` in these lines here, +00:06:24.800 --> 00:06:26.839 +one of these lines here the lines are -00:06:26.989 --> 00:06:30.360 -the lines are sent to this line. +00:06:26.840 --> 00:06:29.119 +sent... (...) so this is going -06:30.360 --> 00:06:33.842 -So this is going to download a copy of the video, +00:06:29.120 --> 00:06:31.759 +to download a copy of the video... the -00:06:33.843 --> 00:06:38.134 -the wget says that I already have a copy of the video +00:06:31.760 --> 00:06:36.639 +wget says that I already have a copy of -00:06:38.135 --> 00:06:40.360 -and its subtitles and so on. +00:06:36.640 --> 00:06:39.479 +the video and its subtitles... and so on. -06:40.360 --> 00:06:45.739 +00:06:39.480 --> 00:06:43.879 And after getting a copy of the video -00:06:45.740 --> 00:06:52.960 -we can run this exp here and it displays the video. +00:06:43.880 --> 00:06:48.159 +we can run this sexp here and it displays + +00:06:48.160 --> 00:06:49.919 +the video. + +00:06:49.920 --> 00:06:55.399 +I said that eev has lots of + +00:06:55.400 --> 00:06:58.399 +"videos for people who hate videos", and + +00:06:58.400 --> 00:06:59.679 +the idea is that very few + +00:06:59.680 --> 00:07:02.039 +people are going to watch the videos in + +00:07:02.040 --> 00:07:06.559 +real time... and most of the people that + +00:07:06.560 --> 00:07:08.279 +I know - or: most of the people that + +00:07:08.280 --> 00:07:10.639 +are interested in eev in some + +00:07:10.640 --> 00:07:13.479 +way... they are going to watch just + +00:07:13.480 --> 00:07:16.319 +small sections of the video, and most of + +00:07:16.320 --> 00:07:17.559 +the time they're just going to read the + +00:07:17.560 --> 00:07:20.799 +subtitles of the video. So, for each + +00:07:20.800 --> 00:07:23.479 +one of the videos we have a page + +00:07:23.480 --> 00:07:27.039 +about the video... let me see if I + +00:07:27.040 --> 00:07:29.999 +have internet here... yes. This is a + +00:07:30.000 --> 00:07:32.879 +page... + +00:07:32.880 --> 00:07:38.999 +and usually these pages have a link + +00:07:39.000 --> 00:07:40.759 +to another page that + +00:07:40.760 --> 00:07:43.239 +has all the subtitles of the + +00:07:43.240 --> 00:07:46.639 +video... uh, wherever... in this one + +00:07:46.640 --> 00:07:48.319 +it's not so visible... + +00:07:48.320 --> 00:07:50.599 +but anyway, there are several -06:52.960 --> 00:06:55.486 -I said that eev has lots of videos +00:07:50.600 --> 00:07:52.479 +ways of accessing the subtitles of the -00:06:55.487 --> 00:06:57.435 -for people who hate videos. +00:07:52.480 --> 00:07:56.239 +video, and one of the ways is by running -00:06:57.436 --> 00:07:00.046 -The idea is that very few people +00:07:56.240 --> 00:07:57.519 +this sexp here, -00:07:00.047 --> 00:07:03.081 -are going to watch the videos in real time. +00:07:57.520 --> 00:08:01.559 +that opens a file in Lua that is -00:07:03.082 --> 00:07:07.642 -Most of the people that I know, or most of the people +00:08:01.560 --> 00:08:03.319 +what I use to generate the -00:07:07.643 --> 00:07:10.790 -that are interested in eev in some way, +00:08:03.320 --> 00:08:04.479 +subtitles. -00:07:10.791 --> 00:07:14.320 -they are going to watch just small sections of the video. +00:08:04.480 --> 00:08:08.519 +Anyway... by the way, these things... each -00:07:14.321 --> 00:07:17.574 -Most of the time, they are just going to +00:08:08.520 --> 00:08:12.039 +one of these things here is a hyperlink -00:07:17.575 --> 00:07:19.940 -read the subtitles of the video. +00:08:12.040 --> 00:08:15.239 +to a position of the video, so if I type -07:19.940 --> 00:07:22.531 -For each one of the videos +00:08:15.240 --> 00:08:18.879 +this the right way it goes to that -00:07:22.532 --> 00:07:25.295 -we have a page about the video... +00:08:18.880 --> 00:08:24.119 +position. Anyway, let me go back... -00:07:25.296 --> 00:07:29.673 -Let me see if I have internet here... +00:08:24.120 --> 00:08:27.279 +also, the tutorials of eev... the -00:07:29.674 --> 00:07:34.901 -This is a page. Usually these pages +00:08:27.280 --> 00:08:31.359 +"intros" of eev, that start with "find-" and -00:07:34.902 --> 00:07:38.427 -have a link to another page, +00:08:31.360 --> 00:08:34.279 +end with "-intro", they have lots of blocks -00:07:38.428 --> 00:07:43.890 -the page that has all the subtitles of the video, +00:08:34.280 --> 00:08:39.039 +that say "[Video links:]", like this one, and -00:07:43.891 --> 00:07:48.587 -wherever. In this one, it's not so visible. +00:08:39.040 --> 00:08:41.359 +these blocks have links to positions -00:07:48.588 --> 00:07:52.001 -Anyway, there are several ways of accessing +00:08:41.360 --> 00:08:43.879 +in videos, and if we don't have a local -00:07:52.002 --> 00:07:53.963 -the subtitles of the video. +00:08:43.880 --> 00:08:47.919 +copy of the video yet the thing shows -00:07:53.964 --> 00:07:58.632 -One of the ways is by running this sexp here +00:08:47.920 --> 00:08:49.799 +us a script that lets us download the -00:07:58.633 --> 00:08:01.064 -that opens a file in Lua. +00:08:49.800 --> 00:08:50.599 +local copy. -00:08:01.065 --> 00:08:05.440 -That is what I use to generate the subtitles. +00:08:50.600 --> 00:08:54.399 +Anyway, I said that I was going -08:05.440 --> 00:08:10.368 -By the way, each one of these things here +00:08:54.400 --> 00:08:58.759 +to explain what I mean by "magic" and -00:08:10.369 --> 00:08:14.680 -is hyperlinked to a position of the video. +00:08:58.760 --> 00:08:59.639 +"black boxes". -08:14.680 --> 00:08:21.280 -If I type this, it goes to that position. +00:08:59.640 --> 00:09:03.119 +this is something that I've been -00:08:21.281 --> 00:08:24.580 -Anyway, let me go back. +00:09:03.120 --> 00:09:05.119 +trying to explain for a long time, and I -08:24.580 --> 00:08:28.557 -So the tutorials of eev, the intros of eev +00:09:05.120 --> 00:09:07.319 +think that I got a very good explanation -00:08:28.558 --> 00:08:32.350 -that start with `find-` and end with `-intro`, +00:09:07.320 --> 00:09:09.839 +about that in a video that I made -00:08:32.351 --> 00:08:35.332 -they have lots of blocks that say +00:09:09.840 --> 00:09:13.199 +about something called eev-wconfig, that -00:08:35.333 --> 00:08:37.612 -video links like this one. +00:09:13.200 --> 00:09:14.999 +is a tool for configuring eev on -00:08:37.613 --> 00:08:41.972 -These blocks have links to positions in videos. +00:09:15.000 --> 00:09:19.199 +Windows without "magic" - without buttons -00:08:41.973 --> 00:08:46.332 -If we don't have a local copy of the video yet, +00:09:19.200 --> 00:09:22.479 +that do things without explaining what -00:08:46.333 --> 00:08:49.015 -the thing shows us a script +00:09:22.480 --> 00:09:22.879 +they're doing. -00:08:49.016 --> 00:08:52.560 -that lets us download the local copy. +00:09:22.880 --> 00:09:25.799 +This is a part of the subtitles -NOTE eev-wconfig, magic, and black boxes +00:09:25.800 --> 00:09:28.039 +of the video, let me read that... -08:52.560 --> 00:08:57.440 -I said that I was going to explain +00:09:28.040 --> 00:09:32.319 +eev-wconfig is an attempt to solve the -00:08:57.441 --> 00:09:01.855 -what I mean by magic and black boxes, +00:09:32.320 --> 00:09:35.039 +problem of how to install these things -00:09:01.856 --> 00:09:03.799 -this is something that I've been trying +00:09:35.040 --> 00:09:37.279 +on Windows both without magic and with -00:09:03.800 --> 00:09:05.111 -to explain for a long time +00:09:37.280 --> 00:09:37.879 +very little -00:09:05.112 --> 00:09:08.761 -and I think that I got a very good explanation about that +00:09:37.880 --> 00:09:41.679 +magic. Remember this slogan: "any -00:09:08.762 --> 00:09:12.348 -in a video that I made about something called eev-wconfig +00:09:41.680 --> 00:09:44.359 +sufficiently advanced technology is -00:09:12.349 --> 00:09:17.943 -that is a tool for configuring eev on Windows without magic, +00:09:44.360 --> 00:09:45.399 +indistinguishable from -00:09:17.944 --> 00:09:20.878 -without buttons that do things, +00:09:45.400 --> 00:09:49.679 +magic". Here in this video I'm going to -00:09:20.879 --> 00:09:24.380 -without explaining what they are doing. +00:09:49.680 --> 00:09:52.199 +use the term magic as a shorthand -09:24.380 --> 00:09:28.078 -This is a part of the subtitles of the video. +00:09:52.200 --> 00:09:55.239 +for sufficiently advanced technology, -00:09:28.079 --> 00:09:29.445 -Let me read that. +00:09:55.240 --> 00:09:57.799 +that is something that is complex and -00:09:29.446 --> 00:09:32.531 -eev-wconfig is an attempt to solve the problem +00:09:57.800 --> 00:10:00.199 +non-obvious and that is -00:09:32.532 --> 00:09:35.349 -of how to install these things on Windows +00:10:00.200 --> 00:10:02.119 +indistinguishable from magic in the -00:09:35.350 --> 00:09:40.040 -both without magic and with very little magic. +00:10:02.120 --> 00:10:04.119 +sense of being almost impossible to -09:40.040 --> 00:09:44.941 -Remember this slogan: "Any sufficiently advanced technology +00:10:04.120 --> 00:10:07.439 +understand. And I'm also going to use a -00:09:44.942 --> 00:09:47.600 -is indistinguishable from magic." +00:10:07.440 --> 00:10:10.279 +the term "black box" as a near-synonym for -09:47.600 --> 00:09:51.433 -Here in this video I'm going to use the term magic +00:10:10.280 --> 00:10:13.079 +magic, and sometimes the term -00:09:51.434 --> 00:09:55.262 -as a shorthand for sufficiently advanced technology +00:10:13.080 --> 00:10:16.039 +"black box" is more convenient even though -00:09:55.263 --> 00:09:58.944 -that is something that is complex and non obvious +00:10:16.040 --> 00:10:17.919 +it's a bit longer - it has more -00:09:58.945 --> 00:10:01.920 -and that is indistinguishable from magic +00:10:17.920 --> 00:10:20.159 +letters - because when I use the term -00:10:01.921 --> 00:10:05.840 -in the sense of being almost impossible to understand. +00:10:20.160 --> 00:10:22.599 +black box it invites us to use -10:05.840 --> 00:10:09.272 -And I'm also going to use the term black box +00:10:22.600 --> 00:10:25.479 +expressions like "opening the black box", -00:10:09.273 --> 00:10:11.408 -as a near synonym for magic +00:10:25.480 --> 00:10:26.639 +and I'm going to use that -00:10:11.409 --> 00:10:15.217 -and sometimes the term black box is more convenient +00:10:26.640 --> 00:10:28.039 +expression a lot. -00:10:15.218 --> 00:10:17.488 -even though it's a bit longer, +00:10:28.040 --> 00:10:37.399 +Now let me try to explain what is... -00:10:17.489 --> 00:10:21.333 -it has more letters because when I use the term black box +00:10:37.400 --> 00:10:41.039 +sorry, let me change the font... -00:10:21.334 --> 00:10:23.521 -it invites us to use expressions +00:10:41.040 --> 00:10:45.479 +what is Lua. Lua is a minimalistic -00:10:23.522 --> 00:10:27.872 -like opening the black box +00:10:45.480 --> 00:10:49.999 +language, in the sense of -00:10:27.873 --> 00:10:34.800 -and I'm going to use that expression a lot. +00:10:50.000 --> 00:10:53.679 +"batteries not included"... it uses -10:34.800 --> 00:10:40.899 -Now let me try to explain what is. Sorry, +00:10:53.680 --> 00:10:55.999 +associative tables for most of its data -00:10:40.900 --> 00:10:44.240 -let me change the font. +00:10:56.000 --> 00:10:56.799 +structures... -NOTE Lua +00:10:56.800 --> 00:11:00.239 +and it is so minimalistic -10:44.240 --> 10:45.240 -What is Lua? +00:11:00.240 --> 00:11:03.999 +that its default print function, when -10:45.240 --> 00:10:48.645 -Lua is a minimalistic language +00:11:04.000 --> 00:11:06.679 +we tell... when we create an associative -00:10:48.646 --> 00:10:53.040 -in the sense of battery is not included. +00:11:06.680 --> 00:11:09.559 +table and we ask it to print... -10:53.040 --> 00:10:57.987 -It uses associative tables for most of its data structures. +00:11:09.560 --> 00:11:13.319 +when we ask "print" to print an -00:10:57.988 --> 00:11:00.874 -It's so minimalistic +00:11:13.320 --> 00:11:15.719 +associative table it just prints the -00:11:00.875 --> 00:11:05.147 -that the default print function +00:11:15.720 --> 00:11:17.879 +address of the table. Here are some -00:11:05.148 --> 00:11:11.960 -when we create an associative table and we ask it to print-- +00:11:17.880 --> 00:11:21.599 +examples... here is a table, and when we -11:11.960 --> 00:11:14.914 -we ask print to print an associative table-- +00:11:21.600 --> 00:11:24.679 +ask "print" to print it it just says -00:11:14.915 --> 00:11:17.600 -it just prints the address of the table. +00:11:24.680 --> 00:11:26.839 +that it's the table at this address here. -11:17.600 --> 00:11:20.902 -Here are some examples. Here is a table +00:11:26.840 --> 00:11:30.119 +So, one of things that that most -00:11:20.903 --> 00:11:23.296 -and when we ask to print it, +00:11:30.120 --> 00:11:32.919 +people do when they start using Lua is -00:11:23.297 --> 00:11:28.200 -it just says that it's the table at this address here. +00:11:32.920 --> 00:11:35.239 +that either they download a package with -11:28.200 --> 00:11:30.893 -One of the things that most people do +00:11:35.240 --> 00:11:37.079 +a pretty-printing function or they write -00:11:30.894 --> 00:11:33.586 -when they start using Lua is that either +00:11:37.080 --> 00:11:39.359 +their own pretty-printing functions. My -00:11:33.587 --> 00:11:36.313 -they download a package with a print to printing function +00:11:39.360 --> 00:11:41.519 +own pretty-printing function is called -00:11:36.314 --> 00:11:39.520 -or they write their own print to printing functions. +00:11:41.520 --> 00:11:46.159 +PP, with upper case letters, and it works -11:39.520 --> 00:11:41.975 -My own print to printing function +00:11:46.160 --> 00:11:47.679 +like this... -00:11:41.976 --> 00:11:44.450 -is called PP with upper case letters, +00:11:47.680 --> 00:11:50.279 +and it prints associative tables -00:11:44.451 --> 00:11:46.757 -and it works like this. +00:11:50.280 --> 00:11:53.839 +in a way like this. It says that for -00:11:46.758 --> 00:11:52.072 -It prints associative tables in a way like this. +00:11:53.840 --> 00:11:57.479 +the key 1 the the value associated to -00:11:52.073 --> 00:11:54.125 -It says that for the key 1, +00:11:57.480 --> 00:12:00.039 +it is 2, for the key 2 the value is -00:11:54.126 --> 00:11:56.602 -the value associated to it is 2; +00:12:00.040 --> 00:12:04.959 +3, and for the key 3 the value is 5. -00:11:56.603 --> 00:11:59.078 -for the key 2, the value is 3; +00:12:04.960 --> 00:12:11.079 +When I started using Lua one of my -00:11:59.079 --> 00:12:09.240 -and for the key 3, the value is 5. +00:12:11.080 --> 00:12:13.839 +favorite languages was also a language -12:09.240 --> 00:12:12.379 -When I started using Lua, one of my favorite languages +00:12:13.840 --> 00:12:15.639 +that used associative tables a lot - -00:12:12.380 --> 00:12:16.623 -was also a language that used associative tables a lot. +00:12:15.640 --> 00:12:16.839 +it was called Icon... -00:12:16.624 --> 00:12:20.339 -It was called Icon. I had to write my own +00:12:16.840 --> 00:12:21.039 +and I had to write my own -00:12:20.340 --> 00:12:23.394 -print to printing functions for Icon, +00:12:21.040 --> 00:12:23.839 +pretty-printing functions for Icon, so -00:12:23.395 --> 00:12:29.425 -so I just had to port my print to printing functions to Lua. +00:12:23.840 --> 00:12:27.319 +I just had to port my pretty-printing -00:12:29.426 --> 00:12:34.350 -My first version looked something like this. +00:12:27.320 --> 00:12:29.719 +functions to Lua... and my first -00:12:34.351 --> 00:12:40.080 -it just had some global functions. Lots of them actually. +00:12:29.720 --> 00:12:32.239 +version looked at something like this... it -12:40.080 --> 00:12:41.933 -After a while, I rewrote it. +00:12:32.240 --> 00:12:35.999 +just had some some global functions... lots -00:12:41.934 --> 00:12:44.503 -I rewrote it again and again and again. +00:12:36.000 --> 00:12:39.639 +of them, actually... -00:12:44.504 --> 00:12:48.397 -This is one of the versions +00:12:39.640 --> 00:12:42.279 +and after a while I rewrote it, and I -00:12:48.398 --> 00:12:53.751 -that is not even the default at this point. +00:12:42.280 --> 00:12:44.599 +rewrote it again, and again, and again, and -00:12:53.752 --> 00:12:57.702 -`tos` is for to string. This is a demo. +00:12:44.600 --> 00:12:47.279 +this is one of the versions of that, -00:12:57.703 --> 00:13:02.905 -It's very modular, so it's easy to replace parts of it +00:12:47.280 --> 00:12:49.879 +is not even the default at this -00:13:02.906 --> 00:13:06.567 -or to toggle flags. This is an example. +00:12:49.880 --> 00:12:51.559 +point... -00:13:06.568 --> 00:13:11.797 -If I try to print the table of methods for a certain class-- +00:12:51.560 --> 00:12:54.119 +"Tos" is for "to string"... -00:13:11.798 --> 00:13:16.245 -I only need a smaller font--it prints the table like this +00:12:54.120 --> 00:12:58.279 +and this is a demo... -00:13:16.246 --> 00:13:18.510 -with the names of the methods +00:12:58.280 --> 00:13:01.919 +it's very modular, so it's easy to replace -00:13:18.511 --> 00:13:22.360 -and then links to the source code of the functions. +00:13:01.920 --> 00:13:05.639 +parts of it, or to toggle flags... and this -13:22.360 --> 00:13:26.671 -These links only make sense in Emacs and in eev. +00:13:05.640 --> 00:13:08.119 +is an example. If I try to print the -00:13:26.672 --> 00:13:30.296 -When we run a link like this one, +00:13:08.120 --> 00:13:09.999 +table of methods for a certain -00:13:30.297 --> 00:13:34.013 -it shows the source code and the window at the right. +00:13:10.000 --> 00:13:14.359 +class... I will need a smaller font... -00:13:34.014 --> 00:13:38.647 -For some functions, the source code is three lines. +00:13:14.360 --> 00:13:16.799 +it prints the table like this, with the -00:13:38.648 --> 00:13:42.320 -For other ones, it's one line and whatever. +00:13:16.800 --> 00:13:20.039 +names of the methods and then links to -13:42.320 --> 00:13:44.149 -Anyway, let me go back. +00:13:20.040 --> 00:13:21.719 +the source code of the functions... -00:13:44.150 --> 00:13:47.490 -Lua can be used in many different styles. +00:13:21.720 --> 00:13:25.399 +these links only make sense in Emacs and -00:13:47.491 --> 00:13:52.240 -Most people hate other people's styles. +00:13:25.400 --> 00:13:25.959 +in eev... -13:52.240 --> 00:13:55.252 -When I started using it in the year 2000, +00:13:25.960 --> 00:13:30.359 +and when we run a link like this one... -00:13:55.253 --> 00:13:59.566 -I learned most of the basic language in a single day. +00:13:30.360 --> 00:13:32.039 +it shows the source code in the -00:13:59.567 --> 00:14:04.042 -It was very similar to things that I was already using. +00:13:32.040 --> 00:13:35.079 +window at the right. So, for some -00:14:04.043 --> 00:14:08.388 -Then I rewrote the mini language +00:13:35.080 --> 00:13:37.879 +functions the source code is three lines, -00:14:08.389 --> 00:14:15.200 -that I was using to generate the HTML for my pages in Lua. +00:13:37.880 --> 00:13:39.999 +for other ones it's one line... and -14:15.200 --> 00:14:17.591 -Actually, I had to rewrite it many times +00:13:40.000 --> 00:13:44.879 +whatever. Anyway, let me go -00:14:17.592 --> 00:14:21.367 -but the first version I certainly did +00:13:44.880 --> 00:13:47.039 +back... Lua can be used in many different -00:14:21.368 --> 00:14:25.740 -in my first weeks or first months using Lua. +00:13:47.040 --> 00:13:50.359 +styles... most people hate other people's -14:25.740 --> 00:14:29.653 -In the beginning, I was just using it for writing programs +00:13:50.360 --> 00:13:53.839 +styles... when I started using it in the -00:14:29.654 --> 00:14:32.876 -that either didn't take any input at all +00:13:53.840 --> 00:13:57.679 +year 2000 I learned most of the basic -00:14:32.877 --> 00:14:36.727 -because the input was already in the source file, +00:13:57.680 --> 00:13:59.839 +language in a single day - it was very -00:14:36.728 --> 00:14:39.400 -or that worked as a Unix function: +00:13:59.840 --> 00:14:02.119 +similar to things that I was already -14:39.400 --> 00:14:42.451 -the Unix programs that would read files, +00:14:02.120 --> 00:14:05.639 +using... and then I rewrote the the mini- -00:14:42.452 --> 00:14:49.560 -process these files in some way, and output something. +00:14:05.640 --> 00:14:10.279 +language that I was using to -14:49.560 --> 00:14:52.200 -I mentioned the basic language here, +00:14:10.280 --> 00:14:13.559 +generate the HTML for my pages -00:14:52.201 --> 00:14:55.625 -I only learned how to use closures, meta tables, +00:14:13.560 --> 00:14:16.199 +in Lua... actually I had to rewrite it -00:14:55.626 --> 00:15:00.600 -and coroutines many years later. +00:14:16.200 --> 00:14:18.079 +many times, but the first version I -15:00.600 --> 00:15:02.588 -In the beginning when I started using Lua +00:14:18.080 --> 00:14:21.519 +certainly did in my first weeks or first -00:15:02.589 --> 00:15:04.199 -it didn't have a package manager. +00:14:21.520 --> 00:14:22.519 +months using Lua... -00:15:04.200 --> 00:15:08.299 -It appeared later. It is called luarocks. +00:14:22.520 --> 00:14:27.279 +In the beginning I was just using -00:15:08.300 --> 00:15:13.180 -It has had this package manager for several years. +00:14:27.280 --> 00:14:30.159 +it for writing programs that either -15:13.180 --> 00:15:17.242 -Most of the rocks for luarocks are poorly documented +00:14:30.160 --> 00:14:32.759 +didn't take any input at all - because -00:15:17.243 --> 00:15:18.897 -and hacker-unfriendly. +00:14:32.760 --> 00:14:35.079 +the input was already in the source file - -00:15:18.898 --> 00:15:22.079 -You can't rely just on the documentation. +00:14:35.080 --> 00:14:40.599 +or that worked as Unix programs, -00:15:22.080 --> 00:15:25.188 -You can't rely just on the source code, +00:14:40.600 --> 00:14:43.199 +that would read files -00:15:25.189 --> 00:15:28.706 -because--I mean, if you're a genius, of course you can, +00:14:43.200 --> 00:14:45.279 +and process these files in some way -00:15:28.707 --> 00:15:31.544 -but for people who are either +00:14:45.280 --> 00:14:48.999 +and output something. -00:15:31.545 --> 00:15:35.895 -lazy or dumb or whatever like me, or unfocused, +00:14:49.000 --> 00:14:52.319 +I mentioned the "basic language" here... -00:15:35.896 --> 00:15:39.490 -the source code is hard to understand +00:14:52.320 --> 00:14:54.719 +I only learned how to use closures, -00:15:39.491 --> 00:15:41.760 -and hard to tinker with. +00:14:54.720 --> 00:14:58.479 +metatables, and coroutines many years later... -15:41.760 --> 00:15:43.760 -Some rocks are excellent. +00:14:58.480 --> 00:15:02.399 +in the beginning, when I started using Lua, -00:15:43.761 --> 00:15:46.452 -The best rocks are well documented, +00:15:02.400 --> 00:15:04.199 +it didn't have a package manager... -00:15:46.453 --> 00:15:48.760 +00:15:04.200 --> 00:15:06.799 +it appeared later, it is called + +00:15:06.800 --> 00:15:10.119 +Luarocks... it has had this package + +00:15:10.120 --> 00:15:13.279 +manager for several years, most + +00:15:13.280 --> 00:15:15.719 +of the rocks for Luarocks are poorly + +00:15:15.720 --> 00:15:18.959 +documented and hacker-unfriendly, + +00:15:18.960 --> 00:15:21.199 +so you can't rely just on the + +00:15:21.200 --> 00:15:23.679 +documentation and you can't rely just on the + +00:15:23.680 --> 00:15:26.719 +source code, because, I mean... if you are + +00:15:26.720 --> 00:15:29.159 +a genius of course you can, but for + +00:15:29.160 --> 00:15:31.479 +people who are either lazy, or dumb, or + +00:15:31.480 --> 00:15:34.279 +whatever, like me, or unfocused... + +00:15:34.280 --> 00:15:36.759 +the source code is hard to + +00:15:36.760 --> 00:15:38.959 +understand and hard to tinker with. + +00:15:38.960 --> 00:15:43.319 +Some rocks are excellent. The + +00:15:43.320 --> 00:15:46.599 +best rocks are well documented + +00:15:46.600 --> 00:15:48.719 but they are hacker-unfriendly -15:48.760 --> 15:53.640 -in the sense that I hope that I'll be able to explain soon. +00:15:48.720 --> 00:15:50.999 +in a sense that I hope that + +00:15:51.000 --> 00:15:52.879 +I'll be able to explain soon. + +00:15:52.880 --> 00:15:54.999 +The best rocks use local -15:53.640 --> 00:15:59.466 -The best rocks use local variables and meta tables a lot, +00:15:55.000 --> 00:15:58.799 +variables and metatables a lot - -00:15:59.467 --> 00:16:02.905 -so if you are a beginner learning Lua +00:15:58.800 --> 00:16:02.519 +so if you are beginner -00:16:02.906 --> 00:16:08.245 -you're not going to understand what their source codes do. +00:16:02.520 --> 00:16:03.799 +learning Lua you're not going to -00:16:08.246 --> 00:16:10.960 -They use lots of dirty tricks. +00:16:03.800 --> 00:16:06.159 +understand what their source code do... + +00:16:06.160 --> 00:16:08.519 +they use lots of dirty tricks. NOTE Object orientation in Lua -16:10.960 --> 16:14.360 -Let me talk a bit about object orientation in Lua. +00:16:08.520 --> 00:16:12.479 +Let me talk a bit about object + +00:16:12.480 --> 00:16:14.959 +orientation in Lua. It can be done in + +00:16:14.960 --> 00:16:15.879 +many ways... + +00:16:15.880 --> 00:16:18.999 +the main book about Lua, called + +00:16:19.000 --> 00:16:21.439 +"Programming in Lua", by one of the authors -16:14.360 --> 00:16:18.275 -It can be done in many ways. The main book about Lua +00:16:21.440 --> 00:16:23.959 +of the language, Roberto Ierusalimschy, -00:16:18.276 --> 00:16:20.140 -called Programming in Lua +00:16:23.960 --> 00:16:26.679 +presents several ways of doing -00:16:20.141 --> 00:16:22.865 -by one of the authors of the language +00:16:26.680 --> 00:16:29.279 +object orientation in Lua... I hated all -00:16:22.866 --> 00:16:24.729 -called Roberto Ierusalimschy +00:16:29.280 --> 00:16:33.199 +of these ways - and also the ways that I -00:16:24.730 --> 00:16:28.680 -presents several ways of doing object orientation in Lua. +00:16:33.200 --> 00:16:34.519 +tried from the rocks. -16:28.680 --> 00:16:31.386 -I hated all of these ways, +00:16:34.520 --> 00:16:38.559 +And then I wrote my own way -00:16:31.387 --> 00:16:36.056 -and also the ways that I tried from the rocks. +00:16:38.560 --> 00:16:40.639 +of doing object orientation in Lua... it's -00:16:36.057 --> 00:16:37.933 -Then I wrote my own way +00:16:40.640 --> 00:16:43.559 +very minimalistic, it's in this file here, -00:16:37.934 --> 00:16:40.347 -of doing object orientation in Lua. +00:16:43.560 --> 00:16:48.679 +eoo.lua... the main code is just this five -00:16:40.348 --> 00:16:45.653 -It's very minimalistic. It's in this file here eoo.lua. +00:16:48.680 --> 00:16:49.639 +lines here... -00:16:45.654 --> 00:16:49.898 -The main code is just these five lines here. +00:16:49.640 --> 00:16:53.439 +and here's an example of how it works. -00:16:49.899 --> 00:16:56.400 -Here's an example of how it works. +00:16:53.440 --> 00:16:58.439 +Here we define the class Vector, -16:56.400 --> 00:17:03.001 -We define a class vector with some meta methods. +00:16:58.440 --> 00:17:02.719 +with some metamethods... -00:17:03.002 --> 00:17:06.294 -This meta method here will tell Lua +00:17:02.720 --> 00:17:05.959 +this metamethod here will tell Lua -00:17:06.295 --> 00:17:10.867 -what to do when the user asks to add two vectors. +00:17:05.960 --> 00:17:08.319 +what to do when the -00:17:10.868 --> 00:17:13.986 -This one here tells Lua what to do +00:17:08.320 --> 00:17:12.639 +user asks to add two vectors, this one -00:17:13.987 --> 00:17:18.888 -when the user asks Lua to convert a vector to a string +00:17:12.640 --> 00:17:15.919 +here tells Lua what to do when the user -00:17:18.889 --> 00:17:22.007 -and whatever. This one is something +00:17:15.920 --> 00:17:18.479 +asks Lua to convert a vector to a string, -00:17:22.008 --> 00:17:25.580 -that I'm going to explain in a second. +00:17:18.480 --> 00:17:21.439 +and... whatever, this one is -17:25.580 --> 00:17:25.580 -Here we create a vector +00:17:21.440 --> 00:17:24.039 +something that I'm going to explain in a -00:17:25.580 --> 00:17:25.580 -with these coordinates 3 and 4. +00:17:24.040 --> 00:17:27.479 +second. So, here we create a vector with -00:17:25.581 --> 00:17:25.580 -Here we create another vector. +00:17:27.480 --> 00:17:30.279 +these coordinates, 3 and 4... here we create -17:31.600 --> 00:17:33.030 -If we print here, +00:17:30.280 --> 00:17:33.319 +another Vector... if we "print" here then Lua -00:17:33.031 --> 00:17:37.153 -then Lua uses the function here in the `__tostring`. +00:17:33.320 --> 00:17:36.439 +uses this function here, in the __tostring... -00:17:37.154 --> 00:17:38.907 -If we add two vectors +00:17:36.440 --> 00:17:39.759 +if we add the two vectors it uses this -00:17:38.908 --> 00:17:42.653 -it uses the function here in the `__add` meta method. +00:17:39.760 --> 00:17:43.479 +function here, in the __add metamethod, and -00:17:42.654 --> 00:17:45.044 -If we run the method `norm`, +00:17:43.480 --> 00:17:45.359 +if we run the method :norm... -00:17:45.045 --> 00:17:51.680 -it is defined here in the table index. +00:17:45.360 --> 00:17:49.959 +it is defined here, in the table __index. -17:51.680 --> 00:17:57.675 -Anyway, even with this thing being so small, +00:17:49.960 --> 00:17:57.999 +Anyway... -00:17:57.676 --> 00:18:04.617 -I used to forget how it works all the time. +00:17:58.000 --> 00:18:02.439 +Even this thing being so small I used -00:18:04.618 --> 00:18:08.200 -Actually, I always forget how things work, +00:18:02.440 --> 00:18:04.719 +to forget how its innards worked all -00:18:08.201 --> 00:18:11.347 -and I have to remember them somehow. +00:18:04.720 --> 00:18:08.119 +the time. Actually I always forget how -00:18:11.348 --> 00:18:14.920 -I have to have tricks for remembering, +00:18:08.120 --> 00:18:09.759 +things work and I have to remember them -00:18:14.921 --> 00:18:19.769 -and tricks for summarizing things and diagrams, and so on. +00:18:09.760 --> 00:18:12.479 +somehow... and I have to have -00:18:19.770 --> 00:18:23.309 -Every time that I forgot how this thing worked, +00:18:12.480 --> 00:18:15.959 +tricks for remembering, and tricks for -00:18:23.310 --> 00:18:25.460 -I went back to the source code +00:18:15.960 --> 00:18:18.719 +summarizing things, and diagrams, and so -00:18:25.461 --> 00:18:28.148 -and then I looked at the diagrams, +00:18:18.720 --> 00:18:22.199 +on. And every time that I forgot how this -00:18:28.149 --> 00:18:30.994 -or, of course, the first time, +00:18:22.200 --> 00:18:24.799 +thing worked I went back to the -00:18:30.995 --> 00:18:33.800 -I had to draw the diagrams. I run the examples. +00:18:24.800 --> 00:18:26.879 +source code, and then I looked at the -00:18:33.801 --> 00:18:35.539 -Of course, in the beginning +00:18:26.880 --> 00:18:29.039 +diagrams... or, of course, in the -00:18:35.540 --> 00:18:37.503 -I thought that the code was clear. +00:18:29.040 --> 00:18:31.719 +first times I had to draw the diagrams... -00:18:37.504 --> 00:18:39.737 -My examples were very brief. +00:18:31.720 --> 00:18:35.239 +and I run the examples, and of course in -00:18:39.738 --> 00:18:43.565 -So I had to rewrite the examples many times +00:18:35.240 --> 00:18:36.479 +in the beginning I thought that the code -00:18:43.566 --> 00:18:50.880 -until they became let's say perfect. +00:18:36.480 --> 00:18:39.119 +was clear and my examples were very -18:50.880 --> 00:18:54.090 -I was saying that Lua can be used in many ways +00:18:39.120 --> 00:18:41.559 +brief, and so I had to rewrite the -00:18:54.091 --> 00:18:58.403 -and in my way of using Lua, in my favorite way, +00:18:41.560 --> 00:18:44.719 +examples many times until they became, -00:18:58.404 --> 00:19:03.075 -everything can be inspected and modified from REPLs +00:18:44.720 --> 00:18:45.639 +let's say... -00:19:03.076 --> 00:19:06.817 -like we can do in Emacs and in SmallTalk, sort of. +00:18:45.640 --> 00:18:47.759 +perfect. -00:19:06.818 --> 00:19:09.436 -In my favorite way of using Lua +00:18:47.760 --> 00:18:52.599 +I was saying that Lua can be used in -00:19:09.437 --> 00:19:11.531 -there's no security at all. +00:18:52.600 --> 00:18:56.359 +many ways, and in my way of using Lua - in -00:19:11.532 --> 00:19:17.460 -Everything can be changed at all times. +00:18:56.360 --> 00:18:59.439 +my favorite way - everything can be -19:17.460 --> 00:19:19.822 -Of course, most people hate that. +00:18:59.440 --> 00:19:02.159 +inspected and modified from REPLs, + +00:19:02.160 --> 00:19:06.319 +like we can do in Emacs and in SmallTalk, + +00:19:06.320 --> 00:19:08.519 +or sort of. So, in my + +00:19:08.520 --> 00:19:10.239 +favorite way of using Lua there's no + +00:19:10.240 --> 00:19:12.679 +security at all, everything can be + +00:19:12.680 --> 00:19:14.919 +changed at all times. + +00:19:14.920 --> 00:19:19.119 +Of course most people hate that... NOTE My init file -00:19:19.823 --> 00:19:22.185 -My init file has lots of classes, +00:19:19.120 --> 00:19:22.599 +My init file has lots of classes... by the -00:19:22.186 --> 00:19:24.701 -and by the way, instead of +00:19:22.600 --> 00:19:26.079 +way, instead of keeping many small files -00:19:24.702 --> 00:19:28.636 -keeping many small files with many things, +00:19:26.080 --> 00:19:29.639 +with many things I put lots of stuff -00:19:28.637 --> 00:19:33.000 -I put lots of stuff in just one big init file. +00:19:29.640 --> 00:19:31.279 +in just one big init file. -19:33.000 --> 00:19:35.520 +00:19:31.280 --> 00:19:34.599 My init file has lots of classes, -00:19:35.521 --> 00:19:39.187 -and lots of global functions and lots of cruft, +00:19:34.600 --> 00:19:37.959 +and lots of global functions, and + +00:19:37.960 --> 00:19:41.799 +lots of cruft - and people hate that, + +00:19:41.800 --> 00:19:44.559 +of course. This is an example... + +00:19:44.560 --> 00:19:46.439 +this is the index at the top + +00:19:46.440 --> 00:19:48.359 +of my init file, -00:19:39.188 --> 00:19:43.700 -so people hate that, of course. +00:19:48.360 --> 00:19:53.119 +the classes start here, and then -19:43.700 --> 00:19:46.340 -This is an example. +00:19:53.120 --> 00:19:59.119 +we have some functions, and -00:19:46.341 --> 00:19:52.415 -This is the index at the top of my init file. +00:19:59.120 --> 00:20:01.199 +then we have functions that load -00:19:52.416 --> 00:19:57.541 -The classes start here. Then we have some functions +00:20:01.200 --> 00:20:03.839 +certain packages, and then we have... cruft. -00:19:57.542 --> 00:20:02.480 -and then we have functions that load certain packages, +00:20:03.840 --> 00:20:04.919 +Whatever. -20:02.480 --> 20:06.580 -and then we have cruft, whatever. +00:20:04.920 --> 00:20:08.119 +Most people think that my style -20:06.580 --> 00:20:08.923 -Most people think that my style of using Lua +00:20:08.120 --> 00:20:10.279 +of using Lua is dirty, and dangerous... -00:20:08.924 --> 00:20:10.122 -is dirty and dangerous, +00:20:10.280 --> 00:20:12.959 +and they wouldn't touch my Lua code -00:20:10.123 --> 00:20:14.287 -and they wouldn't touch my Lua code with a 10 feet pole, +00:20:12.960 --> 00:20:15.479 +with a 10 feet pole... but most of the -00:20:14.288 --> 00:20:15.968 -but most of the things +00:20:15.480 --> 00:20:18.599 +things that I'm going to present here in -00:20:15.969 --> 00:20:19.256 -that I'm going to present here in this presentation +00:20:18.600 --> 00:20:23.199 +this presentation are ideas that should -00:20:19.257 --> 00:20:23.050 -are ideas that should be easy to port to other environments +00:20:23.200 --> 00:20:28.159 +be easy to port to other environments -00:20:23.051 --> 00:20:27.738 -and other languages, especially the diagrams, +00:20:28.160 --> 00:20:32.279 +and other languages, especially the -00:20:27.739 --> 00:20:31.000 -so the code is not so important. +00:20:32.280 --> 00:20:35.279 +diagrams... so the code is not so important. NOTE LaTeX and LuaLaTeX -20:31.000 --> 00:20:34.640 -Now let me talk a bit about LaTeX, LuaLaTeX, +00:20:35.280 --> 00:20:39.039 +Now let me talk a bit about LuaLaTeX, + +00:20:39.040 --> 00:20:41.359 +that is LaTeX with a Lua interpreter + +00:20:41.360 --> 00:20:44.559 +embedded inside, and two ways + +00:20:44.560 --> 00:20:48.839 +of generating pictures in LaTeX: TikZ, + +00:20:48.840 --> 00:20:54.439 +that is very famous, and Pict2e, that is not + +00:20:54.440 --> 00:20:57.359 +very famous and that is very low level... + +00:20:57.360 --> 00:21:02.359 +and I think that not many people use it. + +00:21:02.360 --> 00:21:04.119 +I said before that when I + +00:21:04.120 --> 00:21:06.919 +learned Lua I realized that it was + +00:21:06.920 --> 00:21:09.199 +very good for writing little + +00:21:09.200 --> 00:21:14.919 +languages. I was doing my PhD at the + +00:21:14.920 --> 00:21:19.839 +time and typesetting the diagrams for -00:20:34.641 --> 00:20:39.249 -that is LaTeX with the Lua interpreter embedded inside +00:21:19.840 --> 00:21:24.039 +my PhD thesis was very boring, so -00:20:39.250 --> 00:20:43.182 -and two ways of generating pictures in LaTeX: +00:21:24.040 --> 00:21:29.879 +one of the things that I did was that I -00:20:43.183 --> 00:20:45.115 -TikZ that is very famous, +00:21:29.880 --> 00:21:34.439 +created a little language for typesetting -00:20:45.116 --> 00:20:48.311 -and Pict2e that is not very famous +00:21:34.440 --> 00:21:36.359 +the diagrams for me. it was -00:20:48.312 --> 00:20:50.644 -and that is very low level, +00:21:36.360 --> 00:21:38.879 +called Dednat because initially -00:20:50.645 --> 00:20:53.840 -and I think that not many people use. +00:21:38.880 --> 00:21:41.039 +it only generated diagrams for -20:53.840 --> 00:20:57.048 -I said before that when I learned Lua, +00:21:41.040 --> 00:21:43.759 +Natural Deduction, and then it had -00:20:57.049 --> 00:21:00.354 -I realized that it was very good +00:21:43.760 --> 00:21:45.119 +several versions... -00:21:00.355 --> 00:21:03.360 -for writing literal languages. +00:21:45.120 --> 00:21:46.679 +these are the slides for my -21:03.360 --> 00:21:05.986 -I was doing my PhD at the time +00:21:46.680 --> 00:21:52.159 +presentation about Dednat6... "Dednat6 is -00:21:05.987 --> 00:21:09.969 -and typesetting the diagrams for my PhD thesis +00:21:52.160 --> 00:21:56.159 +an extensible semi-preprocessor for -00:21:09.970 --> 00:21:11.240 -was very boring. +00:21:56.160 --> 00:22:01.159 +LuaLaTeX that understands diagrams in -21:11.240 --> 00:21:13.864 -One of the things that I did was that +00:22:01.160 --> 00:22:05.359 +ASCII art"... in the sense that when I have -00:21:13.865 --> 00:21:15.720 -I created a literal language +00:22:05.360 --> 00:22:11.399 +a .tex file that has this, and when -00:21:15.721 --> 00:21:19.340 -for typesetting the diagrams for me. +00:22:11.400 --> 00:22:13.279 +Dednat6 is loaded, -21:19.340 --> 00:21:22.821 -It was called Dednat because initially +00:22:13.280 --> 00:22:15.039 +when I give the right commands -00:21:22.822 --> 00:21:26.800 -it only generated diagrams for natural deduction +00:22:15.040 --> 00:22:19.559 +Dednat6 interprets this block here as -21:26.800 --> 21:30.440 -and then it had several versions. +00:22:19.560 --> 00:22:22.559 +something that defines this -21:30.440 --> 00:21:34.379 -These are the slides from my presentation about Dednat6 +00:22:22.560 --> 00:22:28.239 +diagram... oops, sorry, it interprets this -00:21:34.380 --> 00:21:38.990 -and Dednat6 is an extensible semi preprocessor +00:22:28.240 --> 00:22:30.599 +diagram here, this diagram in -00:21:38.991 --> 00:21:43.691 -for LuaLaTeX that understands diagrams in ASCII art +00:22:30.600 --> 00:22:34.879 +comments here, as something that defines -00:21:43.692 --> 00:21:49.034 -in the sense that when I have a TeX file that has this, +00:22:34.880 --> 00:22:39.759 +a diagram called foo... a deduction called -00:21:49.035 --> 00:21:52.143 -and when Dednat6 is loaded, +00:22:39.760 --> 00:22:41.439 +foo, and it generates this code here... -00:21:52.144 --> 00:21:55.708 -when I get the right comments, +00:22:41.440 --> 00:22:44.239 +so that we can just invoke -00:21:55.709 --> 00:22:00.342 -Dednat6 interprets this block here +00:22:44.240 --> 00:22:45.519 +the definition of the -00:22:00.343 --> 00:22:05.095 -as something that defines this diagram. +00:22:45.520 --> 00:22:47.719 +deduction by typing \ded{foo}. -00:22:05.096 --> 00:22:07.828 -It interprets this diagram here, +00:22:47.720 --> 00:22:50.759 +And Dednat6 also -00:22:07.829 --> 00:22:10.643 -this diagram in the comments here, +00:22:50.760 --> 00:22:57.159 +supports another language for typesetting -00:22:10.644 --> 00:22:16.432 -as something that defines a diagram called `foo`, +00:22:57.160 --> 00:22:59.639 +bidimensional diagrams with -00:22:16.433 --> 00:22:23.064 -a deduction called `foo`, and it generates this code here +00:22:59.640 --> 00:23:05.399 +arrows and stuff for category Theory and -00:22:23.065 --> 00:22:28.867 -so that we can just invoke the definition of the deduction +00:23:05.400 --> 00:23:08.519 +blah blah blah... the specifications of -00:22:28.868 --> 00:22:31.720 -by typing `\ded{foo}`. +00:23:08.520 --> 00:23:12.039 +these diagrams look like this... -22:31.720 --> 00:22:36.148 -Dednat6 also supports another language +00:23:12.040 --> 00:23:14.559 +here is a... sorry, here is a very good -00:22:36.149 --> 00:22:40.579 -for typesetting bidimensional diagrams with arrows and stuff +00:23:14.560 --> 00:23:16.719 +example, this is a huge diagram... -00:22:40.580 --> 00:22:43.122 -for category theory and blah blah. +00:23:16.720 --> 00:23:18.599 +sorry, one second... -00:22:43.123 --> 00:22:46.100 -The specifications of these diagrams +00:23:18.600 --> 00:23:20.399 +so, the source code that generates -22:46.100 --> 00:22:53.865 -look like this. Here is a very good example. +00:23:20.400 --> 00:23:25.119 +this diagram here is just this thing at -00:22:53.866 --> 00:23:00.940 -This is a huge diagram. Sorry, one second. +00:23:25.120 --> 00:23:32.039 +the left, so it's very visual... we can -23:00.940 --> 00:23:04.757 -So the source code that generates this diagram here +00:23:32.040 --> 00:23:35.679 +typeset the diagram in ASCII art here and -00:23:04.758 --> 00:23:08.628 -is just this thing at the left. It's very visual. +00:23:35.680 --> 00:23:38.759 +then in this part here we tell how -00:23:08.629 --> 00:23:11.842 -We can typeset the diagram in ASCII art here. +00:23:38.760 --> 00:23:41.279 +the nodes are to be joined, which -00:23:11.843 --> 00:23:14.434 -Then in this part here, +00:23:41.280 --> 00:23:43.799 +arrows have to to have annotations, and -00:23:14.435 --> 00:23:18.273 -we tell how the nodes are to be joined, +00:23:43.800 --> 00:23:45.039 +so on... -00:23:18.274 --> 00:23:22.880 -which arrows have to have annotations, and so on. +00:23:45.040 --> 00:23:46.799 +and this language is extensible in -23:22.880 --> 00:23:30.950 -This language is extensible in the sense that +00:23:46.800 --> 00:23:48.679 +the sense that... uh, where's that... -00:23:30.951 --> 00:23:37.280 -here, comments that start +00:23:48.680 --> 00:23:52.559 +here: comments that start with "%:" -23:37.280 --> 00:23:42.690 -with `%:` are interpreted as definitions +00:23:52.560 --> 00:23:54.119 +are interpreted as -00:23:42.691 --> 00:23:44.819 -for tree diagrams, +00:23:54.120 --> 00:23:56.079 +definitions for tree diagrams, -00:23:44.820 --> 00:23:49.394 -lines that start with `%D` +00:23:56.080 --> 00:23:58.559 +lines that start with "%D" -00:23:49.395 --> 00:23:53.761 -define 2D diagrams with arrows and stuff, +00:23:58.560 --> 00:24:00.639 +define 2D diagrams with arrows and -00:23:53.762 --> 00:23:57.683 -and lines that start with command `%L` +00:24:00.640 --> 00:24:04.279 +stuff, and lines that start with "%L" -00:23:57.684 --> 00:24:01.197 -contain blocks of Lua code that we can use +00:24:04.280 --> 00:24:06.759 +contain blocks of Lua code -00:24:01.198 --> 00:24:05.527 -to extend the interpreter on the flag. +00:24:06.760 --> 00:24:09.479 +that we can use to extend the interpreter -00:24:05.528 --> 00:24:09.746 -Anyway, here are some recent examples +00:24:09.480 --> 00:24:10.439 +on-the-fly... -00:24:09.747 --> 00:24:16.146 -of diagrams that I used Dednat6 to typeset. +00:24:10.440 --> 00:24:12.679 +anyway, here are some recent -00:24:16.147 --> 00:24:24.494 -This diagram here was generated by this specification here, +00:24:12.680 --> 00:24:15.319 +examples of diagrams that I used -00:24:24.495 --> 00:24:30.619 -and this diagram here with the curved arrows +00:24:15.320 --> 00:24:19.839 +Dednat6 to typeset... this diagram -00:24:30.620 --> 00:24:36.200 -was generated by this specification here. +00:24:19.840 --> 00:24:21.919 +here was generated by this -24:36.200 --> 00:24:39.174 -Dednat6 was very easy to extend. +00:24:21.920 --> 00:24:22.879 +specification here... -00:24:39.175 --> 00:24:43.043 -At some point I started to use it to generate diagrams +00:24:22.880 --> 00:24:27.239 +and this diagram here with the -00:24:43.044 --> 00:24:46.067 -using Pict2e, mainly for the classes +00:24:27.240 --> 00:24:30.719 +curved arrows was generated by this -00:24:46.068 --> 00:24:49.673 -that I give at the university, +00:24:30.720 --> 00:24:32.719 +specification here. -00:24:49.674 --> 00:24:53.861 -I teach mathematics in a place. +00:24:32.720 --> 00:24:39.079 +So, Dednat6 was very easy to extend, -00:24:53.862 --> 00:24:58.979 -Let me show an animation. Here is a diagram +00:24:39.080 --> 00:24:41.879 +and at some point I started to use it -00:24:58.980 --> 00:25:02.325 -that I generated with Dednat6. +00:24:41.880 --> 00:24:44.679 +to generate diagrams using Pict2e - -00:25:02.326 --> 00:25:05.385 -It is a flipbook animation, +00:24:44.680 --> 00:24:47.359 +mainly for the classes that I give -00:25:05.386 --> 00:25:08.253 -we type page up and page down, +00:24:47.360 --> 00:24:50.079 +at the University... I teach mathematics and -00:25:08.254 --> 00:25:10.783 -and we go to the next page of the book +00:24:50.080 --> 00:24:57.239 +whatever... in a bad place. Whatever... -00:25:10.784 --> 00:25:13.248 -and to the previous page of the book. +00:24:57.240 --> 00:25:00.039 +Let me show an animation... here is a -00:25:13.249 --> 00:25:16.924 -Here is the source code that generates that. +00:25:00.040 --> 00:25:02.479 +diagram that I generated with Dednat6, -00:25:16.925 --> 00:25:19.700 -This source code is not very visual, +00:25:02.480 --> 00:25:06.319 +and it is a flip book animation, like... we -00:25:19.701 --> 00:25:21.800 -so it's quite clumsy to edit +00:25:06.320 --> 00:25:09.279 +type PgUp and PgDn and we go -25:21.800 --> 25:28.280 -a diagram directly in the TeX file like that. +00:25:09.280 --> 00:25:11.119 +to the next page of the book and to the + +00:25:11.120 --> 00:25:12.439 +previous page of the book... + +00:25:12.440 --> 00:25:16.279 +and here is the source code that generates + +00:25:16.280 --> 00:25:19.159 +that. This source code is not very visual, + +00:25:19.160 --> 00:25:22.559 +so it's quite clumsy to edit that + +00:25:22.560 --> 00:25:27.519 +diagram directly in the .tex file like + +00:25:27.520 --> 00:25:28.079 +that... NOTE Manim -25:28.280 --> 00:25:33.437 -These diagrams were inspired by something called Manim. +00:25:28.080 --> 00:25:30.199 +These diagrams were inspired -00:25:33.438 --> 00:25:36.713 -I've forgotten the name of the guy, but it's a guy +00:25:30.200 --> 00:25:33.039 +by something called my Manim, that... -00:25:36.714 --> 00:25:39.346 -that makes many videos about mathematics, +00:25:33.040 --> 00:25:37.559 +I forgot the name of the guy, but -00:25:39.347 --> 00:25:43.373 -and he created this library called Manim +00:25:37.560 --> 00:25:41.479 +it's a guy that makes many videos about -00:25:43.374 --> 00:25:46.417 -for generating his animations. +00:25:41.480 --> 00:25:44.839 +Mathematics, and he created this library -00:25:46.418 --> 00:25:52.083 -Other people adapted his library to make it more accessible. +00:25:44.840 --> 00:25:48.599 +called Manim for generating his -00:25:52.084 --> 00:25:55.799 -I tried to learn it, but each animation, +00:25:48.600 --> 00:25:51.839 +animations, and other people adapted -00:25:55.800 --> 00:25:59.191 -even an animation with very few frames, +00:25:51.840 --> 00:25:55.919 +his library to make it more accessible... -00:25:59.192 --> 00:26:03.770 -each animation took ages to render, so it wasn't fun. +00:25:55.920 --> 00:25:59.359 +I tried to learn it, but -00:26:03.771 --> 00:26:08.345 -Animations and PDFs can be rendered in seconds, +00:25:59.360 --> 00:26:01.199 +each animation, even an animation -00:26:08.346 --> 00:26:11.160 -so these things were fun for me +00:26:01.200 --> 00:26:03.679 +that has very few frames... each -00:26:11.161 --> 00:26:17.440 -because my laptop is very slow and Manim was not fun. +00:26:03.680 --> 00:26:07.319 +animation took ages to render, so it -26:17.440 --> 00:26:24.263 -Anyway, writing code like this inside a TeX file +00:26:07.320 --> 00:26:11.159 +wasn't fun... and animations in PDFs can -00:26:24.264 --> 00:26:30.879 -was not very fun because it was hard to debug. +00:26:11.160 --> 00:26:13.639 +be rendered in seconds. So these + +00:26:13.640 --> 00:26:18.679 +things were fun for me, because my laptop + +00:26:18.680 --> 00:26:24.359 +is very very slow, and my Manim was not fun. NOTE Generating diagrams from REPLs -00:26:30.880 --> 00:26:36.510 -In 2022, I started to play with ways +00:26:24.360 --> 00:26:27.359 +Anyway, writing code like this + +00:26:27.360 --> 00:26:32.719 +inside a .tex file was not very + +00:26:32.720 --> 00:26:35.519 +fun because it was hard to + +00:26:35.520 --> 00:26:38.719 +debug... so in 2022 I started to play -00:26:36.511 --> 00:26:42.000 -of generating these diagrams from REPLs +00:26:38.720 --> 00:26:41.319 +with ways of generating these -26:42.000 --> 00:26:46.309 -and I found a way for Pict2e and a way for Tikz. +00:26:41.320 --> 00:26:43.839 +diagrams from REPLs, and I found a -00:26:46.310 --> 00:26:49.520 -Each one of these ways became a video. +00:26:43.840 --> 00:26:47.319 +way for Pict2e and a way for TikZ... -26:49.520 --> 00:26:53.220 -If you go to the list of first class videos of eev, +00:26:47.320 --> 00:26:50.159 +each one of these ways became a video... -00:26:53.221 --> 00:26:55.088 -you're going to see +00:26:50.160 --> 00:26:53.679 +if you go to the list of first-class -00:26:55.089 --> 00:26:59.010 +00:26:53.680 --> 00:26:57.719 +videos of eev you're going to see + +00:26:57.720 --> 00:26:59.919 that there's a video about Pict2e here -00:26:59.011 --> 00:27:01.158 -and a video about Tikz. +00:26:59.920 --> 00:27:03.399 +here and a video about TikZ... + +00:27:03.400 --> 00:27:05.759 +here you have some some information + +00:27:05.760 --> 00:27:09.839 +like length, an explanation, etc... + +00:27:09.840 --> 00:27:11.719 +and here are the pages for these videos. + +00:27:11.720 --> 00:27:15.999 +My page about the video about Pict2e + +00:27:16.000 --> 00:27:20.079 +looks like this, it has some diagrams... + +00:27:20.080 --> 00:27:23.919 +whatever... and this one is much + +00:27:23.920 --> 00:27:26.679 +nicer, and a lot of people + +00:27:26.680 --> 00:27:30.599 +watched that video... I mean, I think + +00:27:30.600 --> 00:27:33.719 +that 250 people watched it - for me that's + +00:27:33.720 --> 00:27:35.599 +a million of people... -00:27:01.159 --> 00:27:04.187 -Here you have some information +00:27:35.600 --> 00:27:39.159 +and this video is about how to -00:27:04.188 --> 00:27:07.508 -like length and explanation, etc. +00:27:39.160 --> 00:27:44.079 +extract diagrams from the manual... from -00:27:07.509 --> 00:27:11.513 -Here are the pages for these videos. +00:27:44.080 --> 00:27:46.599 +the TikZ manual and how to run those -00:27:11.514 --> 00:27:15.991 -My page about the video about Pict2e is like this. +00:27:46.600 --> 00:27:49.759 +examples in a REPL and modify -00:27:15.992 --> 00:27:20.800 -It has some diagrams. This one is much nicer. +00:27:49.760 --> 00:27:53.159 +them bit by bit... this is a a -27:20.800 --> 00:27:26.605 -A lot of people watched that video. I mean, +00:27:53.160 --> 00:27:57.439 +screenshot... but let me go back. -00:27:26.606 --> 00:27:31.080 -I thought that 250 people watched it. +00:27:57.440 --> 00:28:00.959 +At that point these things were just -27:31.080 --> 00:27:35.344 -For me, that's a million of people. +00:28:00.960 --> 00:28:03.239 +prototypes, the code was not very nice... -00:27:35.345 --> 00:27:40.402 -This video is about how to extract diagrams +00:28:03.240 --> 00:28:07.519 +and in this year I wrote... I was able -00:27:40.403 --> 00:27:46.512 -from the Tikz manual, and how to run those examples in REPL +00:28:07.520 --> 00:28:12.399 +to unify those two ways of generating PDFs, -00:27:46.513 --> 00:27:52.936 -and modify them bit by bit. This is a screenshot. +00:28:12.400 --> 00:28:16.039 +the one for TikZ and the one for Pict2e, -00:27:52.937 --> 00:27:57.432 -Let me go back. At that point, +00:28:16.040 --> 00:28:18.719 +and I unified them with many other -00:27:57.433 --> 00:28:01.800 -these things were just prototypes, +00:28:18.720 --> 00:28:20.879 +things that generated diagrams. -28:01.800 --> 00:28:04.803 -the code was not very nice, +00:28:20.880 --> 00:28:24.279 +The basis of these things is -00:28:04.804 --> 00:28:07.592 -and in this year I wrote... +00:28:24.280 --> 00:28:29.319 +something called Show2.lua... I'm not going -00:28:07.593 --> 00:28:12.123 -I was able to unify those two ways of generating PDFs, +00:28:29.320 --> 00:28:35.759 +to show its details now, but its -00:28:12.124 --> 00:28:15.665 -the one for Tikz and the one for Pict2e. +00:28:35.760 --> 00:28:39.079 +extension that generates TikZ code -00:28:15.666 --> 00:28:19.196 -I unified them with many other things +00:28:39.080 --> 00:28:43.039 +is just this, so we can specify a -00:28:19.197 --> 00:28:21.298 -that generated diagrams. +00:28:43.040 --> 00:28:45.799 +diagram with just a block like this, -00:28:21.299 --> 00:28:28.430 -The basis of these things is something called Show2.lua. +00:28:45.800 --> 00:28:49.079 +and then uh if we -00:28:28.431 --> 00:28:33.935 -I'm not going to just show its details now, +00:28:49.080 --> 00:28:54.239 +run :show00() it returns a string -00:28:33.936 --> 00:28:38.775 -but it's an extension that generates Tikz code. +00:28:54.240 --> 00:28:56.199 +that is just the body... the inner -00:28:38.776 --> 00:28:43.305 -It's just this. We can specify a diagram +00:28:56.200 --> 00:29:00.279 +body of the .tex file, if we run this we -00:28:43.306 --> 00:28:50.538 -with just a block like this, and then if we run `show00`, +00:29:00.280 --> 00:29:02.999 +see the whole .tex file, and if we run -00:28:50.539 --> 00:28:53.694 -it returns a string +00:29:03.000 --> 00:29:05.119 +this we save the .tex file and we -00:28:53.695 --> 00:28:59.480 -that is just the inner body of the TeX file. +00:29:05.120 --> 00:29:08.119 +compile the .tex file to generate a PDF... -28:59.480 --> 00:29:02.306 -If we run this, we see the whole TeX file. +00:29:08.120 --> 00:29:10.959 +and if we run this we show the PDF in -00:29:02.307 --> 00:29:05.200 -If we run this we save the TeX file and +00:29:10.960 --> 00:29:14.239 +the lower right window. -29:05.200 --> 00:29:09.196 -we compile the TeX file to generate a PDF. +00:29:14.240 --> 00:29:17.759 +And that's the same thing for all -00:29:09.197 --> 00:29:12.557 -If we run this, we show the PDF +00:29:17.760 --> 00:29:20.199 +my recent programs that generate -00:29:12.558 --> 00:29:15.078 -in the lower right window. +00:29:20.200 --> 00:29:22.439 +PDFs - they are all -00:29:15.079 --> 00:29:20.026 -That's the same thing for all my recent programs +00:29:22.440 --> 00:29:26.199 +integrated... here is the one that... -00:29:20.027 --> 00:29:23.810 -that generate PDFs. They are all integrated. +00:29:26.200 --> 00:29:29.359 +the basis for all my modules that generate -00:29:23.811 --> 00:29:28.267 -Here is the basis for all my modules +00:29:29.360 --> 00:29:30.719 +diagrams with Pict2e... -00:29:28.268 --> 00:29:31.423 -that generate diagrams with Pict2e. +00:29:30.720 --> 00:29:34.879 +its demos are not very interesting, -00:29:31.424 --> 00:29:34.337 -Its demos are not very interesting. +00:29:34.880 --> 00:29:36.799 +so let me show some demos of -00:29:34.338 --> 00:29:38.556 -Let me show some demos of extensions +00:29:36.800 --> 00:29:39.759 +extensions that do interesting things... -00:29:38.557 --> 00:29:43.723 -that do interesting things. This is a diagram +00:29:39.760 --> 00:29:45.319 +so, this is a diagram that I created -00:29:43.724 --> 00:29:47.901 -that I created by editing it in a REPL, +00:29:45.320 --> 00:29:47.479 +by editing it in a REPL... -00:29:47.902 --> 00:29:51.871 -I create several Pict objects here. +00:29:47.480 --> 00:29:51.279 +I create several Pict objects here... -00:29:51.872 --> 00:29:57.818 -If I execute this, it compiles the object and +00:29:51.280 --> 00:29:54.479 +and if I execute this it -00:29:57.819 --> 00:30:04.523 -generates a PDF. If I tap this, here is the PDF. +00:29:54.480 --> 00:29:59.959 +compiles an object, generates a PDF, and -00:30:04.524 --> 00:30:10.919 -If I just ask Lua to display what is pux here, +00:29:59.960 --> 00:30:04.759 +if I tap this... here is the PDF. -00:30:10.920 --> 00:30:17.435 -it shows the source code in Pict2e of the diagram. +00:30:04.760 --> 00:30:07.599 +And if I just ask Lua to -00:30:17.436 --> 00:30:20.932 -The nice thing is that it is indented, +00:30:07.600 --> 00:30:10.079 +display what is "pux", here, -00:30:20.933 --> 00:30:24.348 -so it's easy to debug the Pict2e code. +00:30:10.080 --> 00:30:15.719 +it shows the source code in Pict2e -00:30:24.349 --> 00:30:28.504 -If anyone is interested, the module that does the tricks +00:30:15.720 --> 00:30:17.999 +of the diagram... and the -00:30:28.505 --> 00:30:31.947 -for indentation is very easy to understand. +00:30:18.000 --> 00:30:20.959 +nice thing is that it is indented, so -00:30:31.948 --> 00:30:34.920 +00:30:20.960 --> 00:30:23.599 +it's easy to debug the Pict2e code. + +00:30:23.600 --> 00:30:25.919 +If anyone is interested the + +00:30:25.920 --> 00:30:28.639 +module that does the tricks for + +00:30:28.640 --> 00:30:31.879 +indentation is very easy to understand... + +00:30:31.880 --> 00:30:35.959 it has lots of tests and test blocks, -00:30:34.921 --> 00:30:47.438 -and I think that its data structures are easy to understand. +00:30:35.960 --> 00:30:38.599 +and I think that its data + +00:30:38.600 --> 00:30:42.079 +structures are easy to understand. + +00:30:42.080 --> 00:30:44.359 +Anyway... here is another -00:30:47.439 --> 00:30:57.904 -Anyway, here is another example, the show is here. +00:30:44.360 --> 00:30:51.359 +example. The :show() is -00:30:57.905 --> 00:31:03.240 -It generates a 3D diagram. +00:30:51.360 --> 00:30:56.439 +here... it generates a 3D diagram. NOTE Parsers -31:03.240 --> 00:31:05.897 -Now let me talk about parsers +00:30:56.440 --> 00:31:06.279 +Now let me talk about parsers and -00:31:05.898 --> 00:31:08.997 -and REPLs in a very strange place. +00:31:06.280 --> 00:31:09.559 +REPLs in VERY strange places... I mean, -00:31:08.998 --> 00:31:15.148 -I mean, using REPLs to build parsers step by step +00:31:09.560 --> 00:31:13.359 +using REPLs to build parsers step by step -00:31:15.149 --> 00:31:20.438 -and replacing parts by more complex parts. +00:31:13.360 --> 00:31:17.959 +and" replacing parts by more complex -00:31:20.439 --> 00:31:24.492 -I said that Lua is very minimalistic, +00:31:17.960 --> 00:31:23.039 +parts. So, I said that Lua is very -00:31:24.493 --> 00:31:26.964 -and everybody knows that +00:31:23.040 --> 00:31:28.279 +minimalistic, and everybody knows that -00:31:26.965 --> 00:31:30.720 +00:31:28.280 --> 00:31:30.759 implementations of regular expressions -31:30.720 --> 00:31:33.973 -are big and complex. So instead of coming +00:31:30.760 --> 00:31:32.479 +are big and complex.. + +00:31:32.480 --> 00:31:34.679 +so, instead of coming with + +00:31:34.680 --> 00:31:37.439 +full regular expressions Lua comes with + +00:31:37.440 --> 00:31:39.879 +something called "patterns" and a + +00:31:39.880 --> 00:31:43.839 +library function called "string.match". + +00:31:43.840 --> 00:31:44.599 +Here is + +00:31:44.600 --> 00:31:50.319 +a copy of the part of the manual that + +00:31:50.320 --> 00:31:53.399 +explains the syntax... a part of the + +00:31:53.400 --> 00:31:57.159 +syntax of of patterns... here's how + +00:31:57.160 --> 00:31:59.279 +string.match is described in the + +00:31:59.280 --> 00:32:03.199 +manual - it's just this... "looks for + +00:32:03.200 --> 00:32:05.359 +the first match of pattern in the string + +00:32:05.360 --> 00:32:08.039 +as blah blah blah"... and then we have to + +00:32:08.040 --> 00:32:10.159 +go to the other section of the menual + +00:32:10.160 --> 00:32:11.479 +that explains patterns. + +00:32:11.480 --> 00:32:20.079 +Lua patterns are so simple, + +00:32:20.080 --> 00:32:23.159 +so limited, that they don't even -00:31:33.974 --> 00:31:36.375 -with full regular expressions, +00:32:23.160 --> 00:32:26.519 +have the the alternation operator... -00:31:36.376 --> 00:31:41.320 -Lua comes with something called patterns +00:32:26.520 --> 00:32:29.759 +here is how it is described in the -00:31:41.321 --> 00:31:46.627 -and a library function called string.match. +00:32:29.760 --> 00:32:31.599 +elisp manual - -00:31:46.628 --> 00:31:50.820 -Here is a copy of the part of the manual +00:32:31.600 --> 00:32:36.039 +backslash-pipe specifies -00:31:50.821 --> 00:31:55.728 -that explains a part of the syntax of patterns. +00:32:36.040 --> 00:32:40.359 +an alternative, blah blah blah. -00:31:55.729 --> 00:32:00.090 -Here's how string.match is described in the manual. +00:32:40.360 --> 00:32:42.879 +When we want to to build more -00:32:00.091 --> 00:32:04.536 -It's just this: looks for the first match of pattern +00:32:42.880 --> 00:32:45.319 +complex... regular expressions, -00:32:04.537 --> 00:32:06.545 -in the string s, blah blah blah. +00:32:45.320 --> 00:32:49.199 +patterns, grammars, etc... we have to use -00:32:06.546 --> 00:32:10.076 -Then we have to go to the other section of the manual +00:32:49.200 --> 00:32:52.679 +an external library for that... no, -00:32:10.077 --> 00:32:18.197 -that explains patterns. Lua patterns are so simple, +00:32:52.680 --> 00:32:56.279 +sorry, a library that is external -00:32:18.198 --> 00:32:23.221 -so limited, that they don't even have +00:32:56.280 --> 00:32:58.239 +but that was written by one of the -00:32:23.222 --> 00:32:26.658 -the alternation operator. +00:32:58.240 --> 00:33:00.879 +authors of Lua itself. This library -00:32:26.659 --> 00:32:33.135 -Here is how it is described in the elisp manual, +00:33:00.880 --> 00:33:05.879 +is called Lpeg, and its manual says... -00:32:33.136 --> 00:32:39.677 -`\|` specifies an alternative, blah blah blah. +00:33:05.880 --> 00:33:09.599 +"Lpeg is a new pattern matching library for -00:32:39.678 --> 00:32:45.880 -When we want to build more complex regular expressions, +00:33:09.600 --> 00:33:12.039 +Lua based on Parsing Expression Grammars -32:45.880 --> 00:32:48.365 -patterns, grammars, etc., +00:33:12.040 --> 00:33:18.759 +(PEGs)". The manual is very terse, I -00:32:48.366 --> 00:32:52.668 -we have to use an external library for that. +00:33:18.760 --> 00:33:21.559 +found it incredibly hard to read... it -00:32:52.669 --> 00:32:56.207 -No, sorry, a library that is external, +00:33:21.560 --> 00:33:25.439 +doesn't have any diagrams - it has some -00:32:56.208 --> 00:33:01.471 -but that was written by one of the authors of Lua itself. +00:33:25.440 --> 00:33:29.759 +examples, though... and the Lua Wiki -00:33:01.472 --> 00:33:03.943 -This library is called Lpeg. +00:33:29.760 --> 00:33:33.879 +has a big page called Lpeg Tutorial -00:33:03.944 --> 00:33:06.330 -Its manual says Lpeg is +00:33:33.880 --> 00:33:35.359 +with lots of examples... -00:33:06.331 --> 00:33:09.653 -a new pattern matching library for Lua +00:33:35.360 --> 00:33:38.879 +but it it also doesn't have -00:33:09.654 --> 00:33:14.772 -based on parsing expression grammars (PEGs). +00:33:38.880 --> 00:33:41.199 +diagrams and I found some things -00:33:14.773 --> 00:33:17.780 -The manual is very terse. +00:33:41.200 --> 00:33:42.719 +incredibly hard to understand. -00:33:17.781 --> 00:33:21.945 -I found it incredibly hard to read. +00:33:42.720 --> 00:33:45.879 +For example, this is something that is in -00:33:21.946 --> 00:33:25.415 -it doesn't have any diagrams. +00:33:45.880 --> 00:33:48.879 +the the manual of Lpeg that I saw and I -00:33:25.416 --> 00:33:28.769 -It has some examples, though. +00:33:48.880 --> 00:33:51.639 +thought: "Wow, great! This makes all sense -00:33:28.770 --> 00:33:34.016 -The Lua wiki has a big page called Lpeg Tutorial +00:33:51.640 --> 00:33:53.159 +and is going to be very useful!"... -00:33:34.017 --> 00:33:39.560 -with lots of examples, but it also doesn't have diagrams. +00:33:53.160 --> 00:33:54.199 +it's a way to to build -33:39.560 --> 00:33:43.131 -I found some things incredibly hard to understand. +00:33:54.200 --> 00:33:57.199 +grammars that can be recursive, -00:33:43.132 --> 00:33:45.080 -For example, this is something +00:33:57.200 --> 00:34:01.359 +and they sort of can encode BNF -33:45.080 --> 00:33:48.061 -that is in the manual of Lpeg that I saw, +00:34:01.360 --> 00:34:03.439 +grammars... we just have to translate the -00:33:48.062 --> 00:33:51.480 -and I thought, wow, great, this makes all sense +00:34:03.440 --> 00:34:06.479 +BNF a bit to get rid of some -33:51.480 --> 00:33:53.946 -and this is going to be very useful. +00:34:06.480 --> 00:34:08.079 +recursions and to translate them to -00:33:53.947 --> 00:33:57.280 -It's a way to build grammars that can be recursive +00:34:08.080 --> 00:34:08.999 +something else. -33:57.280 --> 00:34:01.300 -and they sort of can encode BNF grammars, +00:34:09.000 --> 00:34:11.919 +And the manual also has some things -00:34:01.301 --> 00:34:05.128 -we just have to translate the BNF a bit +00:34:11.920 --> 00:34:15.159 +that I thought: "Oh, no! I don't have any -00:34:05.129 --> 00:34:07.592 -to get rid of some recursions +00:34:15.160 --> 00:34:18.359 +idea of what this thing does"... and in fact -00:34:07.593 --> 00:34:10.959 -and to translate them to something else. +00:34:18.360 --> 00:34:20.399 +I saw these things for the first -00:34:10.960 --> 00:34:14.337 -The manual also has some things that I thought, +00:34:20.400 --> 00:34:22.359 +time more than 10 years ago and they -00:34:14.338 --> 00:34:17.845 -oh no, I don't have any idea of what this thing does. +00:34:22.360 --> 00:34:26.079 +only started to make sense one year ago. -00:34:17.846 --> 00:34:20.768 -In fact, I saw these things for the first time +00:34:26.080 --> 00:34:30.519 +One example is group captures. -00:34:20.769 --> 00:34:27.294 -more than 10 years ago, and they only started to make sense +00:34:30.520 --> 00:34:36.359 +Lpeg also comes with a -00:34:27.295 --> 00:34:32.272 -one year ago. One example is group captures. +00:34:36.360 --> 00:34:38.719 +module called the Re module... let me -00:34:32.273 --> 00:34:37.834 -Lpeg also comes with a module called the re module. +00:34:38.720 --> 00:34:41.719 +pronounce as it in Portuguese - the Re -00:34:37.835 --> 00:34:43.182 -Let me pronounce it in Portuguese, the re module. +00:34:41.720 --> 00:34:45.759 +module... its manual says: "The Re -00:34:43.183 --> 00:34:45.741 -Its manual says the re module +00:34:45.760 --> 00:34:48.199 +module (provided by the file re.lua in the -00:34:45.742 --> 00:34:49.503 -provided by the file re.lua in the distribution +00:34:48.200 --> 00:34:51.159 +distribution) supports a somewhat conventional -00:34:49.504 --> 00:34:56.757 -supports some odd conventional regular expression syntax +00:34:51.160 --> 00:34:56.239 +regular expression syntax for pattern usage -00:34:56.758 --> 00:35:04.520 -for pattern usage within lpeg. This is a quick reference. +00:34:56.240 --> 00:34:58.679 +within lpeg"... and -35:04.520 --> 00:35:08.464 -This thing is very brief. It has some nice examples, +00:34:58.680 --> 00:35:03.519 +this is a quick reference... this -00:35:08.465 --> 00:35:11.120 -but it's hard to understand anyway. +00:35:03.520 --> 00:35:06.319 +thing is very brief, it has some nice -35:11.120 --> 00:35:14.180 -Here are some comments about +00:35:06.320 --> 00:35:08.919 +examples but it's hard to understand anyway... -00:35:14.181 --> 00:35:18.631 -my attempts to learn re.lua. This is a class. +00:35:08.920 --> 00:35:13.199 +and here are some comments about -00:35:18.632 --> 00:35:22.361 -In this case, it's a very small class. +00:35:13.200 --> 00:35:17.279 +my attempts to learn Re.lua. This is -00:35:22.362 --> 00:35:26.091 -This file implements a `pm` method. +00:35:17.280 --> 00:35:20.639 +a class... in this case it's a very small -00:35:26.092 --> 00:35:31.400 -I'm going to show examples of other `pm` methods very soon. +00:35:20.640 --> 00:35:24.839 +class... this file implements a :pm() -00:35:31.401 --> 00:35:34.696 -So this is a `pm` method for re.lua +00:35:24.840 --> 00:35:28.679 +method - I'm going to show examples of -00:35:34.697 --> 00:35:40.301 -that lets us compare the syntax of lua patterns, lpeg, +00:35:28.680 --> 00:35:32.239 +other :pm() methods very soon - so, this is -00:35:40.302 --> 00:35:46.631 -and re. See this example here. If we run this, +00:35:32.240 --> 00:35:35.799 +a :pm() method for Re.lua that lets us -00:35:46.632 --> 00:35:51.379 -it loads my version of lpeg, no sorry, +00:35:35.800 --> 00:35:38.719 +compare the syntax of Lua patterns, Lpeg, -00:35:51.380 --> 00:35:56.013 -my version of lpegrex. It shows that +00:35:38.720 --> 00:35:43.999 +and Re... let's see this example here... so, -00:35:56.014 --> 00:36:01.552 -when we apply the `pm` method to this Lua pattern, +00:35:44.000 --> 00:35:47.319 +if we run this it loads my version of -00:36:01.553 --> 00:36:05.960 -this lpeg pattern, and this re pattern, +00:35:47.320 --> 00:35:52.799 +lpeg... no, sorry, my version of lpegrex... -36:05.960 --> 00:36:08.238 -they all give the same results. +00:35:52.800 --> 00:35:57.119 +and it shows that when we apply -00:36:08.239 --> 00:36:11.512 -So we can use this kind of thing here to show +00:35:57.120 --> 00:36:01.199 +the :pm() method to this Lua pattern, this -00:36:11.513 --> 00:36:15.588 -how to translate from Lua patterns that are familiar +00:36:01.200 --> 00:36:04.879 +lpeg pattern, and this Re pattern -00:36:15.589 --> 00:36:19.280 -because they are similar to regular expressions, +00:36:04.880 --> 00:36:07.999 +they all give the same results. So we can -36:19.280 --> 00:36:25.251 -only weaker, to lpeg that is super weird, +00:36:08.000 --> 00:36:10.799 +use this thing... this kind of thing here -00:36:25.252 --> 00:36:30.084 -and to re that is not so weird. +00:36:10.800 --> 00:36:14.119 +to show how to translate from Lua -00:36:30.085 --> 00:36:35.425 -Anyway, the comment says that in 2012, I had a project +00:36:14.120 --> 00:36:16.519 +patterns, that are familiar because -00:36:35.426 --> 00:36:38.590 -that needed a precedence parser +00:36:16.520 --> 00:36:18.519 +they're similar to regular expressions, -00:36:38.591 --> 00:36:42.277 -that could parse arithmetical expressions +00:36:18.520 --> 00:36:20.199 +only weaker... -00:36:42.278 --> 00:36:46.314 -with the right precedences. At that point +00:36:20.200 --> 00:36:24.799 +to lpeg, that is super weird -00:36:46.315 --> 00:36:49.031 -I was still struggling with pure lpeg +00:36:24.800 --> 00:36:27.759 +and to Re, that is not so weird. -00:36:49.032 --> 00:36:51.318 -and I couldn't do much with it, +00:36:27.760 --> 00:36:35.159 +Anyway, the comment says that in 2012 -00:36:51.319 --> 00:36:54.576 -so I tried to learn re.lua instead, +00:36:35.160 --> 00:36:37.519 +I had a project that needed a -00:36:54.577 --> 00:36:59.291 -and I wrote this old class here that allowed me to use +00:36:37.520 --> 00:36:40.479 +precedence passer that could parse -00:36:59.292 --> 00:37:01.755 -a preprocessor on patterns for Lua. +00:36:40.480 --> 00:36:43.239 +arithmetical expressions with the right -00:37:01.756 --> 00:37:04.834 -The thing is that with this preprocessor +00:36:43.240 --> 00:36:46.639 +precedences... and at that point I was -00:37:04.835 --> 00:37:10.920 -I could specify precedence grammars using this thing here +00:36:46.640 --> 00:36:49.919 +still struggling with pure lpeg, and I -00:37:10.921 --> 00:37:14.488 -that worked but was super clumsy, +00:36:49.920 --> 00:36:52.359 +couldn't do much with it, so I tried to -00:37:14.489 --> 00:37:18.160 -and I gave up after a few attempts. +00:36:52.360 --> 00:36:55.519 +learn Re.lua instead, and I wrote this old -37:18.160 --> 00:37:25.632 -And in 2022 I heard about something called lpegrex +00:36:55.520 --> 00:36:56.319 +class here... -00:37:25.633 --> 00:37:30.760 -that was a kind of extension of re, +00:36:56.320 --> 00:37:01.039 +that allowed me to use a preprocessor -37:30.760 --> 00:37:33.045 +00:37:01.040 --> 00:37:03.279 +on patterns for Lua. And the thing is that + +00:37:03.280 --> 00:37:04.879 +with this preprocessor I could + +00:37:04.880 --> 00:37:07.839 +specify precedence grammars using this + +00:37:07.840 --> 00:37:11.879 +thing here, that worked, but was super + +00:37:11.880 --> 00:37:15.999 +clumsy... and I gave up after a few attempts. + +00:37:16.000 --> 00:37:21.879 +and in 2022 I heard about something + +00:37:21.880 --> 00:37:23.239 +called lpegrex, + +00:37:23.240 --> 00:37:29.799 +that was a... a kind of extension or Re, + +00:37:29.800 --> 00:37:32.879 and it was much more powerful than re.lua, -00:37:33.046 --> 00:37:35.784 -but after a while I realized that +00:37:32.880 --> 00:37:34.919 +but after a while I realized that it + +00:37:34.920 --> 00:37:37.639 +had the same defects as re.lua... + +00:37:37.640 --> 00:37:40.839 +and let me explain that, because + +00:37:40.840 --> 00:37:44.439 +it has all to do with the things about + +00:37:44.440 --> 00:37:48.039 +black boxes and magic that I told in the + +00:37:48.040 --> 00:37:52.919 +beginning. Both... I mean, sorry, neither + +00:37:52.920 --> 00:37:57.199 +re.lua or lpegrex had some features that + +00:37:57.200 --> 00:38:00.799 +I needed... they didn't let us explore... + +00:38:00.800 --> 00:38:03.679 +sorry, they received a pattern that was + +00:38:03.680 --> 00:38:06.839 +specified as a string, and it converted + +00:38:06.840 --> 00:38:09.679 +that into an lpeg pattern, but it didn't + +00:38:09.680 --> 00:38:12.559 +let us explore the the lpeg patterns + +00:38:12.560 --> 00:38:15.159 +that it generated... + +00:38:15.160 --> 00:38:18.759 +their code was written in a way + +00:38:18.760 --> 00:38:21.319 +that was REPL-unfriendly - I -00:37:35.785 --> 00:37:38.765 -it had the same defects as re.lua. +00:38:21.320 --> 00:38:24.279 +couldn't modify parts of the code -00:37:38.766 --> 00:37:40.698 -Let me explain that, +00:38:24.280 --> 00:38:28.399 +bit by bit in a REPL and try to change -00:37:40.699 --> 00:37:43.920 -because it has all to do with the things +00:38:28.400 --> 00:38:31.719 +the code without changing the -37:43.920 --> 00:37:52.026 -about black boxes and magic that I told in the beginning. +00:38:31.720 --> 00:38:34.199 +original file... the code was very -00:37:52.027 --> 00:37:59.046 -Neither re.lua or lpegrex had some features that I needed. +00:38:34.200 --> 00:38:36.839 +hard to explore, to hack, and to extend - -00:37:59.047 --> 00:38:05.374 -They received a pattern that was specified as a string +00:38:36.840 --> 00:38:39.159 +in my opinion... the documentation was not -00:38:05.375 --> 00:38:08.868 -and it converted that into an lpeg pattern, +00:38:39.160 --> 00:38:43.319 +very clear... and I sent one or two messages -00:38:08.869 --> 00:38:12.520 -but it didn't let us explore the lpeg patterns +00:38:43.320 --> 00:38:47.159 +to the the developer of lpegrex and... -38:12.520 --> 00:38:14.529 -that it generated. +00:38:47.160 --> 00:38:50.759 +he was too busy to help me. He -00:38:14.530 --> 00:38:20.662 -Their code was written in a way that was REPL-unfriendly. +00:38:50.760 --> 00:38:53.959 +answered it very briefly, and, uh, to be -00:38:20.663 --> 00:38:26.281 -I couldn't modify parts of the code bit by bit in a REPL +00:38:53.960 --> 00:38:56.599 +honest I felt... rejected. I felt that I -00:38:26.282 --> 00:38:28.943 -and try to change the code +00:38:56.600 --> 00:38:58.679 +wasn't doing anything interesting... -00:38:28.944 --> 00:38:32.035 -without changing the original file, say. +00:38:58.680 --> 00:39:03.399 +whatever, whatever... -00:38:32.036 --> 00:38:35.353 -The code was very hard to explore, to hack, +00:39:03.400 --> 00:39:09.239 +So, in 2022 I was trying to learn lpegrex -00:38:35.354 --> 00:38:38.238 -and to extend in my opinion. +00:39:09.240 --> 00:39:11.559 +because I was thinking that it would -00:38:38.239 --> 00:38:42.018 -The documentation was not very clear, +00:39:11.560 --> 00:39:13.719 +solve my problems - but it didn't... -00:38:42.019 --> 00:38:45.600 -and I sent wonderful messages to the +00:39:13.720 --> 00:39:16.479 +it didn't have the features that I needed, -38:45.600 --> 00:38:51.013 -developer of lpegrex, and he was too busy to help me. +00:39:16.480 --> 00:39:20.919 +it was hard to extend, hard to explore, -00:38:51.014 --> 00:38:57.210 -He answered very briefly. To be honest, I felt rejected. +00:39:20.920 --> 00:39:23.279 +and hard to debug, and I -00:38:57.211 --> 00:39:03.200 -I felt that I wasn't doing anything interesting, whatever. +00:39:23.280 --> 00:39:25.039 +decided to rewrite it in a more + +00:39:25.040 --> 00:39:30.639 +hacker-friendly way - in the sense that... + +00:39:30.640 --> 00:39:33.759 +was modular, and I could replace any + +00:39:33.760 --> 00:39:35.399 +part of the module from a REPL... NOTE ELpeg1.lua -39:03.200 --> 00:39:07.470 -So in 2022, I was trying to learn lpegrex +00:39:35.400 --> 00:39:43.679 +My version of it was called ELpeg1.lua... + +00:39:43.680 --> 00:39:47.679 +and I decided that in my version I + +00:39:47.680 --> 00:39:49.639 +wouldn't have the part that + +00:39:49.640 --> 00:39:54.879 +receives a grammar specified as a string + +00:39:54.880 --> 00:39:57.519 +and converts that to lpeg... I would + +00:39:57.520 --> 00:40:00.959 +just have the backend part, that are the + +00:40:00.960 --> 00:40:03.999 +functions in lpeg that let us specify + +00:40:04.000 --> 00:40:05.479 +powerful grammars. + +00:40:05.480 --> 00:40:11.759 +Let me go back. Let me explain a + +00:40:11.760 --> 00:40:15.519 +bit about lpeg... Lua has + +00:40:15.520 --> 00:40:21.599 +coercions: the + expects to receive + +00:40:21.600 --> 00:40:23.999 +true numbers, and if one of its arguments, + +00:40:24.000 --> 00:40:26.999 +or both of them, are strings, it converts + +00:40:27.000 --> 00:40:29.839 +the string... the strings to numbers so in + +00:40:29.840 --> 00:40:33.519 +this case here, 2+"3", + +00:40:33.520 --> 00:40:36.159 +it returns the number 5, + +00:40:36.160 --> 00:40:39.359 +and this is the concatenation + +00:40:39.360 --> 00:40:42.119 +operator... it expects to receive + +00:40:42.120 --> 00:40:44.999 +strings, so in this case it will -00:39:07.471 --> 00:39:13.200 -because I was thinking that it would solve my problems, +00:40:45.000 --> 00:40:47.359 +convert the number 2 to the string "2", -39:13.200 --> 00:39:16.666 -but it didn't. It didn't have the features that I needed, +00:40:47.360 --> 00:40:50.279 +and the concatenation of thes two -00:39:16.667 --> 00:39:18.400 -and it was hard to extend and +00:40:50.280 --> 00:40:54.479 +things will be 23... oops, sorry, "23" -39:18.400 --> 00:39:22.302 -how to explore and hard to debug. +00:40:54.480 --> 00:40:56.279 +as a string. -00:39:22.303 --> 00:39:28.960 -I decided to rewrite it in a more hacker-friendly way, +00:40:56.280 --> 00:40:58.519 +Lpeg also has some coercions. -39:28.960 --> 00:39:32.035 -in the sense that it was modular +00:40:58.520 --> 00:41:01.759 +I usually set these -00:39:32.036 --> 00:39:37.160 -and I could replace any part of the module from a REPL. +00:41:01.760 --> 00:41:05.799 +globals to let me write my grammars -39:37.160 --> 00:39:42.640 -My version of it was called ELpeg1.lua. +00:41:05.800 --> 00:41:09.719 +in a very compact way, so instead -00:39:42.641 --> 00:39:48.120 -I decided that in my version I wouldn't +00:41:09.720 --> 00:41:14.759 +of lpeg.B, lpeg.C, etc I use these globals, -39:48.120 --> 00:39:51.240 -have the part that receives a grammar +00:41:14.760 --> 00:41:18.359 +like uppercase B, uppercase C, and so on... -00:39:51.241 --> 00:39:55.265 -specified as a string and converts that to lpeg. +00:41:18.360 --> 00:41:21.679 +and with these globals I can write -00:39:55.266 --> 00:39:58.984 -I would just have the backend part +00:41:21.680 --> 00:41:26.759 +things like this: C(1)*"_"... -00:39:58.985 --> 00:40:02.171 -that are the functions in lpeg +00:41:26.760 --> 00:41:33.199 +and lpeg knows that lpeg.C... -00:40:02.172 --> 00:40:06.320 -that let us specify powerful grammars. +00:41:33.200 --> 00:41:38.879 +it sort of expands this to lpeg.C, -40:06.320 --> 00:40:15.161 -Let me go back. Let me explain a bit about lpeg. +00:41:38.880 --> 00:41:42.039 +but lpeg.C expects to receive -00:40:15.162 --> 00:40:20.780 -Lua has coercions. The `+` expects to receive two numbers. +00:41:42.040 --> 00:41:44.839 +an lpeg pattern, and 1 is not yet an -00:40:20.781 --> 00:40:25.930 -If one of its arguments or both of them are strings, +00:41:44.840 --> 00:41:47.879 +lpeg pattern, so it is coerced into an -00:40:25.931 --> 00:40:30.116 -it converts the strings to numbers. +00:41:47.880 --> 00:41:51.799 +lpeg pattern by calling lpeg.P, -00:40:30.117 --> 00:40:37.091 -So in this case here, `2 + "3"` returns the number 5. +00:41:51.800 --> 00:41:55.679 +so this short thing here becomes -00:40:37.092 --> 00:40:40.440 -This is the concatenation operator. +00:41:55.680 --> 00:42:03.399 +equivalent to lpeg.C(lpeg.P(1)), and the -00:40:40.441 --> 00:40:44.960 -It expects to receive strings. In this case, it will +00:42:03.400 --> 00:42:07.399 +multiplication, when at least one of its -40:44.960 --> 00:40:47.541 -convert the number 2 to the string "2" +00:42:07.400 --> 00:42:10.759 +arguments is an lpeg pattern... it expects -00:40:47.542 --> 00:40:50.960 -and the concatenation of these two things will be +00:42:10.760 --> 00:42:13.199 +to receive two lpeg patterns, and in -40:50.960 --> 00:40:55.917 -"23". Oops, sorry, "23" as a string. +00:42:13.200 --> 00:42:15.239 +this case the one at the right is -00:40:55.918 --> 00:41:04.480 -lpeg also has some coercions. I usually set these globals +00:42:15.240 --> 00:42:18.319 +just a string, so it is coerced to an lpeg -41:04.480 --> 00:41:10.013 -to let me write my grammars in a very compact way. +00:42:18.320 --> 00:42:20.079 +pattern by using lpeg.P. -00:41:10.014 --> 00:41:13.811 -So instead of lpeg.B, lpeg.C, etc. +00:42:20.080 --> 00:42:25.599 +With this idea we can sort of -00:41:13.812 --> 00:41:17.878 -I use globals like B, C, and so on. +00:42:25.600 --> 00:42:28.439 +understand the comparison here. I mean, -00:41:17.879 --> 00:41:21.720 -And with these globals I can write +00:42:28.440 --> 00:42:31.719 +let me run it again... this first part is -41:21.720 --> 00:41:36.047 -things like this, `C(1) * "_"`. And lpeg knows that lpeg.C, +00:42:31.720 --> 00:42:34.679 +very similar to a regular expression -00:41:36.048 --> 00:41:41.147 -sorry, it sort of expands these to lpeg.C, +00:42:34.680 --> 00:42:35.359 +here at the left... -00:41:41.148 --> 00:41:43.590 -but lpeg.C expects to receive an lpeg pattern +00:42:35.360 --> 00:42:39.759 +and when we apply this... Lua pattern -00:41:43.591 --> 00:41:48.547 -and 1 is not yet an lpeg pattern. +00:42:39.760 --> 00:42:43.639 +to this subject here the result -00:41:48.548 --> 00:41:53.347 -So it is coerced into an lpeg pattern by calling lpeg.P. +00:42:43.640 --> 00:42:47.799 +is this thing here, this thing, this -00:41:53.348 --> 00:42:02.481 -So this short thing here becomes equivalent to +00:42:47.800 --> 00:42:54.319 +thing and this thing... I'm going to -00:42:02.482 --> 00:42:07.200 -`lpeg.C(lpeg.P(1))`. And the multiplication when at least one of +00:42:54.320 --> 00:42:56.119 +call each one of these results -42:07.200 --> 42:13.320 -its arguments is an lpeg pattern, it expects to receive two lpeg patterns. And in this +00:42:56.120 --> 00:42:59.519 +"captures", so each of these things -42:13.320 --> 42:19.200 -case the one at the right is just a string, so it is coerced to an lpeg pattern by using +00:42:59.520 --> 00:43:03.319 +between parentheses "captures" a substring -42:19.200 --> 42:29.360 -lpeg.P. With this idea we can sort of understand this comparison here. I mean, let me run it +00:43:03.320 --> 00:43:06.039 +of the original string and these -42:29.360 --> 42:37.440 -again. This first part is very similar to a regular expression here at the left. And +00:43:06.040 --> 00:43:08.559 +captured substrings are returned in a -42:37.440 --> 42:51.440 -when we apply this lpeg, sorry, this lua pattern to this subject here, the result is this thing +00:43:08.560 --> 00:43:11.839 +certain order. Here is how to express the -42:51.440 --> 42:56.040 -here, this thing, this thing and this thing. I'm going to call each one of these results +00:43:11.840 --> 00:43:12.759 +same thing in lpeg... -42:56.040 --> 43:04.080 -captures. So each of these things between parentheses captures a substring of the original +00:43:12.760 --> 00:43:15.919 +it's very cryptic but it's a -43:04.080 --> 43:11.520 -string and these captured substrings are returned in a certain order. Here is how to express +00:43:15.920 --> 00:43:20.719 +good way to understand the some basic -43:11.520 --> 43:20.720 -the same thing in lpeg. It's very cryptic, but it's a good way to understand some basic +00:43:20.720 --> 00:43:23.879 +operators of lpeg, I mean we can look at -43:20.720 --> 43:29.880 -operators of lpeg. I mean, we can look at the menu and understand what C, S and R do +00:43:23.880 --> 00:43:26.479 +the manual and understand and -43:29.880 --> 43:41.360 -and also exponentiation. And this strange thing here receives this string here, runs +00:43:26.480 --> 00:43:30.519 +what C, S and R do, and also -43:41.360 --> 43:46.760 -a function that I have defined that converts it to an object of a certain class and that +00:43:30.520 --> 00:43:37.959 +exponentiation... and this strange thing -43:46.760 --> 43:55.240 -class represents re patterns. So this thing is treated as a pattern for re.lua and it +00:43:37.960 --> 00:43:41.319 +here receives this string here, runs -43:55.240 --> 44:04.040 -is matched again the string and it returns the same thing as the other one. Also this +00:43:41.320 --> 00:43:43.279 +a function that I have defined, that -44:04.040 --> 44:10.680 -thing here also has a comparison with lpeg.rex, but these patterns are very, very trivial. +00:43:43.280 --> 00:43:46.039 +converts it to an object of a certain -44:10.680 --> 44:17.340 -They don't do anything very strange. So let's go back and see what kinds of very strange +00:43:46.040 --> 00:43:47.759 +class, and that class -44:17.340 --> 44:31.480 -things there are. Here is the page of lpeg.rex at GitHub. Here is the documentation. It's +00:43:47.760 --> 00:43:52.399 +represents Re patterns, so this thing -44:31.480 --> 44:39.120 -relatively brief. It explains lpeg.rex as being an extension of re.lua. So +00:43:52.400 --> 00:43:54.479 +is treated as a pattern for re.lua, -44:39.120 --> 44:44.880 -it explains mainly the additional features. Here is a quick reference that explains only +00:43:54.480 --> 00:43:56.479 +and it is matched against the string, -44:44.880 --> 44:56.840 -the additional features. Some of these things I was able to understand by struggling a lot, +00:43:56.480 --> 00:43:59.439 +and it returns the same thing as the -44:56.840 --> 45:08.720 -and some I wasn't able to even by spending several evenings trying to build examples. +00:43:59.440 --> 00:44:02.559 +other one. -45:08.720 --> 45:16.600 -This is something very nice. lpeg.rex comes with some example parsers. Here is +00:44:02.560 --> 00:44:05.519 +Also, this thing here also has a -45:16.600 --> 45:25.720 -a parser that parses the lua grammar. I mean, this is the grammar for lua 5.4 at the end +00:44:05.520 --> 00:44:08.479 +comparison with lpegrex, but these -45:25.720 --> 45:35.080 -of the reference manual. It's just this. And this is a kind of BNF, and this is the BNF +00:44:08.480 --> 00:44:11.559 +patterns are very trivial, they -45:35.080 --> 45:43.840 -translated to the language of lpeg.rex. This thing uses many constructions that are +00:44:11.560 --> 00:44:13.359 +don't do anything very strange... -45:43.840 --> 45:51.840 -in re.lua and some extra constructions that are described here. With these examples, +00:44:13.360 --> 00:44:15.759 +so let's go back and see what -45:51.840 --> 46:00.280 -I was able to understand some of these things here that are described here in the quick +00:44:15.760 --> 00:44:18.239 +kinds of very strange things there are. -46:00.280 --> 46:13.840 -reference, but not all. So I wasn't able to use lpeg.rex by itself because some things +00:44:18.240 --> 00:44:26.559 +Here is the page of lpegrex at github, -46:13.840 --> 46:21.560 -didn't make much sense. I decided to re implement it in my own style because that +00:44:26.560 --> 00:44:29.719 +here's the documentation... -46:21.560 --> 46:29.120 -would be a way to map... at the very least, map what I understood and what I didn't and +00:44:29.720 --> 00:44:32.439 +it's relatively brief, -46:29.120 --> 46:38.160 -learn one feature at a time, do comparisons and so on. Here I pointed to two features +00:44:32.440 --> 00:44:35.239 +it explains lpegrex as being an -46:38.160 --> 46:44.880 -of lpeg. One I said, oh great, this thing can be used to define grammars, even recursive +00:44:35.240 --> 00:44:39.719 +extension of Re.lua, so it explains -46:44.880 --> 46:52.260 -grammars and so on. And this is an "oh no" feature. One thing that didn't make any sense at all: +00:44:39.720 --> 00:44:42.879 +mainly the additional features... here is a -46:52.260 --> 47:01.760 -group captures. One thing that I did to understand group captures was to represent them as diagrams. +00:44:42.880 --> 00:44:45.119 +quick reference that explains only the -47:01.760 --> 47:08.200 -Of course in the beginning I was drawing these diagrams by hand, but then I realized that +00:44:45.120 --> 00:44:46.359 +additional features... -47:08.200 --> 47:16.680 -I could use the bits of lpeg that I already knew to build a grammar that would parse a +00:44:46.360 --> 00:44:49.639 +some of the these things -47:16.680 --> 47:24.400 -little language and generate these diagrams in LaTeX. I was able to make this. In +00:44:49.640 --> 00:44:50.919 +I was able to understand -47:24.400 --> 47:35.520 -this diagram here, this thing above the arrow is a piece of Lua code that specifies an lpeg +00:44:50.920 --> 00:44:57.559 +by struggling a lot, and some I wasn't -47:35.520 --> 47:43.160 -pattern. This thing here at the top is the string that is being matched and the things +00:44:57.560 --> 00:45:02.439 +able to even by spending several evenings -47:43.160 --> 47:57.880 -below the under braces are the captures that each thing captures. For example, this under +00:45:02.440 --> 00:45:04.319 +try to to build examples... -47:57.880 --> 48:03.520 -brace here corresponds to this pattern here that parses a single character but doesn't +00:45:04.320 --> 00:45:12.879 +and this is something very nice. Lpegrex -48:03.520 --> 48:10.680 -return any captures. This thing here parses a single B and doesn't return any captures. +00:45:12.880 --> 00:45:15.879 +comes with some example parsers... and -48:10.680 --> 48:17.800 -This thing here parses a single character and captures it. And this thing here parses +00:45:15.880 --> 00:45:18.679 +here is a parser that parses the Lua -48:17.800 --> 48:24.920 -the character D and captures it. And this other thing here that transforms this pattern +00:45:18.680 --> 00:45:22.479 +grammar - I mean, this is the the grammar -48:24.920 --> 48:35.040 -into another pattern returns first a capture with all the string that was parsed by this +00:45:22.480 --> 00:45:25.959 +for Lua 5.4 at the end of the -48:35.040 --> 48:44.000 -pattern here and then all the captures returned by this thing here before the column. So this +00:45:25.960 --> 00:45:31.199 +reference manual... it's just this... this -48:44.000 --> 48:51.840 -was a way to build concrete examples for things that the lpeg manual was explaining in a very +00:45:31.200 --> 00:45:34.799 +is in a kind of BNF, and this is the BNF -48:51.840 --> 48:58.600 -terse way and it worked for me. Some things that were very mysterious started to make +00:45:34.800 --> 00:45:35.599 +translated -48:58.600 --> 49:10.200 -sense and I started to have intelligent questions to ask in the mailing list. With that +00:45:35.600 --> 00:45:39.919 +to the language of lpegrex, so this -49:10.200 --> 49:22.040 -I was able to understand what are group captures that receive a name. Well, let me explain +00:45:39.920 --> 00:45:43.039 +thing uses many constructions that are -49:22.040 --> 49:30.400 -what this does. This thing here parses the empty string and returns this as a constant. +00:45:43.040 --> 00:45:47.999 +in re.lua and some extra constructions that -49:30.400 --> 49:38.520 -So this is something that doesn't exist in regular expressions. It parses nothing and +00:45:48.000 --> 00:45:50.959 +are described here... and with these -49:38.520 --> 49:46.800 -returns this as a capture. Then this thing here returns two constants here and parses +00:45:50.960 --> 00:45:54.239 +examples I was able to to understand -49:46.800 --> 49:54.440 -the empty string. And this thing here, D, converts the results of this thing here into +00:45:54.240 --> 00:45:55.159 +some of the... -49:54.440 --> 50:04.160 -a group capture and stores it in the label D. And then here's another constant capture. +00:45:55.160 --> 00:45:58.079 +of these things here that are + +00:45:58.080 --> 00:46:00.239 +described here in the quick + +00:46:00.240 --> 00:46:04.719 +reference - but not all. + +00:46:04.720 --> 00:46:11.279 +So, I wasn't able to use lpegrex + +00:46:11.280 --> 00:46:14.279 +by itself, because some things didn't + +00:46:14.280 --> 00:46:16.199 +make much sense, and I decided to + +00:46:16.200 --> 00:46:18.759 +reimplement it in my own style, + +00:46:18.760 --> 00:46:23.679 +because that would be a way to map... + +00:46:23.680 --> 00:46:26.839 +to at the very least map what I had + +00:46:26.840 --> 00:46:29.559 +understood and what I didn't, learn + +00:46:29.560 --> 00:46:32.999 +one feature at a time, do comparisons, and + +00:46:33.000 --> 00:46:35.319 +so on. + +00:46:35.320 --> 00:46:38.799 +Here I pointed to two features of lpeg... + +00:46:38.800 --> 00:46:41.679 +in one I said "Oh, great! This thing can + +00:46:41.680 --> 00:46:44.319 +be used to to define grammars, even + +00:46:44.320 --> 00:46:45.959 +recursive grammars", and so on... + +00:46:45.960 --> 00:46:49.759 +and this is an "Oh, no!" feature - one + +00:46:49.760 --> 00:46:51.759 +thing that didn't make any sense at all... + +00:46:51.760 --> 00:46:56.439 +group captures. One thing that I did to + +00:46:56.440 --> 00:46:59.039 +understand group captures was to + +00:46:59.040 --> 00:47:02.319 +represent them as diagrams. Of course in + +00:47:02.320 --> 00:47:05.359 +the beginning I was drawing these + +00:47:05.360 --> 00:47:08.919 +diagrams by hand, but then I realized + +00:47:08.920 --> 00:47:11.559 +that I could use the bits of lpeg + +00:47:11.560 --> 00:47:14.759 +that I already knew to build a grammar + +00:47:14.760 --> 00:47:17.479 +that would parse a little language and + +00:47:17.480 --> 00:47:20.999 +generate these diagrams in LaTeX, and I was + +00:47:21.000 --> 00:47:21.919 +able to make this. + +00:47:21.920 --> 00:47:25.279 +In this diagram here + +00:47:25.280 --> 00:47:30.719 +this thing above the arrow is Lua code... + +00:47:30.720 --> 00:47:33.759 +a piece of Lua code that + +00:47:33.760 --> 00:47:37.119 +specifies an lpeg pattern... this + +00:47:37.120 --> 00:47:39.559 +thing here at the top is the string that + +00:47:39.560 --> 00:47:43.039 +is being matched, and the things below + +00:47:43.040 --> 00:47:46.599 +the underbraces are the captures that + +00:47:46.600 --> 00:47:50.639 +each thing... sorry, that each thing + +00:47:50.640 --> 00:47:51.319 +captures. + +00:47:51.320 --> 00:47:58.479 +For example, this underbrace here + +00:47:58.480 --> 00:48:00.279 +corresponds to this pattern here, + +00:48:00.280 --> 00:48:02.879 +that parses a single character but + +00:48:02.880 --> 00:48:05.559 +doesn't return any captures, this thing + +00:48:05.560 --> 00:48:08.119 +here parses a single "b" and doesn't + +00:48:08.120 --> 00:48:11.239 +return any captures, this thing here + +00:48:11.240 --> 00:48:14.399 +parses a single character and captures + +00:48:14.400 --> 00:48:16.879 +it, and this thing here parses the + +00:48:16.880 --> 00:48:21.319 +character "d" and captures it... and this + +00:48:21.320 --> 00:48:24.439 +other thing here transforms this + +00:48:24.440 --> 00:48:27.279 +pattern into another pattern... + +00:48:27.280 --> 00:48:33.119 +returns first a capture with all + +00:48:33.120 --> 00:48:35.079 +the string that was parsed by this + +00:48:35.080 --> 00:48:37.399 +pattern here, and then all the captures + +00:48:37.400 --> 00:48:41.079 +returned by this thing here before + +00:48:41.080 --> 00:48:42.959 +the ":". + +00:48:42.960 --> 00:48:45.479 +So, this was a way to build + +00:48:45.480 --> 00:48:48.599 +concrete examples for things that the + +00:48:48.600 --> 00:48:52.159 +lpag manual was explaining in a very terse + +00:48:52.160 --> 00:48:55.799 +way, and it worked for me - some things + +00:48:55.800 --> 00:48:56.999 +that were very + +00:48:57.000 --> 00:48:59.839 +mysterious started to make sense, and I + +00:48:59.840 --> 00:49:03.199 +started to have intelligent questions + +00:49:03.200 --> 00:49:06.079 +to ask in the mailing list. + +00:49:06.080 --> 00:49:10.959 +And with that I was able to + +00:49:10.960 --> 00:49:12.959 +understand what are group captures, + +00:49:12.960 --> 00:49:17.879 +and group captures that receive a name... + +00:49:17.880 --> 00:49:22.719 +Well, let me explain what this does. + +00:49:22.720 --> 00:49:27.119 +This thing here captures... sorry, parses + +00:49:27.120 --> 00:49:29.359 +the empty string and returns this as a + +00:49:29.360 --> 00:49:32.959 +constant... so, this is something that + +00:49:32.960 --> 00:49:35.799 +doesn't exist in regular expressions... + +00:49:35.800 --> 00:49:38.639 +it parses nothing and + +00:49:38.640 --> 00:49:41.839 +returns this as a capture... then this + +00:49:41.840 --> 00:49:44.599 +thing here returns these two + +00:49:44.600 --> 00:49:47.159 +constants here, and parses the empty + +00:49:47.160 --> 00:49:51.279 +string, and this thing here converts + +00:49:51.280 --> 00:49:54.159 +the results of this thing here into a + +00:49:54.160 --> 00:49:57.639 +group capture, and stores it in the label + +00:49:57.640 --> 00:50:03.279 +"d"... and then here's another constant + +00:50:03.280 --> 00:50:03.719 +capture. NOTE Building lists -50:04.160 --> 50:15.560 -I realized that these things here were similar to how Lua specifies building lists. +00:50:03.720 --> 00:50:05.679 +And I realized that these things + +00:50:05.680 --> 00:50:08.599 +here were similar to how Lua + +00:50:08.600 --> 00:50:09.839 +specifies building lists... + +00:50:09.840 --> 00:50:16.239 +when we build... sorry, tables. When + +00:50:16.240 --> 00:50:18.759 +we build a table, and we say that the + +00:50:18.760 --> 00:50:21.879 +first element of the table is here, this + +00:50:21.880 --> 00:50:23.559 +element is put at the end of the table... + +00:50:23.560 --> 00:50:29.399 +when after the that would say d=42... + +00:50:29.400 --> 00:50:31.199 +we are putting the 42 + +00:50:31.200 --> 00:50:34.559 +in the the slot whose key is "d". + +00:50:34.560 --> 00:50:38.999 +This was happening with lpeg captures, + +00:50:39.000 --> 00:50:43.359 +but there was something very strange... + +00:50:43.360 --> 00:50:46.199 +these group captures could hold + +00:50:46.200 --> 00:50:49.199 +more than one capture - more than one + +00:50:49.200 --> 00:50:51.759 +value... so there was something between + +00:50:51.760 --> 00:50:58.039 +lists and tables. I started to use this + +00:50:58.040 --> 00:51:00.479 +notation to... + +00:51:00.480 --> 00:51:04.959 +explain in my notation what they + +00:51:04.960 --> 00:51:08.159 +were doing... many things started + +00:51:08.160 --> 00:51:10.239 +to make sense, many mysterious + +00:51:10.240 --> 00:51:12.879 +sentences in the manual started to + +00:51:12.880 --> 00:51:14.439 +make sense... but some didn't... + +00:51:14.440 --> 00:51:19.679 +but at least I was able to send + +00:51:19.680 --> 00:51:22.319 +some intelligent questions to the + +00:51:22.320 --> 00:51:25.199 +mailing lis,t and the author of Lua and + +00:51:25.200 --> 00:51:27.359 +lpeg answered some of them... + +00:51:27.360 --> 00:51:31.519 +he was not very happy about my + +00:51:31.520 --> 00:51:34.959 +questions - he... told me that those + +00:51:34.960 --> 00:51:37.679 +diagrams were a waste of time, the + +00:51:37.680 --> 00:51:40.559 +manual was perfectly clear, and so on... + +00:51:40.560 --> 00:51:44.919 +whatever - but I was able to... + +00:51:44.920 --> 00:51:48.879 +so, it was weird, but I was able to + +00:51:48.880 --> 00:51:51.799 +understand lots of things from his + +00:51:51.800 --> 00:51:56.519 +answers. This is a copy of one of + +00:51:56.520 --> 00:51:58.239 +my messages, then there's another one, + +00:51:58.240 --> 00:52:01.239 +another one, some of them had diagrams... + +00:52:01.240 --> 00:52:04.359 +then he complained about these diagrams, + +00:52:04.360 --> 00:52:08.439 +he said that these things here, that look + +00:52:08.440 --> 00:52:11.119 +like table constructors, "do not exist"... + +00:52:11.120 --> 00:52:17.199 +whatever... anyway, once I understood + +00:52:17.200 --> 00:52:20.679 +group captures many features + +00:52:20.680 --> 00:52:23.359 +were very easy to understand + +00:52:23.360 --> 00:52:26.039 +and I started to be able to use lpeg to + +00:52:26.040 --> 00:52:28.159 +to build some very interesting things... + +00:52:28.160 --> 00:52:33.039 +I was able to reproduce some + +00:52:33.040 --> 00:52:36.359 +of the features that I saw in lpegrex - + +00:52:36.360 --> 00:52:41.079 +remember that this... where is that? + +00:52:41.080 --> 00:52:46.119 +this is the syntax of Lua... here - + +00:52:46.120 --> 00:52:48.959 +I was able to understand + +00:52:48.960 --> 00:52:52.479 +how these things here were translated to + +00:52:52.480 --> 00:52:55.359 +lpeg code... to lpeg patterns + +00:52:55.360 --> 00:52:58.239 +by using group captures in a certain + +00:52:58.240 --> 00:53:03.039 +way... I was able to implement them + +00:53:03.040 --> 00:53:04.759 +in ELpeg1.lua... + +00:53:04.760 --> 00:53:08.719 +and after some time I was able to use + +00:53:08.720 --> 00:53:12.879 +ELpeg1.lua to build grammars that + +00:53:12.880 --> 00:53:14.159 +were able to parse + +00:53:14.160 --> 00:53:18.679 +arithmetical expressions with the + +00:53:18.680 --> 00:53:20.959 +right precedence... and here's an example + +00:53:20.960 --> 00:53:23.319 +in which I built the grammar step by step... + +00:53:23.320 --> 00:53:29.239 +and I test the current grammar, and I + +00:53:29.240 --> 00:53:35.079 +replace a bit, and then I test the new + +00:53:35.080 --> 00:53:36.599 +grammar and so on... + +00:53:36.600 --> 00:53:39.079 +and you can see that the result is + +00:53:39.080 --> 00:53:43.359 +always a tree that is drawn in a + +00:53:43.360 --> 00:53:44.239 +nice two dimensional way... + +00:53:44.240 --> 00:53:48.919 +At this point these powers here + +00:53:48.920 --> 00:53:50.559 +are returned as a list, + +00:53:50.560 --> 00:53:53.119 +as an operation "pow" + +00:53:53.120 --> 00:53:57.559 +with several arguments, here... and then + +00:53:57.560 --> 00:54:00.519 +I apply a kind of parsing combinator, + +00:54:00.520 --> 00:54:03.719 +here... that transforms these trees into + +00:54:03.720 --> 00:54:08.199 +other trees and with these combinators + +00:54:08.200 --> 00:54:12.199 +here I can specify that the "^" is + +00:54:12.200 --> 00:54:14.639 +associative in a certain direction... + +00:54:14.640 --> 00:54:17.519 +that the "/" is associative in + +00:54:17.520 --> 00:54:20.119 +another direction... the "-" uses + +00:54:20.120 --> 00:54:23.079 +the same direction as a the "/", + +00:54:23.080 --> 00:54:26.079 +and so on... and they have the + +00:54:26.080 --> 00:54:29.679 +right precedences. + +00:54:29.680 --> 00:54:34.559 +So, here are the tests... + +00:54:34.560 --> 00:54:38.119 +here is my file ELpeg1.lua... it has + +00:54:38.120 --> 00:54:41.719 +several classes, each class has tests + +00:54:41.720 --> 00:54:42.279 +after it... + +00:54:42.280 --> 00:54:46.239 +I was able to implement something + +00:54:46.240 --> 00:54:50.519 +that lpegrex has, that is called + +00:54:50.520 --> 00:54:53.519 +"keywords", that is very useful for parsing + +00:54:53.520 --> 00:54:56.479 +programs in programming languages... + +00:54:56.480 --> 00:54:59.439 +I was able to implement something + +00:54:59.440 --> 00:55:02.639 +similar to the debugger... to the + +00:55:02.640 --> 00:55:07.999 +lpeg debugger lpeg uses... I was + +00:55:08.000 --> 00:55:11.399 +frustrated by some limitations of + +00:55:11.400 --> 00:55:16.839 +the lpeg debugger, and I implemented + +00:55:16.840 --> 00:55:23.439 +my own that is, uh... much better!... + +00:55:23.440 --> 00:55:24.759 +Let me show something else... I was + +00:55:24.760 --> 00:55:27.119 +able to translate a good part of the + +00:55:27.120 --> 00:55:33.039 +Lua parser, here, to ELpeg1.lua... I haven't + +00:55:33.040 --> 00:55:38.399 +finished yet, but I have most of the + +00:55:38.400 --> 00:55:39.719 +the translation here... -50:15.560 --> 50:22.320 -When we build a table and we say that the first element of the table is here, this element +00:55:39.720 --> 00:55:47.279 +and after having all that I was able to -50:22.320 --> 50:30.600 -is put at the end of the table. After that we say D equals to say 42. We are putting +00:55:47.280 --> 00:55:50.319 +build other grammars very quickly... -50:30.600 --> 50:39.880 -the 42 in the slot whose key is D. This was happening with lpeg captures but there was +00:55:50.320 --> 00:55:55.239 +writing new parsers finally became fun. -50:39.880 --> 50:49.320 -something very strange. These group captures could hold more than one capture, more than +00:55:55.240 --> 00:55:58.719 +And here's one example that I showed in the -50:49.320 --> 50:57.400 -one value. So there was something between lists and tables. I started to use this notation +00:55:58.720 --> 00:56:00.639 +beginning. -50:57.400 --> 51:09.840 -to explain in my notation what they were doing. Many things started to make sense, many mysterious +00:56:00.640 --> 00:56:05.799 +If I remember correctly... -51:09.840 --> 51:20.480 -sentences in the manual started to make sense but some didn't. But at least I was able to +00:56:05.800 --> 00:56:10.639 +I took a figure from the Wikipedia... -51:20.480 --> 51:26.960 -send some intelligent questions to the mailing list and the author of Lua and LPEG answered +00:56:10.640 --> 00:56:12.439 +I don't have its link now... -51:26.960 --> 51:35.920 -some of them. He was not very happy about my questions. He told me that those diagrams +00:56:12.440 --> 00:56:17.079 +but I specified a grammar that parses -51:35.920 --> 51:47.280 -were a waste of time, the manual was perfectly clear and so on, whatever. So it was weird, +00:56:17.080 --> 00:56:20.119 +exactly the example that appears -51:47.280 --> 51:56.440 -but I was able to understand lots of things from his answers. So this is a copy of one +00:56:20.120 --> 00:56:20.839 +in the Wikipedia... -51:56.440 --> 52:02.040 -of my messages, then there's another one, another one, some of the diagrams. Then he +00:56:20.840 --> 00:56:24.679 +so, with my grammar, considering that -52:02.040 --> 52:10.080 -complained about these diagrams, he said that these things here that look like table constructions +00:56:24.680 --> 00:56:28.719 +the top level entry is "Stmt", when I -52:10.080 --> 52:22.720 -do not exist, whatever. Anyway, once I understood group captures, many features were very easy +00:56:28.720 --> 00:56:30.679 +parse this string here -52:22.720 --> 52:30.800 -to understand and I started to be able to use lpeg to build some very interesting things. +00:56:30.680 --> 00:56:36.599 +the result is this tree... -52:30.800 --> 52:39.600 -I was able to reproduce some of the features that I saw in lpegrex. Remember that this +00:56:36.600 --> 00:56:41.119 +and I can do some operations on that, -52:39.600 --> 52:53.400 -is a syntax of Lua. Here I was able to understand how these things here were translated to lpeg +00:56:41.120 --> 00:56:44.039 +I can define how this thing is to be -52:53.400 --> 53:02.880 -code, to lpeg patterns by using group captures in a certain way. I was able to implement +00:56:44.040 --> 00:56:45.639 +converted into LaTeX, -53:02.880 --> 53:13.080 -them in ELpeg1.lua. after some time I was able to use ELpeg1.lua to build grammars that +00:56:45.640 --> 00:56:49.399 +I can define other operations -53:13.080 --> 53:21.080 -were able to parse arithmetical expressions with the right precedence. here's an example +00:56:49.400 --> 00:56:52.999 +that convert trees into other trees, and -53:21.080 --> 53:26.920 -in which I built the grammar step by step and I test the current grammar and I replace +00:56:53.000 --> 00:56:54.879 +here are some tests of these operations... -53:26.920 --> 53:34.400 -a bit and then I test the new grammar and so on. You can see that the result is +00:56:54.880 --> 00:57:00.359 +This is what I showed in the beginning... -53:34.400 --> 53:48.720 -always a tree that is drawn in a nice two dimensional way. At this point, these powers +00:57:00.360 --> 00:57:02.759 +I'm not going to explain all the details -53:48.720 --> 53:57.760 -here are returned as a list, as an operation power with several arguments here and then +00:57:02.760 --> 00:57:03.999 +of this thing now... -53:57.760 --> 54:05.560 -I apply a kind of parsing combinator here that transforms these trees into other trees +00:57:04.000 --> 00:57:09.199 +this :show() converts this thing -54:05.560 --> 54:14.200 -and with these combinators here I can specify that the power is associative in a certain +00:57:09.200 --> 00:57:11.919 +into LaTeX in the way specified by these -54:14.200 --> 54:22.320 -direction, the division is associative in another direction, the minus uses the same +00:57:11.920 --> 00:57:16.159 +instructions here, that says that... -54:22.320 --> 54:29.520 -direction as a division and so on and they have the right precedences. So here are the +00:57:16.160 --> 00:57:25.239 +well, whatever... -54:29.520 --> 54:42.360 -tests. So here's my file ELpeg.lua, it has several classes. Each class has tests after +00:57:25.240 --> 00:57:32.959 +and here's the result - the LaTeXed result... -54:42.360 --> 54:52.040 -it. I was able to implement something that lpeg.rex has that's called keywords, that's +00:57:32.960 --> 00:57:41.759 +and these diagrams here are generated by -54:52.040 --> 54:59.160 -very useful for parsing problems in programming languages. I was able to implement something +00:57:41.760 --> 00:57:46.719 +this file here, that defines a simple -54:59.160 --> 55:10.640 -similar to the debugger, to the pack debugger that lpeg uses, but I was frustrated by some +00:57:46.720 --> 00:57:48.479 +grammar that parses this thing here, -55:10.640 --> 55:23.280 -limitations of the debugger and I implemented my own that is much better and let me show +00:57:48.480 --> 00:57:51.999 +and then LaTeXes it in a certain way, and -55:23.280 --> 55:33.800 -something else. I was able to translate a good part of the Lua parser here to lpeg1.lua. +00:57:52.000 --> 00:57:56.399 +and also tests to check if this code here... -55:33.800 --> 55:45.880 -I haven't finished yet but I have most of the translation here and after having all +00:57:56.400 --> 00:58:01.999 +this Lua code that generates an lpeg grammar... -55:45.880 --> 55:54.960 -that I was able to build other grammars very quickly. Writing new parsers finally became +00:58:02.000 --> 00:58:05.799 +parses this subject here and -55:54.960 --> 56:08.560 -fun and here's one example that I showed in the beginning. If I remember correctly, I +00:58:05.800 --> 00:58:08.599 +returns the expected result... -56:08.560 --> 56:15.680 -took a figure from the Wikipedia, I don't have its link now, but I specify a grammar +00:58:08.600 --> 00:58:12.239 +So: this is the code that I -56:15.680 --> 56:24.280 -that parses exactly the example that appears in the Wikipedia. So with my grammar, considering +00:58:12.240 --> 00:58:16.719 +wanted to show. I wanted to show many -56:24.280 --> 56:36.680 -that the top level entry is statement, when I parse this string here, the result is this +00:58:16.720 --> 00:58:19.919 +more things but I wasn't able to prepare -56:36.680 --> 56:44.840 -tree and I can do some operations on that. I can define how this thing is to be converted +00:58:19.920 --> 00:58:23.919 +them before the conference... and I hope -56:44.840 --> 56:53.400 -into LaTeX. I can define other operations that convert trees into other trees and here's +00:58:23.920 --> 00:58:27.519 +that soon - for some value of "soon" - -56:53.400 --> 57:01.760 -some tests of these operations. This is what I showed in the beginning. I'm not going to +00:58:27.520 --> 00:58:30.399 +I'll be able to create REPL-based -57:01.760 --> 57:10.480 -explain all the details of this thing now. This show converts this thing into LaTeX in +00:58:30.400 --> 00:58:33.919 +tutorials for lpeg, Re, and ELpeg1.lua... -57:10.480 --> 57:39.320 -the way specified by these instructions here. And here's the result, the LaTeX result. +00:58:33.920 --> 00:58:36.319 +where lpeg is something very famous, -57:39.320 --> 57:46.880 -These diagrams here are generated by this file here that defines a simple grammar that +00:58:36.320 --> 00:58:39.199 +Re is a module of lpeg... -57:46.880 --> 57:56.720 -parses this thing here and then LaTeX it in a certain way and also tests to check if this +00:58:39.200 --> 00:58:42.399 +I could also do something like this -57:56.720 --> 58:06.600 -code here that is Lua code that generates an lpeg grammar, parses this subject here, and +00:58:42.400 --> 00:58:47.799 +for lpegrex... and ELpeg1.lua is -58:06.600 --> 58:16.880 -returns the expected result. So this is the code that I wanted to show. I wanted to show +00:58:47.800 --> 00:58:51.159 +the thing that I wrote, the one that -58:16.880 --> 58:23.920 -many more things, but I wasn't able to prepare them before the conference. And I hope that +00:58:51.160 --> 00:58:56.799 +has test in comments, and the tests -58:23.920 --> 58:33.240 -soon, for some value of soon, I'll be able to create REPL based tutorials for LPG, G and +00:58:56.800 --> 00:58:59.519 +usually generate trees, and sometimes -58:33.240 --> 58:42.080 -ELpeg1.Lua where Lpeg is something very famous. Here is a module of LPG. I could also do something +00:58:59.520 --> 00:59:00.879 +they generate TeX code. -58:42.080 --> 58:55.600 -like this for ELpeg, and ELpeg1.lua is the thing that I wrote, the one that has tests in comments +00:59:00.880 --> 00:59:04.959 +Yeah, so that's it! I wanted to -58:55.600 --> 59:04.920 -and the tests usually generate trees and sometimes they generate tag code. So that's it, I wanted +00:59:04.960 --> 00:59:07.159 +present much more but I wasn't able to -59:04.920 --> 59:26.040 -to present much more, but I wasn't able to prepare it. So sorry, thanks, bye! +00:59:07.160 --> 00:59:10.480 +prepare it... so: sorry, thanks, bye! =) diff --git a/2023/info/emacsconf-before.md b/2023/info/emacsconf-before.md index 272a7eb5..9943c347 100644 --- a/2023/info/emacsconf-before.md +++ b/2023/info/emacsconf-before.md @@ -32,6 +32,6 @@ Status: Q&A to be extracted from the room recordings # Q&A -
Duration: 2:00:43 minutes
+
Listen to just the audio:
Duration: 2:00:43 minutes
# Description \ No newline at end of file diff --git a/2023/info/flat-before.md b/2023/info/flat-before.md index f86d6444..9ba28750 100644 --- a/2023/info/flat-before.md +++ b/2023/info/flat-before.md @@ -7,6 +7,6 @@ Status: Q&A to be extracted from the room recordings -
Duration: 22:20 minutes
+
Duration: 22:20 minutes
# Description \ No newline at end of file diff --git a/2023/info/one-before.md b/2023/info/one-before.md index 6bb07001..0756ab65 100644 --- a/2023/info/one-before.md +++ b/2023/info/one-before.md @@ -27,6 +27,6 @@ Status: Q&A to be extracted from the room recordings # Q&A -
Duration: 27:39 minutes
+
Listen to just the audio:
Duration: 27:39 minutes
# Description \ No newline at end of file diff --git a/2023/info/repl-after.md b/2023/info/repl-after.md index d2819d68..a4ebf48c 100644 --- a/2023/info/repl-after.md +++ b/2023/info/repl-after.md @@ -1,800 +1,6 @@ - -# Transcript - - -[[!template new="1" text="""Intro""" start="00:00:00.000" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""Hi, my name is Eduardo Ochs""" start="00:00:00.000" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and the title of this talk is""" start="00:00:00.015" video="mainVideo-repl" id="subtitle"]] -[[!template text="""REPLs in Strange Places: Lua, LaTeX,""" start="00:00:05.020" video="mainVideo-repl" id="subtitle"]] -[[!template text="""LPeg, LPegRex, and TikZ.""" start="00:00:07.840" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I'm the author of an Emacs package called eev,""" start="00:00:10.440" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and this is a talk at the EmacsConf 2023,""" start="00:00:13.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that is happening in December 2023 at the Internet.""" start="00:00:17.280" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""Diagrams""" start="00:00:21.560" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""This is one of the examples of diagrams""" start="00:00:21.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that we are going to see.""" start="00:00:24.244" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Let me show how I generated it.""" start="00:00:25.920" video="mainVideo-repl" id="subtitle"]] -[[!template text="""One second, I have to use a smaller font here.""" start="00:00:28.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This is a file called parse32.lua.""" start="00:00:34.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Let me go back to this block of tests again.""" start="00:00:39.080" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Now, if I run this,""" start="00:00:42.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""we get these outputs here at the right.""" start="00:00:46.720" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Then in this line here,""" start="00:00:51.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it generates a PDF,""" start="00:00:53.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and if I type `F8` here,""" start="00:00:55.420" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it shows the PDF in the lower right window.""" start="00:00:57.780" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""eev""" start="00:01:03.320" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""Let me start by explaining briefly what is eev.""" start="00:01:03.320" video="mainVideo-repl" id="subtitle"]] -[[!template text="""First, it's something""" start="00:01:08.920" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that appeared by accident in the mid 90s.""" start="00:01:10.890" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I explained this story in my presentation at EmacsConf 2019.""" start="00:01:14.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It's an Emacs package that is part of ELPA.""" start="00:01:20.640" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It has at least 10 users.""" start="00:01:25.420" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Those are the ones that I know by name.""" start="00:01:28.720" video="mainVideo-repl" id="subtitle"]] -[[!template text="""eev means "Emacs, execute verbosely".""" start="00:01:32.480" video="mainVideo-repl" id="subtitle"]] -[[!template text="""eev is something that treats eval-last-sexp""" start="00:01:36.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""as the central feature of Emacs.""" start="00:01:38.848" video="mainVideo-repl" id="subtitle"]] -[[!template text="""eev blurs the distinction between programmers and users,""" start="00:01:43.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and it replaces the slogan,""" start="00:01:47.280" video="mainVideo-repl" id="subtitle"]] -[[!template text=""""users should not be forced to see Lisp"""" start="00:01:49.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""(that is something that Richard Stallman told me once),""" start="00:01:52.360" video="mainVideo-repl" id="subtitle"]] -[[!template text="""by "users should see Lisp instead of buttons,"""" start="00:01:55.280" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and "new users should see Lisp in the first five minutes."""" start="00:01:59.240" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I'm going to show some examples of that soon.""" start="00:02:03.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""eev uses code in the comments a lot""" start="00:02:08.160" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and also tests in comments.""" start="00:02:11.566" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I changed my way of presenting it,""" start="00:02:14.120" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and it became very REPL-centric""" start="00:02:16.782" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in the last few years, in the sense that""" start="00:02:19.191" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I start by explaining its main features""" start="00:02:22.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""by its support for REPLs.""" start="00:02:26.461" video="mainVideo-repl" id="subtitle"]] -[[!template text="""eev supposes that we want to keep""" start="00:02:29.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""executable notes of everything.""" start="00:02:32.079" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I'm also going to show examples of this in a second.""" start="00:02:34.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""eev has lots of videos for people who hate videos,""" start="00:02:37.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and it tries to do everything""" start="00:02:42.120" video="mainVideo-repl" id="subtitle"]] -[[!template text="""with very little magic and without black boxes.""" start="00:02:44.271" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I'm going to explain many of these things very soon.""" start="00:02:47.640" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""Another figure""" start="00:02:51.360" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""This is a figure that I'm going to show in detail soon""" start="00:02:51.360" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that is about something important about Lua.""" start="00:02:58.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Oops, the font is very bad now,""" start="00:03:01.640" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so let me change the font.""" start="00:03:03.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The figure is this one.""" start="00:03:05.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""What most people do when they visit a file""" start="00:03:09.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""with something interesting in it,""" start="00:03:12.936" video="mainVideo-repl" id="subtitle"]] -[[!template text="""is that they just go there and they set a bookmark there,""" start="00:03:15.280" video="mainVideo-repl" id="subtitle"]] -[[!template text="""or they put the position in the register.""" start="00:03:18.360" video="mainVideo-repl" id="subtitle"]] -[[!template text="""But I prefer to keep links""" start="00:03:22.640" video="mainVideo-repl" id="subtitle"]] -[[!template text="""to everything that is interesting""" start="00:03:29.782" video="mainVideo-repl" id="subtitle"]] -[[!template text="""as an Elisp hyperlink.""" start="00:03:30.222" video="mainVideo-repl" id="subtitle"]] -[[!template text="""For example, this is an Elisp hyperlink to the file""" start="00:03:30.480" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that goes to this anchor here,""" start="00:03:34.237" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and to this string after this anchor.""" start="00:03:36.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This is a variant that opens that file""" start="00:03:39.280" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in the window at the right here,""" start="00:03:43.389" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and this is a sexp that changes the font.""" start="00:03:46.760" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I have a command with a very short name that does that,""" start="00:03:53.640" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but I prefer to keep that as a one-liner.""" start="00:03:57.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""About the videos, we can see""" start="00:04:03.680" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the list of first-class videos of eev by executing this,""" start="00:04:04.282" video="mainVideo-repl" id="subtitle"]] -[[!template text="""`M-x find-1stclassvideos`,""" start="00:04:11.440" video="mainVideo-repl" id="subtitle"]] -[[!template text="""or by running this alias here, `M-x 1c`,""" start="00:04:14.191" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and then what we see is this.""" start="00:04:18.480" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The first sexp here regenerates this buffer,""" start="00:04:21.160" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so we can make a mess here and then run this,""" start="00:04:25.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and the original buffer is regenerated again in a clean way.""" start="00:04:29.120" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Each of these things here""" start="00:04:34.120" video="mainVideo-repl" id="subtitle"]] -[[!template text="""opens a buffer with information about a video.""" start="00:04:36.952" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Let me take a specific example here.""" start="00:04:41.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This video here is about one of the ancestors of this talk""" start="00:04:45.320" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that is a library that I wrote""" start="00:04:50.279" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for creating diagrams in LaTeX""" start="00:04:52.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""using a package called [pict2e-lua] using REPLs.""" start="00:04:56.907" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Anyway, the thing is that if we run a sexp like this one""" start="00:05:03.000" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and we don't have a local copy of the video,""" start="00:05:10.029" video="mainVideo-repl" id="subtitle"]] -[[!template text="""eev will try to load the local copy""" start="00:05:16.315" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and instead of doing that by asking something""" start="00:05:19.582" video="mainVideo-repl" id="subtitle"]] -[[!template text="""like "do you want me to download the local copy"""" start="00:05:20.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""blah, blah, blah, it simply opens a buffer like this.""" start="00:05:25.382" video="mainVideo-repl" id="subtitle"]] -[[!template text="""And if we don't have a local copy yet,""" start="00:05:29.240" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it will open a buffer like this one,""" start="00:05:35.515" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in which these things here in comments""" start="00:05:37.221" video="mainVideo-repl" id="subtitle"]] -[[!template text="""are links to the documentation.""" start="00:05:40.031" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This thing here explains the idea""" start="00:05:42.679" video="mainVideo-repl" id="subtitle"]] -[[!template text="""of local copies of files from the internet.""" start="00:05:45.781" video="mainVideo-repl" id="subtitle"]] -[[!template text="""There are more details here and here,""" start="00:05:50.279" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and this is a script that we can execute line by line.""" start="00:05:54.121" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So instead of this script being hidden behind the button""" start="00:05:59.580" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that we just press after a question""" start="00:06:04.277" video="mainVideo-repl" id="subtitle"]] -[[!template text="""like "do you want me to do something," blah, blah, blah,""" start="00:06:07.160" video="mainVideo-repl" id="subtitle"]] -[[!template text=""""yes or no?", the script is visible here""" start="00:06:10.709" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and we can execute it step by step.""" start="00:06:13.229" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It creates a terminal with a shell here in the right window""" start="00:06:15.380" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and when we type `F8` in these lines here,""" start="00:06:22.458" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the lines are sent to this line.""" start="00:06:26.989" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So this is going to download a copy of the video,""" start="00:06:30.360" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the wget says that I already have a copy of the video""" start="00:06:33.843" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and its subtitles and so on.""" start="00:06:38.135" video="mainVideo-repl" id="subtitle"]] -[[!template text="""And after getting a copy of the video""" start="00:06:40.360" video="mainVideo-repl" id="subtitle"]] -[[!template text="""we can run this exp here and it displays the video.""" start="00:06:45.740" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I said that eev has lots of videos""" start="00:06:52.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for people who hate videos.""" start="00:06:55.487" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The idea is that very few people""" start="00:06:57.436" video="mainVideo-repl" id="subtitle"]] -[[!template text="""are going to watch the videos in real time.""" start="00:07:00.047" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Most of the people that I know, or most of the people""" start="00:07:03.082" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that are interested in eev in some way,""" start="00:07:07.643" video="mainVideo-repl" id="subtitle"]] -[[!template text="""they are going to watch just small sections of the video.""" start="00:07:10.791" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Most of the time, they are just going to""" start="00:07:14.321" video="mainVideo-repl" id="subtitle"]] -[[!template text="""read the subtitles of the video.""" start="00:07:17.575" video="mainVideo-repl" id="subtitle"]] -[[!template text="""For each one of the videos""" start="00:07:19.940" video="mainVideo-repl" id="subtitle"]] -[[!template text="""we have a page about the video...""" start="00:07:22.532" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Let me see if I have internet here...""" start="00:07:25.296" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This is a page. Usually these pages""" start="00:07:29.674" video="mainVideo-repl" id="subtitle"]] -[[!template text="""have a link to another page,""" start="00:07:34.902" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the page that has all the subtitles of the video,""" start="00:07:38.428" video="mainVideo-repl" id="subtitle"]] -[[!template text="""wherever. In this one, it's not so visible.""" start="00:07:43.891" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Anyway, there are several ways of accessing""" start="00:07:48.588" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the subtitles of the video.""" start="00:07:52.002" video="mainVideo-repl" id="subtitle"]] -[[!template text="""One of the ways is by running this sexp here""" start="00:07:53.964" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that opens a file in Lua.""" start="00:07:58.633" video="mainVideo-repl" id="subtitle"]] -[[!template text="""That is what I use to generate the subtitles.""" start="00:08:01.065" video="mainVideo-repl" id="subtitle"]] -[[!template text="""By the way, each one of these things here""" start="00:08:05.440" video="mainVideo-repl" id="subtitle"]] -[[!template text="""is hyperlinked to a position of the video.""" start="00:08:10.369" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If I type this, it goes to that position.""" start="00:08:14.680" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Anyway, let me go back.""" start="00:08:21.281" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So the tutorials of eev, the intros of eev""" start="00:08:24.580" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that start with `find-` and end with `-intro`,""" start="00:08:28.558" video="mainVideo-repl" id="subtitle"]] -[[!template text="""they have lots of blocks that say""" start="00:08:32.351" video="mainVideo-repl" id="subtitle"]] -[[!template text="""video links like this one.""" start="00:08:35.333" video="mainVideo-repl" id="subtitle"]] -[[!template text="""These blocks have links to positions in videos.""" start="00:08:37.613" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If we don't have a local copy of the video yet,""" start="00:08:41.973" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the thing shows us a script""" start="00:08:46.333" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that lets us download the local copy.""" start="00:08:49.016" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""eev-wconfig, magic, and black boxes""" start="00:08:52.560" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""I said that I was going to explain""" start="00:08:52.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""what I mean by magic and black boxes,""" start="00:08:57.441" video="mainVideo-repl" id="subtitle"]] -[[!template text="""this is something that I've been trying""" start="00:09:01.856" video="mainVideo-repl" id="subtitle"]] -[[!template text="""to explain for a long time""" start="00:09:03.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I think that I got a very good explanation about that""" start="00:09:05.112" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in a video that I made about something called eev-wconfig""" start="00:09:08.762" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that is a tool for configuring eev on Windows without magic,""" start="00:09:12.349" video="mainVideo-repl" id="subtitle"]] -[[!template text="""without buttons that do things,""" start="00:09:17.944" video="mainVideo-repl" id="subtitle"]] -[[!template text="""without explaining what they are doing.""" start="00:09:20.879" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This is a part of the subtitles of the video.""" start="00:09:24.380" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Let me read that.""" start="00:09:28.079" video="mainVideo-repl" id="subtitle"]] -[[!template text="""eev-wconfig is an attempt to solve the problem""" start="00:09:29.446" video="mainVideo-repl" id="subtitle"]] -[[!template text="""of how to install these things on Windows""" start="00:09:32.532" video="mainVideo-repl" id="subtitle"]] -[[!template text="""both without magic and with very little magic.""" start="00:09:35.350" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Remember this slogan: "Any sufficiently advanced technology""" start="00:09:40.040" video="mainVideo-repl" id="subtitle"]] -[[!template text="""is indistinguishable from magic."""" start="00:09:44.942" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here in this video I'm going to use the term magic""" start="00:09:47.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""as a shorthand for sufficiently advanced technology""" start="00:09:51.434" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that is something that is complex and non obvious""" start="00:09:55.263" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and that is indistinguishable from magic""" start="00:09:58.945" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in the sense of being almost impossible to understand.""" start="00:10:01.921" video="mainVideo-repl" id="subtitle"]] -[[!template text="""And I'm also going to use the term black box""" start="00:10:05.840" video="mainVideo-repl" id="subtitle"]] -[[!template text="""as a near synonym for magic""" start="00:10:09.273" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and sometimes the term black box is more convenient""" start="00:10:11.409" video="mainVideo-repl" id="subtitle"]] -[[!template text="""even though it's a bit longer,""" start="00:10:15.218" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it has more letters because when I use the term black box""" start="00:10:17.489" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it invites us to use expressions""" start="00:10:21.334" video="mainVideo-repl" id="subtitle"]] -[[!template text="""like opening the black box""" start="00:10:23.522" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I'm going to use that expression a lot.""" start="00:10:27.873" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Now let me try to explain what is. Sorry,""" start="00:10:34.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""let me change the font.""" start="00:10:40.900" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""Lua""" start="00:10:44.240" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""What is Lua?""" start="00:10:44.240" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Lua is a minimalistic language""" start="00:10:45.240" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in the sense of battery is not included.""" start="00:10:48.646" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It uses associative tables for most of its data structures.""" start="00:10:53.040" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It's so minimalistic""" start="00:10:57.988" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that the default print function""" start="00:11:00.875" video="mainVideo-repl" id="subtitle"]] -[[!template text="""when we create an associative table and we ask it to print--""" start="00:11:05.148" video="mainVideo-repl" id="subtitle"]] -[[!template text="""we ask print to print an associative table--""" start="00:11:11.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it just prints the address of the table.""" start="00:11:14.915" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here are some examples. Here is a table""" start="00:11:17.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and when we ask to print it,""" start="00:11:20.903" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it just says that it's the table at this address here.""" start="00:11:23.297" video="mainVideo-repl" id="subtitle"]] -[[!template text="""One of the things that most people do""" start="00:11:28.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""when they start using Lua is that either""" start="00:11:30.894" video="mainVideo-repl" id="subtitle"]] -[[!template text="""they download a package with a print to printing function""" start="00:11:33.587" video="mainVideo-repl" id="subtitle"]] -[[!template text="""or they write their own print to printing functions.""" start="00:11:36.314" video="mainVideo-repl" id="subtitle"]] -[[!template text="""My own print to printing function""" start="00:11:39.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""is called PP with upper case letters,""" start="00:11:41.976" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and it works like this.""" start="00:11:44.451" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It prints associative tables in a way like this.""" start="00:11:46.758" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It says that for the key 1,""" start="00:11:52.073" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the value associated to it is 2;""" start="00:11:54.126" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for the key 2, the value is 3;""" start="00:11:56.603" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and for the key 3, the value is 5.""" start="00:11:59.079" video="mainVideo-repl" id="subtitle"]] -[[!template text="""When I started using Lua, one of my favorite languages""" start="00:12:09.240" video="mainVideo-repl" id="subtitle"]] -[[!template text="""was also a language that used associative tables a lot.""" start="00:12:12.380" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It was called Icon. I had to write my own""" start="00:12:16.624" video="mainVideo-repl" id="subtitle"]] -[[!template text="""print to printing functions for Icon,""" start="00:12:20.340" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so I just had to port my print to printing functions to Lua.""" start="00:12:23.395" video="mainVideo-repl" id="subtitle"]] -[[!template text="""My first version looked something like this.""" start="00:12:29.426" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it just had some global functions. Lots of them actually.""" start="00:12:34.351" video="mainVideo-repl" id="subtitle"]] -[[!template text="""After a while, I rewrote it.""" start="00:12:40.080" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I rewrote it again and again and again.""" start="00:12:41.934" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This is one of the versions""" start="00:12:44.504" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that is not even the default at this point.""" start="00:12:48.398" video="mainVideo-repl" id="subtitle"]] -[[!template text="""`tos` is for to string. This is a demo.""" start="00:12:53.752" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It's very modular, so it's easy to replace parts of it""" start="00:12:57.703" video="mainVideo-repl" id="subtitle"]] -[[!template text="""or to toggle flags. This is an example.""" start="00:13:02.906" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If I try to print the table of methods for a certain class--""" start="00:13:06.568" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I only need a smaller font--it prints the table like this""" start="00:13:11.798" video="mainVideo-repl" id="subtitle"]] -[[!template text="""with the names of the methods""" start="00:13:16.246" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and then links to the source code of the functions.""" start="00:13:18.511" video="mainVideo-repl" id="subtitle"]] -[[!template text="""These links only make sense in Emacs and in eev.""" start="00:13:22.360" video="mainVideo-repl" id="subtitle"]] -[[!template text="""When we run a link like this one,""" start="00:13:26.672" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it shows the source code and the window at the right.""" start="00:13:30.297" video="mainVideo-repl" id="subtitle"]] -[[!template text="""For some functions, the source code is three lines.""" start="00:13:34.014" video="mainVideo-repl" id="subtitle"]] -[[!template text="""For other ones, it's one line and whatever.""" start="00:13:38.648" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Anyway, let me go back.""" start="00:13:42.320" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Lua can be used in many different styles.""" start="00:13:44.150" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Most people hate other people's styles.""" start="00:13:47.491" video="mainVideo-repl" id="subtitle"]] -[[!template text="""When I started using it in the year 2000,""" start="00:13:52.240" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I learned most of the basic language in a single day.""" start="00:13:55.253" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It was very similar to things that I was already using.""" start="00:13:59.567" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Then I rewrote the mini language""" start="00:14:04.043" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that I was using to generate the HTML for my pages in Lua.""" start="00:14:08.389" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Actually, I had to rewrite it many times""" start="00:14:15.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but the first version I certainly did""" start="00:14:17.592" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in my first weeks or first months using Lua.""" start="00:14:21.368" video="mainVideo-repl" id="subtitle"]] -[[!template text="""In the beginning, I was just using it for writing programs""" start="00:14:25.740" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that either didn't take any input at all""" start="00:14:29.654" video="mainVideo-repl" id="subtitle"]] -[[!template text="""because the input was already in the source file,""" start="00:14:32.877" video="mainVideo-repl" id="subtitle"]] -[[!template text="""or that worked as a Unix function:""" start="00:14:36.728" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the Unix programs that would read files,""" start="00:14:39.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""process these files in some way, and output something.""" start="00:14:42.452" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I mentioned the basic language here,""" start="00:14:49.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I only learned how to use closures, meta tables,""" start="00:14:52.201" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and coroutines many years later.""" start="00:14:55.626" video="mainVideo-repl" id="subtitle"]] -[[!template text="""In the beginning when I started using Lua""" start="00:15:00.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it didn't have a package manager.""" start="00:15:02.589" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It appeared later. It is called luarocks.""" start="00:15:04.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It has had this package manager for several years.""" start="00:15:08.300" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Most of the rocks for luarocks are poorly documented""" start="00:15:13.180" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and hacker-unfriendly.""" start="00:15:17.243" video="mainVideo-repl" id="subtitle"]] -[[!template text="""You can't rely just on the documentation.""" start="00:15:18.898" video="mainVideo-repl" id="subtitle"]] -[[!template text="""You can't rely just on the source code,""" start="00:15:22.080" video="mainVideo-repl" id="subtitle"]] -[[!template text="""because--I mean, if you're a genius, of course you can,""" start="00:15:25.189" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but for people who are either""" start="00:15:28.707" video="mainVideo-repl" id="subtitle"]] -[[!template text="""lazy or dumb or whatever like me, or unfocused,""" start="00:15:31.545" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the source code is hard to understand""" start="00:15:35.896" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and hard to tinker with.""" start="00:15:39.491" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Some rocks are excellent.""" start="00:15:41.760" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The best rocks are well documented,""" start="00:15:43.761" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but they are hacker-unfriendly""" start="00:15:46.453" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in the sense that I hope that I'll be able to explain soon.""" start="00:15:48.760" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The best rocks use local variables and meta tables a lot,""" start="00:15:53.640" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so if you are a beginner learning Lua""" start="00:15:59.467" video="mainVideo-repl" id="subtitle"]] -[[!template text="""you're not going to understand what their source codes do.""" start="00:16:02.906" video="mainVideo-repl" id="subtitle"]] -[[!template text="""They use lots of dirty tricks.""" start="00:16:08.246" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""Object orientation in Lua""" start="00:16:10.960" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""Let me talk a bit about object orientation in Lua.""" start="00:16:10.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It can be done in many ways. The main book about Lua""" start="00:16:14.360" video="mainVideo-repl" id="subtitle"]] -[[!template text="""called Programming in Lua""" start="00:16:18.276" video="mainVideo-repl" id="subtitle"]] -[[!template text="""by one of the authors of the language""" start="00:16:20.141" video="mainVideo-repl" id="subtitle"]] -[[!template text="""called Roberto Ierusalimschy""" start="00:16:22.866" video="mainVideo-repl" id="subtitle"]] -[[!template text="""presents several ways of doing object orientation in Lua.""" start="00:16:24.730" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I hated all of these ways,""" start="00:16:28.680" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and also the ways that I tried from the rocks.""" start="00:16:31.387" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Then I wrote my own way""" start="00:16:36.057" video="mainVideo-repl" id="subtitle"]] -[[!template text="""of doing object orientation in Lua.""" start="00:16:37.934" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It's very minimalistic. It's in this file here eoo.lua.""" start="00:16:40.348" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The main code is just these five lines here.""" start="00:16:45.654" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here's an example of how it works.""" start="00:16:49.899" video="mainVideo-repl" id="subtitle"]] -[[!template text="""We define a class vector with some meta methods.""" start="00:16:56.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This meta method here will tell Lua""" start="00:17:03.002" video="mainVideo-repl" id="subtitle"]] -[[!template text="""what to do when the user asks to add two vectors.""" start="00:17:06.295" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This one here tells Lua what to do""" start="00:17:10.868" video="mainVideo-repl" id="subtitle"]] -[[!template text="""when the user asks Lua to convert a vector to a string""" start="00:17:13.987" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and whatever. This one is something""" start="00:17:18.889" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that I'm going to explain in a second.""" start="00:17:22.008" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here we create a vector""" start="00:17:25.580" video="mainVideo-repl" id="subtitle"]] -[[!template text="""with these coordinates 3 and 4.""" start="00:17:25.580" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here we create another vector.""" start="00:17:25.581" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If we print here,""" start="00:17:31.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""then Lua uses the function here in the `__tostring`.""" start="00:17:33.031" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If we add two vectors""" start="00:17:37.154" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it uses the function here in the `__add` meta method.""" start="00:17:38.908" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If we run the method `norm`,""" start="00:17:42.654" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it is defined here in the table index.""" start="00:17:45.045" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Anyway, even with this thing being so small,""" start="00:17:51.680" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I used to forget how it works all the time.""" start="00:17:57.676" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Actually, I always forget how things work,""" start="00:18:04.618" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I have to remember them somehow.""" start="00:18:08.201" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I have to have tricks for remembering,""" start="00:18:11.348" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and tricks for summarizing things and diagrams, and so on.""" start="00:18:14.921" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Every time that I forgot how this thing worked,""" start="00:18:19.770" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I went back to the source code""" start="00:18:23.310" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and then I looked at the diagrams,""" start="00:18:25.461" video="mainVideo-repl" id="subtitle"]] -[[!template text="""or, of course, the first time,""" start="00:18:28.149" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I had to draw the diagrams. I run the examples.""" start="00:18:30.995" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Of course, in the beginning""" start="00:18:33.801" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I thought that the code was clear.""" start="00:18:35.540" video="mainVideo-repl" id="subtitle"]] -[[!template text="""My examples were very brief.""" start="00:18:37.504" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So I had to rewrite the examples many times""" start="00:18:39.738" video="mainVideo-repl" id="subtitle"]] -[[!template text="""until they became let's say perfect.""" start="00:18:43.566" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I was saying that Lua can be used in many ways""" start="00:18:50.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and in my way of using Lua, in my favorite way,""" start="00:18:54.091" video="mainVideo-repl" id="subtitle"]] -[[!template text="""everything can be inspected and modified from REPLs""" start="00:18:58.404" video="mainVideo-repl" id="subtitle"]] -[[!template text="""like we can do in Emacs and in SmallTalk, sort of.""" start="00:19:03.076" video="mainVideo-repl" id="subtitle"]] -[[!template text="""In my favorite way of using Lua""" start="00:19:06.818" video="mainVideo-repl" id="subtitle"]] -[[!template text="""there's no security at all.""" start="00:19:09.437" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Everything can be changed at all times.""" start="00:19:11.532" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Of course, most people hate that.""" start="00:19:17.460" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""My init file""" start="00:19:19.823" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""My init file has lots of classes,""" start="00:19:19.823" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and by the way, instead of""" start="00:19:22.186" video="mainVideo-repl" id="subtitle"]] -[[!template text="""keeping many small files with many things,""" start="00:19:24.702" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I put lots of stuff in just one big init file.""" start="00:19:28.637" video="mainVideo-repl" id="subtitle"]] -[[!template text="""My init file has lots of classes,""" start="00:19:33.000" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and lots of global functions and lots of cruft,""" start="00:19:35.521" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so people hate that, of course.""" start="00:19:39.188" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This is an example.""" start="00:19:43.700" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This is the index at the top of my init file.""" start="00:19:46.341" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The classes start here. Then we have some functions""" start="00:19:52.416" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and then we have functions that load certain packages,""" start="00:19:57.542" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and then we have cruft, whatever.""" start="00:20:02.480" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Most people think that my style of using Lua""" start="00:20:06.580" video="mainVideo-repl" id="subtitle"]] -[[!template text="""is dirty and dangerous,""" start="00:20:08.924" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and they wouldn't touch my Lua code with a 10 feet pole,""" start="00:20:10.123" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but most of the things""" start="00:20:14.288" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that I'm going to present here in this presentation""" start="00:20:15.969" video="mainVideo-repl" id="subtitle"]] -[[!template text="""are ideas that should be easy to port to other environments""" start="00:20:19.257" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and other languages, especially the diagrams,""" start="00:20:23.051" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so the code is not so important.""" start="00:20:27.739" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""LaTeX and LuaLaTeX""" start="00:20:31.000" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""Now let me talk a bit about LaTeX, LuaLaTeX,""" start="00:20:31.000" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that is LaTeX with the Lua interpreter embedded inside""" start="00:20:34.641" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and two ways of generating pictures in LaTeX:""" start="00:20:39.250" video="mainVideo-repl" id="subtitle"]] -[[!template text="""TikZ that is very famous,""" start="00:20:43.183" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and Pict2e that is not very famous""" start="00:20:45.116" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and that is very low level,""" start="00:20:48.312" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I think that not many people use.""" start="00:20:50.645" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I said before that when I learned Lua,""" start="00:20:53.840" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I realized that it was very good""" start="00:20:57.049" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for writing literal languages.""" start="00:21:00.355" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I was doing my PhD at the time""" start="00:21:03.360" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and typesetting the diagrams for my PhD thesis""" start="00:21:05.987" video="mainVideo-repl" id="subtitle"]] -[[!template text="""was very boring.""" start="00:21:09.970" video="mainVideo-repl" id="subtitle"]] -[[!template text="""One of the things that I did was that""" start="00:21:11.240" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I created a literal language""" start="00:21:13.865" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for typesetting the diagrams for me.""" start="00:21:15.721" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It was called Dednat because initially""" start="00:21:19.340" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it only generated diagrams for natural deduction""" start="00:21:22.822" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and then it had several versions.""" start="00:21:26.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""These are the slides from my presentation about Dednat6""" start="00:21:30.440" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and Dednat6 is an extensible semi preprocessor""" start="00:21:34.380" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for LuaLaTeX that understands diagrams in ASCII art""" start="00:21:38.991" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in the sense that when I have a TeX file that has this,""" start="00:21:43.692" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and when Dednat6 is loaded,""" start="00:21:49.035" video="mainVideo-repl" id="subtitle"]] -[[!template text="""when I get the right comments,""" start="00:21:52.144" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Dednat6 interprets this block here""" start="00:21:55.709" video="mainVideo-repl" id="subtitle"]] -[[!template text="""as something that defines this diagram.""" start="00:22:00.343" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It interprets this diagram here,""" start="00:22:05.096" video="mainVideo-repl" id="subtitle"]] -[[!template text="""this diagram in the comments here,""" start="00:22:07.829" video="mainVideo-repl" id="subtitle"]] -[[!template text="""as something that defines a diagram called `foo`,""" start="00:22:10.644" video="mainVideo-repl" id="subtitle"]] -[[!template text="""a deduction called `foo`, and it generates this code here""" start="00:22:16.433" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so that we can just invoke the definition of the deduction""" start="00:22:23.065" video="mainVideo-repl" id="subtitle"]] -[[!template text="""by typing `\ded{foo}`.""" start="00:22:28.868" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Dednat6 also supports another language""" start="00:22:31.720" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for typesetting bidimensional diagrams with arrows and stuff""" start="00:22:36.149" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for category theory and blah blah.""" start="00:22:40.580" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The specifications of these diagrams""" start="00:22:43.123" video="mainVideo-repl" id="subtitle"]] -[[!template text="""look like this. Here is a very good example.""" start="00:22:46.100" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This is a huge diagram. Sorry, one second.""" start="00:22:53.866" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So the source code that generates this diagram here""" start="00:23:00.940" video="mainVideo-repl" id="subtitle"]] -[[!template text="""is just this thing at the left. It's very visual.""" start="00:23:04.758" video="mainVideo-repl" id="subtitle"]] -[[!template text="""We can typeset the diagram in ASCII art here.""" start="00:23:08.629" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Then in this part here,""" start="00:23:11.843" video="mainVideo-repl" id="subtitle"]] -[[!template text="""we tell how the nodes are to be joined,""" start="00:23:14.435" video="mainVideo-repl" id="subtitle"]] -[[!template text="""which arrows have to have annotations, and so on.""" start="00:23:18.274" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This language is extensible in the sense that""" start="00:23:22.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""here, comments that start""" start="00:23:30.951" video="mainVideo-repl" id="subtitle"]] -[[!template text="""with `%:` are interpreted as definitions""" start="00:23:37.280" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for tree diagrams,""" start="00:23:42.691" video="mainVideo-repl" id="subtitle"]] -[[!template text="""lines that start with `%D`""" start="00:23:44.820" video="mainVideo-repl" id="subtitle"]] -[[!template text="""define 2D diagrams with arrows and stuff,""" start="00:23:49.395" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and lines that start with command `%L`""" start="00:23:53.762" video="mainVideo-repl" id="subtitle"]] -[[!template text="""contain blocks of Lua code that we can use""" start="00:23:57.684" video="mainVideo-repl" id="subtitle"]] -[[!template text="""to extend the interpreter on the flag.""" start="00:24:01.198" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Anyway, here are some recent examples""" start="00:24:05.528" video="mainVideo-repl" id="subtitle"]] -[[!template text="""of diagrams that I used Dednat6 to typeset.""" start="00:24:09.747" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This diagram here was generated by this specification here,""" start="00:24:16.147" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and this diagram here with the curved arrows""" start="00:24:24.495" video="mainVideo-repl" id="subtitle"]] -[[!template text="""was generated by this specification here.""" start="00:24:30.620" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Dednat6 was very easy to extend.""" start="00:24:36.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""At some point I started to use it to generate diagrams""" start="00:24:39.175" video="mainVideo-repl" id="subtitle"]] -[[!template text="""using Pict2e, mainly for the classes""" start="00:24:43.044" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that I give at the university,""" start="00:24:46.068" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I teach mathematics in a place.""" start="00:24:49.674" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Let me show an animation. Here is a diagram""" start="00:24:53.862" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that I generated with Dednat6.""" start="00:24:58.980" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It is a flipbook animation,""" start="00:25:02.326" video="mainVideo-repl" id="subtitle"]] -[[!template text="""we type page up and page down,""" start="00:25:05.386" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and we go to the next page of the book""" start="00:25:08.254" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and to the previous page of the book.""" start="00:25:10.784" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here is the source code that generates that.""" start="00:25:13.249" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This source code is not very visual,""" start="00:25:16.925" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so it's quite clumsy to edit""" start="00:25:19.701" video="mainVideo-repl" id="subtitle"]] -[[!template text="""a diagram directly in the TeX file like that.""" start="00:25:21.800" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""Manim""" start="00:25:28.280" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""These diagrams were inspired by something called Manim.""" start="00:25:28.280" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I've forgotten the name of the guy, but it's a guy""" start="00:25:33.438" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that makes many videos about mathematics,""" start="00:25:36.714" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and he created this library called Manim""" start="00:25:39.347" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for generating his animations.""" start="00:25:43.374" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Other people adapted his library to make it more accessible.""" start="00:25:46.418" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I tried to learn it, but each animation,""" start="00:25:52.084" video="mainVideo-repl" id="subtitle"]] -[[!template text="""even an animation with very few frames,""" start="00:25:55.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""each animation took ages to render, so it wasn't fun.""" start="00:25:59.192" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Animations and PDFs can be rendered in seconds,""" start="00:26:03.771" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so these things were fun for me""" start="00:26:08.346" video="mainVideo-repl" id="subtitle"]] -[[!template text="""because my laptop is very slow and Manim was not fun.""" start="00:26:11.161" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Anyway, writing code like this inside a TeX file""" start="00:26:17.440" video="mainVideo-repl" id="subtitle"]] -[[!template text="""was not very fun because it was hard to debug.""" start="00:26:24.264" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""Generating diagrams from REPLs""" start="00:26:30.880" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""In 2022, I started to play with ways""" start="00:26:30.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""of generating these diagrams from REPLs""" start="00:26:36.511" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I found a way for Pict2e and a way for Tikz.""" start="00:26:42.000" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Each one of these ways became a video.""" start="00:26:46.310" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If you go to the list of first class videos of eev,""" start="00:26:49.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""you're going to see""" start="00:26:53.221" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that there's a video about Pict2e here""" start="00:26:55.089" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and a video about Tikz.""" start="00:26:59.011" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here you have some information""" start="00:27:01.159" video="mainVideo-repl" id="subtitle"]] -[[!template text="""like length and explanation, etc.""" start="00:27:04.188" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here are the pages for these videos.""" start="00:27:07.509" video="mainVideo-repl" id="subtitle"]] -[[!template text="""My page about the video about Pict2e is like this.""" start="00:27:11.514" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It has some diagrams. This one is much nicer.""" start="00:27:15.992" video="mainVideo-repl" id="subtitle"]] -[[!template text="""A lot of people watched that video. I mean,""" start="00:27:20.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I thought that 250 people watched it.""" start="00:27:26.606" video="mainVideo-repl" id="subtitle"]] -[[!template text="""For me, that's a million of people.""" start="00:27:31.080" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This video is about how to extract diagrams""" start="00:27:35.345" video="mainVideo-repl" id="subtitle"]] -[[!template text="""from the Tikz manual, and how to run those examples in REPL""" start="00:27:40.403" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and modify them bit by bit. This is a screenshot.""" start="00:27:46.513" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Let me go back. At that point,""" start="00:27:52.937" video="mainVideo-repl" id="subtitle"]] -[[!template text="""these things were just prototypes,""" start="00:27:57.433" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the code was not very nice,""" start="00:28:01.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and in this year I wrote...""" start="00:28:04.804" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I was able to unify those two ways of generating PDFs,""" start="00:28:07.593" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the one for Tikz and the one for Pict2e.""" start="00:28:12.124" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I unified them with many other things""" start="00:28:15.666" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that generated diagrams.""" start="00:28:19.197" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The basis of these things is something called Show2.lua.""" start="00:28:21.299" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I'm not going to just show its details now,""" start="00:28:28.431" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but it's an extension that generates Tikz code.""" start="00:28:33.936" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It's just this. We can specify a diagram""" start="00:28:38.776" video="mainVideo-repl" id="subtitle"]] -[[!template text="""with just a block like this, and then if we run `show00`,""" start="00:28:43.306" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it returns a string""" start="00:28:50.539" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that is just the inner body of the TeX file.""" start="00:28:53.695" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If we run this, we see the whole TeX file.""" start="00:28:59.480" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If we run this we save the TeX file and""" start="00:29:02.307" video="mainVideo-repl" id="subtitle"]] -[[!template text="""we compile the TeX file to generate a PDF.""" start="00:29:05.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If we run this, we show the PDF""" start="00:29:09.197" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in the lower right window.""" start="00:29:12.558" video="mainVideo-repl" id="subtitle"]] -[[!template text="""That's the same thing for all my recent programs""" start="00:29:15.079" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that generate PDFs. They are all integrated.""" start="00:29:20.027" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here is the basis for all my modules""" start="00:29:23.811" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that generate diagrams with Pict2e.""" start="00:29:28.268" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Its demos are not very interesting.""" start="00:29:31.424" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Let me show some demos of extensions""" start="00:29:34.338" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that do interesting things. This is a diagram""" start="00:29:38.557" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that I created by editing it in a REPL,""" start="00:29:43.724" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I create several Pict objects here.""" start="00:29:47.902" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If I execute this, it compiles the object and""" start="00:29:51.872" video="mainVideo-repl" id="subtitle"]] -[[!template text="""generates a PDF. If I tap this, here is the PDF.""" start="00:29:57.819" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If I just ask Lua to display what is pux here,""" start="00:30:04.524" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it shows the source code in Pict2e of the diagram.""" start="00:30:10.920" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The nice thing is that it is indented,""" start="00:30:17.436" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so it's easy to debug the Pict2e code.""" start="00:30:20.933" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If anyone is interested, the module that does the tricks""" start="00:30:24.349" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for indentation is very easy to understand.""" start="00:30:28.505" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it has lots of tests and test blocks,""" start="00:30:31.948" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I think that its data structures are easy to understand.""" start="00:30:34.921" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Anyway, here is another example, the show is here.""" start="00:30:47.439" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It generates a 3D diagram.""" start="00:30:57.905" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""Parsers""" start="00:31:03.240" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""Now let me talk about parsers""" start="00:31:03.240" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and REPLs in a very strange place.""" start="00:31:05.898" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I mean, using REPLs to build parsers step by step""" start="00:31:08.998" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and replacing parts by more complex parts.""" start="00:31:15.149" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I said that Lua is very minimalistic,""" start="00:31:20.439" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and everybody knows that""" start="00:31:24.493" video="mainVideo-repl" id="subtitle"]] -[[!template text="""implementations of regular expressions""" start="00:31:26.965" video="mainVideo-repl" id="subtitle"]] -[[!template text="""are big and complex. So instead of coming""" start="00:31:30.720" video="mainVideo-repl" id="subtitle"]] -[[!template text="""with full regular expressions,""" start="00:31:33.974" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Lua comes with something called patterns""" start="00:31:36.376" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and a library function called string.match.""" start="00:31:41.321" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here is a copy of the part of the manual""" start="00:31:46.628" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that explains a part of the syntax of patterns.""" start="00:31:50.821" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here's how string.match is described in the manual.""" start="00:31:55.729" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It's just this: looks for the first match of pattern""" start="00:32:00.091" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in the string s, blah blah blah.""" start="00:32:04.537" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Then we have to go to the other section of the manual""" start="00:32:06.546" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that explains patterns. Lua patterns are so simple,""" start="00:32:10.077" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so limited, that they don't even have""" start="00:32:18.198" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the alternation operator.""" start="00:32:23.222" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here is how it is described in the elisp manual,""" start="00:32:26.659" video="mainVideo-repl" id="subtitle"]] -[[!template text="""`\|` specifies an alternative, blah blah blah.""" start="00:32:33.136" video="mainVideo-repl" id="subtitle"]] -[[!template text="""When we want to build more complex regular expressions,""" start="00:32:39.678" video="mainVideo-repl" id="subtitle"]] -[[!template text="""patterns, grammars, etc.,""" start="00:32:45.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""we have to use an external library for that.""" start="00:32:48.366" video="mainVideo-repl" id="subtitle"]] -[[!template text="""No, sorry, a library that is external,""" start="00:32:52.669" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but that was written by one of the authors of Lua itself.""" start="00:32:56.208" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This library is called Lpeg.""" start="00:33:01.472" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Its manual says Lpeg is""" start="00:33:03.944" video="mainVideo-repl" id="subtitle"]] -[[!template text="""a new pattern matching library for Lua""" start="00:33:06.331" video="mainVideo-repl" id="subtitle"]] -[[!template text="""based on parsing expression grammars (PEGs).""" start="00:33:09.654" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The manual is very terse.""" start="00:33:14.773" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I found it incredibly hard to read.""" start="00:33:17.781" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it doesn't have any diagrams.""" start="00:33:21.946" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It has some examples, though.""" start="00:33:25.416" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The Lua wiki has a big page called Lpeg Tutorial""" start="00:33:28.770" video="mainVideo-repl" id="subtitle"]] -[[!template text="""with lots of examples, but it also doesn't have diagrams.""" start="00:33:34.017" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I found some things incredibly hard to understand.""" start="00:33:39.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""For example, this is something""" start="00:33:43.132" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that is in the manual of Lpeg that I saw,""" start="00:33:45.080" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I thought, wow, great, this makes all sense""" start="00:33:48.062" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and this is going to be very useful.""" start="00:33:51.480" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It's a way to build grammars that can be recursive""" start="00:33:53.947" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and they sort of can encode BNF grammars,""" start="00:33:57.280" video="mainVideo-repl" id="subtitle"]] -[[!template text="""we just have to translate the BNF a bit""" start="00:34:01.301" video="mainVideo-repl" id="subtitle"]] -[[!template text="""to get rid of some recursions""" start="00:34:05.129" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and to translate them to something else.""" start="00:34:07.593" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The manual also has some things that I thought,""" start="00:34:10.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""oh no, I don't have any idea of what this thing does.""" start="00:34:14.338" video="mainVideo-repl" id="subtitle"]] -[[!template text="""In fact, I saw these things for the first time""" start="00:34:17.846" video="mainVideo-repl" id="subtitle"]] -[[!template text="""more than 10 years ago, and they only started to make sense""" start="00:34:20.769" video="mainVideo-repl" id="subtitle"]] -[[!template text="""one year ago. One example is group captures.""" start="00:34:27.295" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Lpeg also comes with a module called the re module.""" start="00:34:32.273" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Let me pronounce it in Portuguese, the re module.""" start="00:34:37.835" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Its manual says the re module""" start="00:34:43.183" video="mainVideo-repl" id="subtitle"]] -[[!template text="""provided by the file re.lua in the distribution""" start="00:34:45.742" video="mainVideo-repl" id="subtitle"]] -[[!template text="""supports some odd conventional regular expression syntax""" start="00:34:49.504" video="mainVideo-repl" id="subtitle"]] -[[!template text="""for pattern usage within lpeg. This is a quick reference.""" start="00:34:56.758" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This thing is very brief. It has some nice examples,""" start="00:35:04.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but it's hard to understand anyway.""" start="00:35:08.465" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Here are some comments about""" start="00:35:11.120" video="mainVideo-repl" id="subtitle"]] -[[!template text="""my attempts to learn re.lua. This is a class.""" start="00:35:14.181" video="mainVideo-repl" id="subtitle"]] -[[!template text="""In this case, it's a very small class.""" start="00:35:18.632" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This file implements a `pm` method.""" start="00:35:22.362" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I'm going to show examples of other `pm` methods very soon.""" start="00:35:26.092" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So this is a `pm` method for re.lua""" start="00:35:31.401" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that lets us compare the syntax of lua patterns, lpeg,""" start="00:35:34.697" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and re. See this example here. If we run this,""" start="00:35:40.302" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it loads my version of lpeg, no sorry,""" start="00:35:46.632" video="mainVideo-repl" id="subtitle"]] -[[!template text="""my version of lpegrex. It shows that""" start="00:35:51.380" video="mainVideo-repl" id="subtitle"]] -[[!template text="""when we apply the `pm` method to this Lua pattern,""" start="00:35:56.014" video="mainVideo-repl" id="subtitle"]] -[[!template text="""this lpeg pattern, and this re pattern,""" start="00:36:01.553" video="mainVideo-repl" id="subtitle"]] -[[!template text="""they all give the same results.""" start="00:36:05.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So we can use this kind of thing here to show""" start="00:36:08.239" video="mainVideo-repl" id="subtitle"]] -[[!template text="""how to translate from Lua patterns that are familiar""" start="00:36:11.513" video="mainVideo-repl" id="subtitle"]] -[[!template text="""because they are similar to regular expressions,""" start="00:36:15.589" video="mainVideo-repl" id="subtitle"]] -[[!template text="""only weaker, to lpeg that is super weird,""" start="00:36:19.280" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and to re that is not so weird.""" start="00:36:25.252" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Anyway, the comment says that in 2012, I had a project""" start="00:36:30.085" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that needed a precedence parser""" start="00:36:35.426" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that could parse arithmetical expressions""" start="00:36:38.591" video="mainVideo-repl" id="subtitle"]] -[[!template text="""with the right precedences. At that point""" start="00:36:42.278" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I was still struggling with pure lpeg""" start="00:36:46.315" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I couldn't do much with it,""" start="00:36:49.032" video="mainVideo-repl" id="subtitle"]] -[[!template text="""so I tried to learn re.lua instead,""" start="00:36:51.319" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I wrote this old class here that allowed me to use""" start="00:36:54.577" video="mainVideo-repl" id="subtitle"]] -[[!template text="""a preprocessor on patterns for Lua.""" start="00:36:59.292" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The thing is that with this preprocessor""" start="00:37:01.756" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I could specify precedence grammars using this thing here""" start="00:37:04.835" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that worked but was super clumsy,""" start="00:37:10.921" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I gave up after a few attempts.""" start="00:37:14.489" video="mainVideo-repl" id="subtitle"]] -[[!template text="""And in 2022 I heard about something called lpegrex""" start="00:37:18.160" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that was a kind of extension of re,""" start="00:37:25.633" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and it was much more powerful than re.lua,""" start="00:37:30.760" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but after a while I realized that""" start="00:37:33.046" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it had the same defects as re.lua.""" start="00:37:35.785" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Let me explain that,""" start="00:37:38.766" video="mainVideo-repl" id="subtitle"]] -[[!template text="""because it has all to do with the things""" start="00:37:40.699" video="mainVideo-repl" id="subtitle"]] -[[!template text="""about black boxes and magic that I told in the beginning.""" start="00:37:43.920" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Neither re.lua or lpegrex had some features that I needed.""" start="00:37:52.027" video="mainVideo-repl" id="subtitle"]] -[[!template text="""They received a pattern that was specified as a string""" start="00:37:59.047" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and it converted that into an lpeg pattern,""" start="00:38:05.375" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but it didn't let us explore the lpeg patterns""" start="00:38:08.869" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that it generated.""" start="00:38:12.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Their code was written in a way that was REPL-unfriendly.""" start="00:38:14.530" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I couldn't modify parts of the code bit by bit in a REPL""" start="00:38:20.663" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and try to change the code""" start="00:38:26.282" video="mainVideo-repl" id="subtitle"]] -[[!template text="""without changing the original file, say.""" start="00:38:28.944" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The code was very hard to explore, to hack,""" start="00:38:32.036" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and to extend in my opinion.""" start="00:38:35.354" video="mainVideo-repl" id="subtitle"]] -[[!template text="""The documentation was not very clear,""" start="00:38:38.239" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I sent wonderful messages to the""" start="00:38:42.019" video="mainVideo-repl" id="subtitle"]] -[[!template text="""developer of lpegrex, and he was too busy to help me.""" start="00:38:45.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""He answered very briefly. To be honest, I felt rejected.""" start="00:38:51.014" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I felt that I wasn't doing anything interesting, whatever.""" start="00:38:57.211" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""ELpeg1.lua""" start="00:39:03.200" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""So in 2022, I was trying to learn lpegrex""" start="00:39:03.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""because I was thinking that it would solve my problems,""" start="00:39:07.471" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but it didn't. It didn't have the features that I needed,""" start="00:39:13.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and it was hard to extend and""" start="00:39:16.667" video="mainVideo-repl" id="subtitle"]] -[[!template text="""how to explore and hard to debug.""" start="00:39:18.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I decided to rewrite it in a more hacker-friendly way,""" start="00:39:22.303" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in the sense that it was modular""" start="00:39:28.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and I could replace any part of the module from a REPL.""" start="00:39:32.036" video="mainVideo-repl" id="subtitle"]] -[[!template text="""My version of it was called ELpeg1.lua.""" start="00:39:37.160" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I decided that in my version I wouldn't""" start="00:39:42.641" video="mainVideo-repl" id="subtitle"]] -[[!template text="""have the part that receives a grammar""" start="00:39:48.120" video="mainVideo-repl" id="subtitle"]] -[[!template text="""specified as a string and converts that to lpeg.""" start="00:39:51.241" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I would just have the backend part""" start="00:39:55.266" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that are the functions in lpeg""" start="00:39:58.985" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that let us specify powerful grammars.""" start="00:40:02.172" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Let me go back. Let me explain a bit about lpeg.""" start="00:40:06.320" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Lua has coercions. The `+` expects to receive two numbers.""" start="00:40:15.162" video="mainVideo-repl" id="subtitle"]] -[[!template text="""If one of its arguments or both of them are strings,""" start="00:40:20.781" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it converts the strings to numbers.""" start="00:40:25.931" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So in this case here, `2 + "3"` returns the number 5.""" start="00:40:30.117" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This is the concatenation operator.""" start="00:40:37.092" video="mainVideo-repl" id="subtitle"]] -[[!template text="""It expects to receive strings. In this case, it will""" start="00:40:40.441" video="mainVideo-repl" id="subtitle"]] -[[!template text="""convert the number 2 to the string "2"""" start="00:40:44.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and the concatenation of these two things will be""" start="00:40:47.542" video="mainVideo-repl" id="subtitle"]] -[[!template text=""""23". Oops, sorry, "23" as a string.""" start="00:40:50.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""lpeg also has some coercions. I usually set these globals""" start="00:40:55.918" video="mainVideo-repl" id="subtitle"]] -[[!template text="""to let me write my grammars in a very compact way.""" start="00:41:04.480" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So instead of lpeg.B, lpeg.C, etc.""" start="00:41:10.014" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I use globals like B, C, and so on.""" start="00:41:13.812" video="mainVideo-repl" id="subtitle"]] -[[!template text="""And with these globals I can write""" start="00:41:17.879" video="mainVideo-repl" id="subtitle"]] -[[!template text="""things like this, `C(1) * "_"`. And lpeg knows that lpeg.C,""" start="00:41:21.720" video="mainVideo-repl" id="subtitle"]] -[[!template text="""sorry, it sort of expands these to lpeg.C,""" start="00:41:36.048" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but lpeg.C expects to receive an lpeg pattern""" start="00:41:41.148" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and 1 is not yet an lpeg pattern.""" start="00:41:43.591" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So it is coerced into an lpeg pattern by calling lpeg.P.""" start="00:41:48.548" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So this short thing here becomes equivalent to""" start="00:41:53.348" video="mainVideo-repl" id="subtitle"]] -[[!template text="""`lpeg.C(lpeg.P(1))`. And the multiplication when at least one of""" start="00:42:02.482" video="mainVideo-repl" id="subtitle"]] -[[!template text="""its arguments is an lpeg pattern, it expects to receive two lpeg patterns. And in this""" start="00:42:07.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""case the one at the right is just a string, so it is coerced to an lpeg pattern by using""" start="00:42:13.320" video="mainVideo-repl" id="subtitle"]] -[[!template text="""lpeg.P. With this idea we can sort of understand this comparison here. I mean, let me run it""" start="00:42:19.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""again. This first part is very similar to a regular expression here at the left. And""" start="00:42:29.360" video="mainVideo-repl" id="subtitle"]] -[[!template text="""when we apply this lpeg, sorry, this lua pattern to this subject here, the result is this thing""" start="00:42:37.440" video="mainVideo-repl" id="subtitle"]] -[[!template text="""here, this thing, this thing and this thing. I'm going to call each one of these results""" start="00:42:51.440" video="mainVideo-repl" id="subtitle"]] -[[!template text="""captures. So each of these things between parentheses captures a substring of the original""" start="00:42:56.040" video="mainVideo-repl" id="subtitle"]] -[[!template text="""string and these captured substrings are returned in a certain order. Here is how to express""" start="00:43:04.080" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the same thing in lpeg. It's very cryptic, but it's a good way to understand some basic""" start="00:43:11.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""operators of lpeg. I mean, we can look at the menu and understand what C, S and R do""" start="00:43:20.720" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and also exponentiation. And this strange thing here receives this string here, runs""" start="00:43:29.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""a function that I have defined that converts it to an object of a certain class and that""" start="00:43:41.360" video="mainVideo-repl" id="subtitle"]] -[[!template text="""class represents re patterns. So this thing is treated as a pattern for re.lua and it""" start="00:43:46.760" video="mainVideo-repl" id="subtitle"]] -[[!template text="""is matched again the string and it returns the same thing as the other one. Also this""" start="00:43:55.240" video="mainVideo-repl" id="subtitle"]] -[[!template text="""thing here also has a comparison with lpeg.rex, but these patterns are very, very trivial.""" start="00:44:04.040" video="mainVideo-repl" id="subtitle"]] -[[!template text="""They don't do anything very strange. So let's go back and see what kinds of very strange""" start="00:44:10.680" video="mainVideo-repl" id="subtitle"]] -[[!template text="""things there are. Here is the page of lpeg.rex at GitHub. Here is the documentation. It's""" start="00:44:17.340" video="mainVideo-repl" id="subtitle"]] -[[!template text="""relatively brief. It explains lpeg.rex as being an extension of re.lua. So""" start="00:44:31.480" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it explains mainly the additional features. Here is a quick reference that explains only""" start="00:44:39.120" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the additional features. Some of these things I was able to understand by struggling a lot,""" start="00:44:44.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and some I wasn't able to even by spending several evenings trying to build examples.""" start="00:44:56.840" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This is something very nice. lpeg.rex comes with some example parsers. Here is""" start="00:45:08.720" video="mainVideo-repl" id="subtitle"]] -[[!template text="""a parser that parses the lua grammar. I mean, this is the grammar for lua 5.4 at the end""" start="00:45:16.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""of the reference manual. It's just this. And this is a kind of BNF, and this is the BNF""" start="00:45:25.720" video="mainVideo-repl" id="subtitle"]] -[[!template text="""translated to the language of lpeg.rex. This thing uses many constructions that are""" start="00:45:35.080" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in re.lua and some extra constructions that are described here. With these examples,""" start="00:45:43.840" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I was able to understand some of these things here that are described here in the quick""" start="00:45:51.840" video="mainVideo-repl" id="subtitle"]] -[[!template text="""reference, but not all. So I wasn't able to use lpeg.rex by itself because some things""" start="00:46:00.280" video="mainVideo-repl" id="subtitle"]] -[[!template text="""didn't make much sense. I decided to re implement it in my own style because that""" start="00:46:13.840" video="mainVideo-repl" id="subtitle"]] -[[!template text="""would be a way to map... at the very least, map what I understood and what I didn't and""" start="00:46:21.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""learn one feature at a time, do comparisons and so on. Here I pointed to two features""" start="00:46:29.120" video="mainVideo-repl" id="subtitle"]] -[[!template text="""of lpeg. One I said, oh great, this thing can be used to define grammars, even recursive""" start="00:46:38.160" video="mainVideo-repl" id="subtitle"]] -[[!template text="""grammars and so on. And this is an "oh no" feature. One thing that didn't make any sense at all:""" start="00:46:44.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""group captures. One thing that I did to understand group captures was to represent them as diagrams.""" start="00:46:52.260" video="mainVideo-repl" id="subtitle"]] -[[!template text="""Of course in the beginning I was drawing these diagrams by hand, but then I realized that""" start="00:47:01.760" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I could use the bits of lpeg that I already knew to build a grammar that would parse a""" start="00:47:08.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""little language and generate these diagrams in LaTeX. I was able to make this. In""" start="00:47:16.680" video="mainVideo-repl" id="subtitle"]] -[[!template text="""this diagram here, this thing above the arrow is a piece of Lua code that specifies an lpeg""" start="00:47:24.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""pattern. This thing here at the top is the string that is being matched and the things""" start="00:47:35.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""below the under braces are the captures that each thing captures. For example, this under""" start="00:47:43.160" video="mainVideo-repl" id="subtitle"]] -[[!template text="""brace here corresponds to this pattern here that parses a single character but doesn't""" start="00:47:57.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""return any captures. This thing here parses a single B and doesn't return any captures.""" start="00:48:03.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""This thing here parses a single character and captures it. And this thing here parses""" start="00:48:10.680" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the character D and captures it. And this other thing here that transforms this pattern""" start="00:48:17.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""into another pattern returns first a capture with all the string that was parsed by this""" start="00:48:24.920" video="mainVideo-repl" id="subtitle"]] -[[!template text="""pattern here and then all the captures returned by this thing here before the column. So this""" start="00:48:35.040" video="mainVideo-repl" id="subtitle"]] -[[!template text="""was a way to build concrete examples for things that the lpeg manual was explaining in a very""" start="00:48:44.000" video="mainVideo-repl" id="subtitle"]] -[[!template text="""terse way and it worked for me. Some things that were very mysterious started to make""" start="00:48:51.840" video="mainVideo-repl" id="subtitle"]] -[[!template text="""sense and I started to have intelligent questions to ask in the mailing list. With that""" start="00:48:58.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I was able to understand what are group captures that receive a name. Well, let me explain""" start="00:49:10.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""what this does. This thing here parses the empty string and returns this as a constant.""" start="00:49:22.040" video="mainVideo-repl" id="subtitle"]] -[[!template text="""So this is something that doesn't exist in regular expressions. It parses nothing and""" start="00:49:30.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""returns this as a capture. Then this thing here returns two constants here and parses""" start="00:49:38.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the empty string. And this thing here, D, converts the results of this thing here into""" start="00:49:46.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""a group capture and stores it in the label D. And then here's another constant capture.""" start="00:49:54.440" video="mainVideo-repl" id="subtitle"]] - -[[!template new="1" text="""Building lists""" start="00:50:04.160" video="mainVideo-repl" id="subtitle"]] - -[[!template text="""I realized that these things here were similar to how Lua specifies building lists.""" start="00:50:04.160" video="mainVideo-repl" id="subtitle"]] -[[!template text="""When we build a table and we say that the first element of the table is here, this element""" start="00:50:15.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""is put at the end of the table. After that we say D equals to say 42. We are putting""" start="00:50:22.320" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the 42 in the slot whose key is D. This was happening with lpeg captures but there was""" start="00:50:30.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""something very strange. These group captures could hold more than one capture, more than""" start="00:50:39.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""one value. So there was something between lists and tables. I started to use this notation""" start="00:50:49.320" video="mainVideo-repl" id="subtitle"]] -[[!template text="""to explain in my notation what they were doing. Many things started to make sense, many mysterious""" start="00:50:57.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""sentences in the manual started to make sense but some didn't. But at least I was able to""" start="00:51:09.840" video="mainVideo-repl" id="subtitle"]] -[[!template text="""send some intelligent questions to the mailing list and the author of Lua and LPEG answered""" start="00:51:20.480" video="mainVideo-repl" id="subtitle"]] -[[!template text="""some of them. He was not very happy about my questions. He told me that those diagrams""" start="00:51:26.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""were a waste of time, the manual was perfectly clear and so on, whatever. So it was weird,""" start="00:51:35.920" video="mainVideo-repl" id="subtitle"]] -[[!template text="""but I was able to understand lots of things from his answers. So this is a copy of one""" start="00:51:47.280" video="mainVideo-repl" id="subtitle"]] -[[!template text="""of my messages, then there's another one, another one, some of the diagrams. Then he""" start="00:51:56.440" video="mainVideo-repl" id="subtitle"]] -[[!template text="""complained about these diagrams, he said that these things here that look like table constructions""" start="00:52:02.040" video="mainVideo-repl" id="subtitle"]] -[[!template text="""do not exist, whatever. Anyway, once I understood group captures, many features were very easy""" start="00:52:10.080" video="mainVideo-repl" id="subtitle"]] -[[!template text="""to understand and I started to be able to use lpeg to build some very interesting things.""" start="00:52:22.720" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I was able to reproduce some of the features that I saw in lpegrex. Remember that this""" start="00:52:30.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""is a syntax of Lua. Here I was able to understand how these things here were translated to lpeg""" start="00:52:39.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""code, to lpeg patterns by using group captures in a certain way. I was able to implement""" start="00:52:53.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""them in ELpeg1.lua. after some time I was able to use ELpeg1.lua to build grammars that""" start="00:53:02.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""were able to parse arithmetical expressions with the right precedence. here's an example""" start="00:53:13.080" video="mainVideo-repl" id="subtitle"]] -[[!template text="""in which I built the grammar step by step and I test the current grammar and I replace""" start="00:53:21.080" video="mainVideo-repl" id="subtitle"]] -[[!template text="""a bit and then I test the new grammar and so on. You can see that the result is""" start="00:53:26.920" video="mainVideo-repl" id="subtitle"]] -[[!template text="""always a tree that is drawn in a nice two dimensional way. At this point, these powers""" start="00:53:34.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""here are returned as a list, as an operation power with several arguments here and then""" start="00:53:48.720" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I apply a kind of parsing combinator here that transforms these trees into other trees""" start="00:53:57.760" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and with these combinators here I can specify that the power is associative in a certain""" start="00:54:05.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""direction, the division is associative in another direction, the minus uses the same""" start="00:54:14.200" video="mainVideo-repl" id="subtitle"]] -[[!template text="""direction as a division and so on and they have the right precedences. So here are the""" start="00:54:22.320" video="mainVideo-repl" id="subtitle"]] -[[!template text="""tests. So here's my file ELpeg.lua, it has several classes. Each class has tests after""" start="00:54:29.520" video="mainVideo-repl" id="subtitle"]] -[[!template text="""it. I was able to implement something that lpeg.rex has that's called keywords, that's""" start="00:54:42.360" video="mainVideo-repl" id="subtitle"]] -[[!template text="""very useful for parsing problems in programming languages. I was able to implement something""" start="00:54:52.040" video="mainVideo-repl" id="subtitle"]] -[[!template text="""similar to the debugger, to the pack debugger that lpeg uses, but I was frustrated by some""" start="00:54:59.160" video="mainVideo-repl" id="subtitle"]] -[[!template text="""limitations of the debugger and I implemented my own that is much better and let me show""" start="00:55:10.640" video="mainVideo-repl" id="subtitle"]] -[[!template text="""something else. I was able to translate a good part of the Lua parser here to lpeg1.lua.""" start="00:55:23.280" video="mainVideo-repl" id="subtitle"]] -[[!template text="""I haven't finished yet but I have most of the translation here and after having all""" start="00:55:33.800" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that I was able to build other grammars very quickly. Writing new parsers finally became""" start="00:55:45.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""fun and here's one example that I showed in the beginning. If I remember correctly, I""" start="00:55:54.960" video="mainVideo-repl" id="subtitle"]] -[[!template text="""took a figure from the Wikipedia, I don't have its link now, but I specify a grammar""" start="00:56:08.560" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that parses exactly the example that appears in the Wikipedia. So with my grammar, considering""" start="00:56:15.680" video="mainVideo-repl" id="subtitle"]] -[[!template text="""that the top level entry is statement, when I parse this string here, the result is this""" start="00:56:24.280" video="mainVideo-repl" id="subtitle"]] -[[!template text="""tree and I can do some operations on that. I can define how this thing is to be converted""" start="00:56:36.680" video="mainVideo-repl" id="subtitle"]] -[[!template text="""into LaTeX. I can define other operations that convert trees into other trees and here's""" start="00:56:44.840" video="mainVideo-repl" id="subtitle"]] -[[!template text="""some tests of these operations. This is what I showed in the beginning. I'm not going to""" start="00:56:53.400" video="mainVideo-repl" id="subtitle"]] -[[!template text="""explain all the details of this thing now. This show converts this thing into LaTeX in""" start="00:57:01.760" video="mainVideo-repl" id="subtitle"]] -[[!template text="""the way specified by these instructions here. And here's the result, the LaTeX result.""" start="00:57:10.480" video="mainVideo-repl" id="subtitle"]] -[[!template text="""These diagrams here are generated by this file here that defines a simple grammar that""" start="00:57:39.320" video="mainVideo-repl" id="subtitle"]] -[[!template text="""parses this thing here and then LaTeX it in a certain way and also tests to check if this""" start="00:57:46.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""code here that is Lua code that generates an lpeg grammar, parses this subject here, and""" start="00:57:56.720" video="mainVideo-repl" id="subtitle"]] -[[!template text="""returns the expected result. So this is the code that I wanted to show. I wanted to show""" start="00:58:06.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""many more things, but I wasn't able to prepare them before the conference. And I hope that""" start="00:58:16.880" video="mainVideo-repl" id="subtitle"]] -[[!template text="""soon, for some value of soon, I'll be able to create REPL based tutorials for LPG, G and""" start="00:58:23.920" video="mainVideo-repl" id="subtitle"]] -[[!template text="""ELpeg1.Lua where Lpeg is something very famous. Here is a module of LPG. I could also do something""" start="00:58:33.240" video="mainVideo-repl" id="subtitle"]] -[[!template text="""like this for ELpeg, and ELpeg1.lua is the thing that I wrote, the one that has tests in comments""" start="00:58:42.080" video="mainVideo-repl" id="subtitle"]] -[[!template text="""and the tests usually generate trees and sometimes they generate tag code. So that's it, I wanted""" start="00:58:55.600" video="mainVideo-repl" id="subtitle"]] -[[!template text="""to present much more, but I wasn't able to prepare it. So sorry, thanks, bye!""" start="00:59:04.920" video="mainVideo-repl" id="subtitle"]] - Questions or comments? Please e-mail [eduardoochs@gmail.com](mailto:eduardoochs@gmail.com?subject=Comment%20for%20EmacsConf%202023%20repl%3A%20REPLs%20in%20strange%20places%3A%20Lua%2C%20LaTeX%2C%20LPeg%2C%20LPegRex%2C%20TikZ) diff --git a/2023/info/repl-before.md b/2023/info/repl-before.md index 5d509837..dccbc016 100644 --- a/2023/info/repl-before.md +++ b/2023/info/repl-before.md @@ -7,6 +7,6 @@ Status: Q&A to be extracted from the room recordings -
Duration: 59:10 minutes
+
Duration: 59:10 minutes
# Description \ No newline at end of file diff --git a/2023/info/sat-close-before.md b/2023/info/sat-close-before.md index 9c154beb..e2d9c1a8 100644 --- a/2023/info/sat-close-before.md +++ b/2023/info/sat-close-before.md @@ -9,10 +9,10 @@ Status: Q&A to be extracted from the room recordings # Talk -
Duration: 09:00 minutes
+
Duration: 09:00 minutes
# Q&A -
+
# Description \ No newline at end of file diff --git a/2023/info/sun-close-before.md b/2023/info/sun-close-before.md index 17d56fc6..521f88eb 100644 --- a/2023/info/sun-close-before.md +++ b/2023/info/sun-close-before.md @@ -7,6 +7,6 @@ Status: Q&A to be extracted from the room recordings -
Duration: 2:00:43 minutes
+
Duration: 2:00:43 minutes
# Description \ No newline at end of file diff --git a/2023/info/test-before.md b/2023/info/test-before.md index db0cbbd1..f5958b9f 100644 --- a/2023/info/test-before.md +++ b/2023/info/test-before.md @@ -37,6 +37,6 @@ Status: Q&A to be extracted from the room recordings # Q&A -
Duration: 26:22 minutes
+
Listen to just the audio:
Duration: 26:22 minutes
# Description \ No newline at end of file diff --git a/2023/schedule-details.md b/2023/schedule-details.md index 1ee8098f..187e7232 100644 --- a/2023/schedule-details.md +++ b/2023/schedule-details.md @@ -11,13 +11,13 @@ Jump to: Sat Dec 2 - S [[!template id=sched resources="""
  • Download --answers--original.vtt
  • Download --answers.opus (34MB)
  • Download --answers.webm (205MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (9MB)
  • Download --main.vtt
  • Download --main.webm (32MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Enhancing productivity with voice computing""" url="""/2023/talks/voice""" speakers="""Blaine Mooers""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""voice""" note="""captioned, video posted, video: 18:49"""]] [[!template id=sched resources="""
  • Download --alternative.mp4 (126MB)
  • Download --alternative.webm (45MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main.opus (11MB)
  • Download --main.vtt
  • Download --main.webm (45MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Who needs Excel? Managing your students qualifications with org-table""" url="""/2023/talks/table""" speakers="""Daniel Molina""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""table""" note="""captioned, video posted, video: 15:51"""]] [[!template id=sched resources="""
  • Download --answers.opus (17MB)
  • Download --answers.webm (46MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (12MB)
  • Download --main.vtt
  • Download --main.webm (50MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""LLM clients in Emacs, functionality and standardization""" url="""/2023/talks/llm""" speakers="""Andrew Hyatt""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""llm""" note="""captioned, video posted, video: 20:26, answers: 28:32"""]] -[[!template id=sched resources="""
  • Download --answers.webm (96MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (14MB)
  • Download --main.vtt
  • Download --main.webm (54MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""one.el: the static site generator for Emacs Lisp Programmers""" url="""/2023/talks/one""" speakers="""Tony Aldon""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""one""" note="""captioned, video posted, video: 22:18, answers: 27:39"""]] +[[!template id=sched resources="""
  • Download --answers.opus (15MB)
  • Download --answers.webm (96MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (14MB)
  • Download --main.vtt
  • Download --main.webm (54MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""one.el: the static site generator for Emacs Lisp Programmers""" url="""/2023/talks/one""" speakers="""Tony Aldon""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""one""" note="""captioned, video posted, video: 22:18, answers: 27:39"""]] [[!template id=sched resources="""
  • Download --answers.opus (9.4MB)
  • Download --answers.webm (35MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (5.5MB)
  • Download --main.vtt
  • Download --main.webm (23MB)
  • Download --pad.html
  • Download --pad.md
  • Download .pdf
  • """ title="""Emacs turbo-charges my writing""" url="""/2023/talks/writing""" speakers="""Jeremy Friesen""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""writing""" note="""captioned, video posted, video: 08:53, answers: 15:53"""]] [[!template id=sched resources="""
  • Download --answers.opus (12MB)
  • Download --answers.webm (20MB)
  • Download --expr_depth.svg
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (15MB)
  • Download --main.vtt
  • Download --main.webm (63MB)
  • Download --pad.html
  • Download --pad.md
  • Download --testdata.org
  • Download .org
  • """ title="""Improving compiler diagnostics with overlays""" url="""/2023/talks/overlay""" speakers="""Jeff Trull""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""overlay""" note="""captioned, video posted, video: 20:57, answers: 11:48"""]] [[!template id=sched resources="""
  • Download --answers--original.vtt
  • Download --answers.opus (3.1MB)
  • Download --answers.webm (9.1MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (6.3MB)
  • Download --main.vtt
  • Download --main.webm (22MB)
  • Download --pad.html
  • Download --pad.md
  • Download --silence.mkv (12MB)
  • Download .org
  • """ title="""Why Nabokov would use Org-Mode if he were writing today""" url="""/2023/talks/nabokov""" speakers="""Edmund Jorgensen""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""nabokov""" note="""captioned, video posted, video: 09:51, answers: 09:21"""]] [[!template id=sched resources="""
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (4.2MB)
  • Download --main.vtt
  • Download --main.webm (29MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Editor Integrated REPL Driven Development for all languages""" url="""/2023/talks/eval""" speakers="""Musa Al-hassy""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""eval""" note="""captioned, video posted, video: 09:37"""]] [[!template id=sched resources="""
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (11MB)
  • Download --main.vtt
  • Download --main.webm (62MB)
  • Download --pad.html
  • Download --pad.md
  • Download --room-noise.webm
  • """ title="""Collaborative data processing and documenting using org-babel""" url="""/2023/talks/collab""" speakers="""Jonathan Hartman, Lukas C. Bossert""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""collab""" note="""captioned, video posted, video: 19:16"""]] -[[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.opus (29MB)
  • Download --main.vtt
  • Download --main.webm (187MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ""" url="""/2023/talks/repl""" speakers="""Eduardo Ochs""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""repl""" note="""video posted, video: 59:10"""]] +[[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.opus (29MB)
  • Download --main.webm (187MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ""" url="""/2023/talks/repl""" speakers="""Eduardo Ochs""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""repl""" note="""video posted, video: 59:10"""]] [[!template id=sched resources="""
  • Download --answers.opus (11MB)
  • Download --answers.webm (43MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (6.6MB)
  • Download --main.vtt
  • Download --main.webm (52MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""How I play TTRPGs in Emacs""" url="""/2023/talks/solo""" speakers="""Howard Abrams""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""solo""" note="""captioned, video posted, video: 14:36, answers: 19:20"""]] [[!template id=sched resources="""
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.ogg (7.9MB)
  • Download --main.opus (7.8MB)
  • Download --main.vtt
  • Download --main.webm (38MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Org-Mode workflow: informal reference tracking""" url="""/2023/talks/ref""" speakers="""Christopher Howard""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""ref""" note="""captioned, video posted, video: 15:04"""]] [[!template id=sched resources="""
  • Download --answers.opus (18MB)
  • Download --answers.webm (69MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (23MB)
  • Download --main.vtt
  • Download --main.webm (133MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Literate Documentation with Emacs and Org Mode""" url="""/2023/talks/doc""" speakers="""Mike Hamrick""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""doc""" note="""captioned, video posted, video: 42:45, answers: 11:00"""]] @@ -25,7 +25,7 @@ Jump to: Sat Dec 2 - S [[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.opus (7.8MB)
  • Download --main.webm (38MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Emacs development updates""" url="""/2023/talks/devel""" speakers="""John Wiegley""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""devel""" note="""video posted, video: 23:22"""]] [[!template id=sched resources="""
  • Download --answers.opus (29MB)
  • Download --intro.webm
  • Download --main.opus (29MB)
  • Download --main.webm (80MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Windows into Freedom""" url="""/2023/talks/windows""" speakers="""Corwin Brust""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""windows""" note="""video posted, video: 57:48"""]] [[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.opus (23MB)
  • Download --main.webm (211MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Emacs core development: how it works""" url="""/2023/talks/core""" speakers="""Stefan Kangas""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""core""" note="""video posted, video: 1:07:13"""]] -[[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.webm (32MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Saturday closing remarks""" url="""/2023/talks/sat-close""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""sat-close""" note="""video posted, video: 09:00"""]] +[[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.opus (4.7MB)
  • Download --main.webm (32MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Saturday closing remarks""" url="""/2023/talks/sat-close""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""sat-close""" note="""video posted, video: 09:00"""]] Jump to: Sat Dec 2 - Sun Dec 3 # Sunday Dec 3, 2023 @@ -35,22 +35,22 @@ Jump to: Sat Dec 2 - S [[!template id=sched resources="""
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main.opus (2.5MB)
  • Download --main.vtt
  • Download --main.webm (12MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Sunday opening remarks""" url="""/2023/talks/sun-open""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""sun-open""" note="""captioned, video posted, video: 05:17"""]] [[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.opus (37MB)
  • Download --main.webm (234MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Top 10 ways Hyperbole amps up Emacs""" url="""/2023/talks/hyperamp""" speakers="""Robert Weiner""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""hyperamp""" note="""video posted, video: 1:05:16"""]] [[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.opus (4.5MB)
  • Download --main.webm (23MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Using Koutline for stream of thought journaling""" url="""/2023/talks/koutline""" speakers="""Matthew Jorgensen (PlasmaStrike)""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""koutline""" note="""video posted, video: 06:44"""]] -[[!template id=sched resources="""
  • Download --answers.webm (57MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (14MB)
  • Download --main.vtt
  • Download --main.webm (54MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Bringing joy to Scheme programming""" url="""/2023/talks/scheme""" speakers="""Andrew Tropin""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""scheme""" note="""captioned, video posted, video: 21:01"""]] +[[!template id=sched resources="""
  • Download --answers.opus (5.1MB)
  • Download --answers.webm (57MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (14MB)
  • Download --main.vtt
  • Download --main.webm (54MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Bringing joy to Scheme programming""" url="""/2023/talks/scheme""" speakers="""Andrew Tropin""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""scheme""" note="""captioned, video posted, video: 21:01"""]] [[!template id=sched resources="""
  • Download --answers.opus (6.8MB)
  • Download --answers.webm (10MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main-vp8.webm (95MB)
  • Download --main.opus
  • Download --main.vtt
  • Download --main.webm (29MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Parallel text replacement""" url="""/2023/talks/parallel""" speakers="""Lovro, Valentino Picotti""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""parallel""" note="""captioned, video posted, video: 14:46, answers: 10:16"""]] [[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.opus
  • Download --main.vtt
  • Download --main.webm (39MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Eat and Eat powered Eshell, fast featureful terminal inside Emacs""" url="""/2023/talks/eat""" speakers="""Akib Azmain Turja""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""eat""" note="""video posted, video: 08:13"""]] -[[!template id=sched resources="""
  • Download --answers.webm (38MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (9.3MB)
  • Download --main.vtt
  • Download --main.webm (66MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""GNU Emacs: A World of Possibilities""" url="""/2023/talks/world""" speakers="""Anand Tamariya""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""world""" note="""captioned, video posted, video: 20:31"""]] +[[!template id=sched resources="""
  • Download --answers.opus (4.2MB)
  • Download --answers.webm (38MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (9.3MB)
  • Download --main.vtt
  • Download --main.webm (66MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""GNU Emacs: A World of Possibilities""" url="""/2023/talks/world""" speakers="""Anand Tamariya""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""world""" note="""captioned, video posted, video: 20:31"""]] [[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.opus (20MB)
  • Download --main.webm (185MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""The browser in a buffer""" url="""/2023/talks/poltys""" speakers="""Michael Bauer""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""poltys""" note="""video posted, video: 34:30"""]] -[[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.webm (121MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""A modern Emacs look-and-feel without pain""" url="""/2023/talks/flat""" speakers="""Pedro A. Aranda""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""flat""" note="""video posted, video: 22:20"""]] +[[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.opus (10MB)
  • Download --main.webm (121MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""A modern Emacs look-and-feel without pain""" url="""/2023/talks/flat""" speakers="""Pedro A. Aranda""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""flat""" note="""video posted, video: 22:20"""]] [[!template id=sched resources="""
  • Download --alternative.webm (16MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (8.6MB)
  • Download --main.vtt
  • Download --main.vtt.diff
  • Download --main.webm (57MB)
  • Download --pad.html
  • Download --pad.md
  • Download --presentation.webm (16MB)
  • Download --solve-demo.webm (11MB)
  • Download .pdf
  • """ title="""Speedcubing in Emacs""" url="""/2023/talks/cubing""" speakers="""wasamasa""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""cubing""" note="""captioned, video posted, video: 13:35"""]] [[!template id=sched resources="""
  • Download --answers--original.vtt
  • Download --answers.opus (39MB)
  • Download --answers.webm (253MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (11MB)
  • Download --main.vtt
  • Download --main.webm (32MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""The Emacsen family, the design of an Emacs and the importance of Lisp""" url="""/2023/talks/emacsen""" speakers="""Fermin""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""emacsen""" note="""captioned, video posted, video: 18:28"""]] [[!template id=sched resources="""
  • Download --answers.opus (19MB)
  • Download --answers.webm (52MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (21MB)
  • Download --main.vtt
  • Download --main.webm (139MB)
  • Download --pad.html
  • Download --pad.md
  • Download .outline
  • """ title="""Emacs MultiMedia System (EMMS)""" url="""/2023/talks/emms""" speakers="""Yoni Rabkin""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""emms""" note="""captioned, video posted, video: 38:38, answers: 32:38"""]] -[[!template id=sched resources="""
  • Download --answers.webm (115MB)
  • Download --intro.webm
  • Download --main.opus (22MB)
  • Download --main.webm (80MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""emacs-gc-stats: Does garbage collection actually slow down Emacs?""" url="""/2023/talks/gc""" speakers="""Ihor Radchenko""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""gc""" note="""video posted, video: 33:22"""]] +[[!template id=sched resources="""
  • Download --answers.opus (11MB)
  • Download --answers.webm (115MB)
  • Download --intro.webm
  • Download --main.opus (22MB)
  • Download --main.webm (80MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""emacs-gc-stats: Does garbage collection actually slow down Emacs?""" url="""/2023/talks/gc""" speakers="""Ihor Radchenko""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""gc""" note="""video posted, video: 33:22"""]] [[!template id=sched resources="""
  • Download --answers.opus (9MB)
  • Download --answers.webm (48MB)
  • Download --intro.vtt
  • Download --intro.webm (996kB)
  • Download --main.opus (18MB)
  • Download --main.vtt
  • Download --main.webm (149MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""hyperdrive.el: Peer-to-peer filesystem in Emacs""" url="""/2023/talks/hyperdrive""" speakers="""Joseph Turner and Protesilaos Stavrou""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""hyperdrive""" note="""captioned, video posted, video: 40:03, answers: 28:15"""]] [[!template id=sched resources="""
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main.opus (13MB)
  • Download --main.vtt
  • Download --main.webm (66MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Programming with steno""" url="""/2023/talks/steno""" speakers="""Daniel Alejandro Tapia""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""steno""" note="""captioned, video posted, video: 25:03"""]] [[!template id=sched resources="""
  • Download --answers--original.vtt
  • Download --answers--trimmed.webm (176MB)
  • Download --answers.opus (25MB)
  • Download --answers.webm (176MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main.opus (6.2MB)
  • Download --main.vtt
  • Download --main.webm (26MB)
  • Download --pad.html
  • Download --pad.md
  • Download .pdf
  • """ title="""Mentoring VS-Coders as an Emacsian (or How to show not tell people about the wonders of Emacs)""" url="""/2023/talks/mentor""" speakers="""Jeremy Friesen""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""mentor""" note="""captioned, video posted, video: 10:44, answers: 1:13:43"""]] [[!template id=sched resources="""
  • Download --answers.opus (8.2MB)
  • Download --answers.webm (23MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (8.7MB)
  • Download --main.vtt
  • Download --main.webm (29MB)
  • Download --pad.html
  • Download --pad.md
  • Download .pdf (87MB)
  • """ title="""Writing a language server in OCaml for Emacs, fun, and profit""" url="""/2023/talks/lspocaml""" speakers="""Austin Theriault""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""lspocaml""" note="""captioned, video posted, video: 16:04, answers: 14:24"""]] [[!template id=sched resources="""
  • Download --answers.opus (7.6MB)
  • Download --answers.webm (18MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (17MB)
  • Download --main.vtt
  • Download --main.webm (53MB)
  • Download --pad.html
  • Download --pad.md
  • Download .org
  • """ title="""Emacs saves the Web (maybe)""" url="""/2023/talks/web""" speakers="""Yuchen Pei""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""web""" note="""captioned, video posted, video: 31:33, answers: 15:53"""]] -[[!template id=sched resources="""
  • Download --answers.webm (41MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (13MB)
  • Download --main.vtt
  • Download --main.webm (57MB)
  • Download --pad.html
  • Download --pad.md
  • Download --transcript.txt
  • """ title="""What I learned by writing test cases for GNU Hyperbole""" url="""/2023/talks/test""" speakers="""Mats Lidell""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""test""" note="""captioned, video posted, video: 26:55, answers: 26:22"""]] +[[!template id=sched resources="""
  • Download --answers.opus (9MB)
  • Download --answers.webm (41MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (13MB)
  • Download --main.vtt
  • Download --main.webm (57MB)
  • Download --pad.html
  • Download --pad.md
  • Download --transcript.txt
  • """ title="""What I learned by writing test cases for GNU Hyperbole""" url="""/2023/talks/test""" speakers="""Mats Lidell""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""test""" note="""captioned, video posted, video: 26:55, answers: 26:22"""]] [[!template id=sched resources="""
  • Download --answers.opus (16MB)
  • Download --answers.webm (44MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (8.8MB)
  • Download --main.vtt
  • Download --main.webm (47MB)
  • Download --pad.html
  • Download --pad.md
  • Download --previous.mkv (377MB)
  • Download --script.txt
  • Download .org
  • Download .txt
  • """ title="""Sharing Emacs is Caring Emacs: Emacs education and why I embraced video""" url="""/2023/talks/sharing""" speakers="""Jacob Boxerman""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""sharing""" note="""captioned, video posted, video: 16:34, answers: 25:19"""]] -[[!template id=sched resources="""
  • Download --answers.webm (317MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (8.3MB)
  • Download --main.vtt
  • Download --main.webm (37MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""EmacsConf.org: How we use Org Mode and TRAMP to organize and run a multi-track conference""" url="""/2023/talks/emacsconf""" speakers="""Sacha Chua""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""emacsconf""" note="""captioned, video posted, video: 15:05, answers: 2:00:43"""]] -[[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.webm (279MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Sunday closing remarks""" url="""/2023/talks/sun-close""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""sun-close""" note="""video posted, video: 2:00:43"""]] \ No newline at end of file +[[!template id=sched resources="""
  • Download --answers.opus (71MB)
  • Download --answers.webm (317MB)
  • Download --intro.vtt
  • Download --intro.webm
  • Download --main--chapters.vtt
  • Download --main.opus (8.3MB)
  • Download --main.vtt
  • Download --main.webm (37MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""EmacsConf.org: How we use Org Mode and TRAMP to organize and run a multi-track conference""" url="""/2023/talks/emacsconf""" speakers="""Sacha Chua""" watch="""https://emacsconf.org/2023/watch/dev""" slug="""emacsconf""" note="""captioned, video posted, video: 15:05, answers: 2:00:43"""]] +[[!template id=sched resources="""
  • Download --intro.webm
  • Download --main.opus (71MB)
  • Download --main.webm (279MB)
  • Download --pad.html
  • Download --pad.md
  • """ title="""Sunday closing remarks""" url="""/2023/talks/sun-close""" watch="""https://emacsconf.org/2023/watch/gen""" slug="""sun-close""" note="""video posted, video: 2:00:43"""]] \ No newline at end of file -- cgit v1.2.3