diff options
-rw-r--r-- | 2023/info/repl-after.md | 1139 |
1 files changed, 1139 insertions, 0 deletions
diff --git a/2023/info/repl-after.md b/2023/info/repl-after.md index a4ebf48c..d0a895ad 100644 --- a/2023/info/repl-after.md +++ b/2023/info/repl-after.md @@ -1,6 +1,1145 @@ <!-- Automatically generated by emacsconf-publish-after-page --> +<a name="repl-mainVideo-transcript"></a> +# 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: REPLs""" start="00:00:03.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in strange places - Lua, LateX, LPeg, LPegRex,""" start="00:00:05.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and TikZ. I'm the author of an Emacs""" start="00:00:09.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""package called eev, and this is a talk""" start="00:00:12.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""at the EmacsConf 2023, that is happening in""" start="00:00:14.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""December 2023, at the internets.""" start="00:00:18.480" video="mainVideo-repl" id="subtitle"]] + +[[!template new="1" text="""Diagrams""" start="00:00:22.520" video="mainVideo-repl" id="subtitle"]] + +[[!template text="""This is one of the""" start="00:00:22.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""examples of diagrams that we are""" start="00:00:23.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""going to see - let me show how I generate""" start="00:00:24.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it... one second,""" start="00:00:27.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I have to use a smaller font here...""" start="00:00:30.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this is a file called ParseTree2.lua...""" start="00:00:35.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""let me go back to this block of tests again...""" start="00:00:39.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and now if I run""" start="00:00:42.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this...""" start="00:00:43.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""we get these outputs here at the""" start="00:00:47.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""right, and then in this line here it""" start="00:00:50.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""generates a PDF, and if I type f8 here it""" start="00:00:53.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""shows the PDF in the lower right window.""" start="00:00:58.120" video="mainVideo-repl" id="subtitle"]] + +[[!template new="1" text="""eev""" start="00:01:03.920" video="mainVideo-repl" id="subtitle"]] + +[[!template text="""Let me start by explaining""" start="00:01:03.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""briefly what is eev.""" start="00:01:06.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""First: it is something that""" start="00:01:09.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""appeared by accident in the mid-90s - I""" start="00:01:12.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""explained this story in my""" start="00:01:14.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""presentation at the EmacsConf 2019...""" start="00:01:16.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it's a package... it's an Emacs""" start="00:01:20.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""package that is part of ELPA... it has at""" start="00:01:23.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""least 10 users - those are the ones""" start="00:01:26.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that I know by name...""" start="00:01:29.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""eev means `emacs-execute-verbosely'...""" start="00:01:32.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""eev is something that treats eval-last-sexp""" start="00:01:38.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""as the central feature of Emacs...""" start="00:01:40.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""eev blurs the distinction between""" start="00:01:44.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""programmers and users, and it replaces""" start="00:01:45.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the slogan "users should not be forced to""" start="00:01:48.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""see Lisp", that is something that Richard""" start="00:01:51.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Stallman told me once, by "users should see""" start="00:01:53.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Lisp instead of buttons" and "new users""" start="00:01:57.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""should see Lisp in the first 5 minutes"...""" start="00:02:00.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I'm going to show""" start="00:02:04.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""some examples of that soon.""" start="00:02:05.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Eev uses code in comments a lot,""" start="00:02:08.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and also tests in comments...""" start="00:02:11.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I changed my way of presenting it""" start="00:02:15.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and it became very REPL-centric""" start="00:02:17.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in the last few years, in the""" start="00:02:19.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""sense that I start by explaining its""" start="00:02:22.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""main features by its support for REPLs...""" start="00:02:24.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""eev supposes""" start="00:02:28.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that we want to keep""" start="00:02:31.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""executable notes of everything - I'm also""" start="00:02:32.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""going to show examples of this in a""" start="00:02:35.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""second... eev has lots of "videos for""" start="00:02:37.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""people who hate videos", and it tries to""" start="00:02:40.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""do everything with very little magic and""" start="00:02:43.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""without black boxes - I'm going to explain""" start="00:02:46.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""many of these things very soon.""" start="00:02:48.840" video="mainVideo-repl" id="subtitle"]] + +[[!template new="1" text="""Another figure""" start="00:02:50.320" video="mainVideo-repl" id="subtitle"]] + +[[!template text="""This is a figure that that I'm going""" start="00:02:50.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to show in details soon, that is""" start="00:02:52.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""about something important about Lua...""" start="00:02:57.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the font is very bad now, so let me""" start="00:02:59.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""change the font... the figure is this one...""" start="00:03:03.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and...""" start="00:03:07.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""what most people do when they""" start="00:03:08.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""visit a file with something""" start="00:03:12.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""interesting on it is that they just go""" start="00:03:14.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""there and they set a bookmark there, or""" start="00:03:16.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""they put the position in a register...""" start="00:03:18.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""but I prefer to keep""" start="00:03:21.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""links to everything that is interesting""" start="00:03:26.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""as elisp hyperlinks. So, for example, this is""" start="00:03:29.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""an elisp hyperlink to a file, that goes""" start="00:03:32.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to this anchor here, and to this string""" start="00:03:35.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""after this anchor... this is a variant""" start="00:03:37.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that opens that file in the window""" start="00:03:41.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""at the right -""" start="00:03:44.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here... and this is""" start="00:03:45.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a sexp that changes the font. I""" start="00:03:48.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""have a command with a very short name""" start="00:03:53.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that does that, but I""" start="00:03:56.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""prefer to keep that as a one-liner.""" start="00:03:59.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""About the videos... we can see""" start="00:04:02.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the list of first-class videos of eev""" start="00:04:06.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""by executing this, M-x find-1stclassvideos,""" start="00:04:10.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""or by running this alias here, M-x 1c...""" start="00:04:14.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and then what we see is this...""" start="00:04:18.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the first sexp here""" start="00:04:20.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""regenerates this buffer - so we can make a""" start="00:04:24.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""mess here and then run this and the""" start="00:04:26.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""original buffer is regenerated again in""" start="00:04:29.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a clean way...""" start="00:04:33.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""each of these things here""" start="00:04:34.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""opens a buffer with information about""" start="00:04:36.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a video... let me take a specific""" start="00:04:40.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""example here... this video here is about""" start="00:04:44.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""one of the ancestors of this talk, that""" start="00:04:49.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""is a library that I wrote""" start="00:04:51.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""for creating diagrams in LaTeX using""" start="00:04:53.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a package called Pict2e using REPLs...""" start="00:04:58.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""anyway...""" start="00:05:03.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the thing is that if we""" start="00:05:03.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""run a sexp like this one and we don't""" start="00:05:06.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""have a local copy of the video eev""" start="00:05:11.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""will try to download to the local copy -""" start="00:05:14.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and instead of doing that by asking""" start="00:05:17.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""something like "do you want me""" start="00:05:20.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to download the local copy? Blah""" start="00:05:21.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""blah blah blah blah..." it simply opens a""" start="00:05:24.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""buffer like this, I mean, if we don't""" start="00:05:28.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""have a local copy yet it will open a""" start="00:05:30.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""buffer like this one, in which these""" start="00:05:33.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""things here in comments are links to the""" start="00:05:36.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""documentation... I mean, this thing here""" start="00:05:39.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""explains the idea of local copies""" start="00:05:43.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of files from the internet...""" start="00:05:46.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""there are more details here, and here...""" start="00:05:48.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and this is a script that we""" start="00:05:54.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""can execute line by line, so instead of""" start="00:05:57.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this script being hidden behind the""" start="00:06:00.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""button that we just press after a""" start="00:06:02.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""question like "Do you want me to do""" start="00:06:06.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""something blah blah blah? Yes or no?"""" start="00:06:08.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the script is visible here and we can""" start="00:06:10.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""execute it step by step... it creates a""" start="00:06:13.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""terminal with a shell here in the""" start="00:06:17.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""right window, and when we type f8 in""" start="00:06:20.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""one of these lines here the lines are""" start="00:06:24.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""sent... (...) so this is going""" start="00:06:26.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to download a copy of the video... the""" start="00:06:29.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""wget says that I already have a copy of""" start="00:06:31.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the video and its subtitles... and so on.""" start="00:06:36.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""And after getting a copy of the video""" start="00:06:39.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""we can run this sexp here and it displays""" start="00:06:43.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the video.""" start="00:06:48.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I said that eev has lots of""" start="00:06:49.920" video="mainVideo-repl" id="subtitle"]] +[[!template text=""""videos for people who hate videos", and""" start="00:06:55.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the idea is that very few""" start="00:06:58.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""people are going to watch the videos in""" start="00:06:59.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""real time... and most of the people that""" start="00:07:02.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I know - or: most of the people that""" start="00:07:06.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""are interested in eev in some""" start="00:07:08.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""way... they are going to watch just""" start="00:07:10.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""small sections of the video, and most of""" start="00:07:13.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the time they're just going to read the""" start="00:07:16.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""subtitles of the video. So, for each""" start="00:07:17.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""one of the videos we have a page""" start="00:07:20.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""about the video... let me see if I""" start="00:07:23.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""have internet here... yes. This is a""" start="00:07:27.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""page...""" start="00:07:30.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and usually these pages have a link""" start="00:07:32.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to another page that""" start="00:07:39.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""has all the subtitles of the""" start="00:07:40.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""video... uh, wherever... in this one""" start="00:07:43.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it's not so visible...""" start="00:07:46.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""but anyway, there are several""" start="00:07:48.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""ways of accessing the subtitles of the""" start="00:07:50.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""video, and one of the ways is by running""" start="00:07:52.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this sexp here,""" start="00:07:56.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that opens a file in Lua that is""" start="00:07:57.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""what I use to generate the""" start="00:08:01.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""subtitles.""" start="00:08:03.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Anyway... by the way, these things... each""" start="00:08:04.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""one of these things here is a hyperlink""" start="00:08:08.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to a position of the video, so if I type""" start="00:08:12.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this the right way it goes to that""" start="00:08:15.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""position. Anyway, let me go back...""" start="00:08:18.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""also, the tutorials of eev... the""" start="00:08:24.120" video="mainVideo-repl" id="subtitle"]] +[[!template text=""""intros" of eev, that start with "find-" and""" start="00:08:27.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""end with "-intro", they have lots of blocks""" start="00:08:31.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that say "[Video links:]", like this one, and""" start="00:08:34.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""these blocks have links to positions""" start="00:08:39.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in videos, and if we don't have a local""" start="00:08:41.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""copy of the video yet the thing shows""" start="00:08:43.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""us a script that lets us download the""" start="00:08:47.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""local copy.""" start="00:08:49.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Anyway, I said that I was going""" start="00:08:50.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to explain what I mean by "magic" and""" start="00:08:54.400" video="mainVideo-repl" id="subtitle"]] +[[!template text=""""black boxes".""" start="00:08:58.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this is something that I've been""" start="00:08:59.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""trying to explain for a long time, and I""" start="00:09:03.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""think that I got a very good explanation""" start="00:09:05.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""about that in a video that I made""" start="00:09:07.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""about something called eev-wconfig, that""" start="00:09:09.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""is a tool for configuring eev on""" start="00:09:13.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Windows without "magic" - without buttons""" start="00:09:15.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that do things without explaining what""" start="00:09:19.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""they're doing.""" start="00:09:22.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""This is a part of the subtitles""" start="00:09:22.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of the video, let me read that...""" start="00:09:25.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""eev-wconfig is an attempt to solve the""" start="00:09:28.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""problem of how to install these things""" start="00:09:32.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""on Windows both without magic and with""" start="00:09:35.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""very little""" start="00:09:37.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""magic. Remember this slogan: "any""" start="00:09:37.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""sufficiently advanced technology is""" start="00:09:41.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""indistinguishable from""" start="00:09:44.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""magic". Here in this video I'm going to""" start="00:09:45.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""use the term magic as a shorthand""" start="00:09:49.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""for sufficiently advanced technology,""" start="00:09:52.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that is something that is complex and""" start="00:09:55.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""non-obvious and that is""" start="00:09:57.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""indistinguishable from magic in the""" start="00:10:00.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""sense of being almost impossible to""" start="00:10:02.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""understand. And I'm also going to use a""" start="00:10:04.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the term "black box" as a near-synonym for""" start="00:10:07.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""magic, and sometimes the term""" start="00:10:10.280" video="mainVideo-repl" id="subtitle"]] +[[!template text=""""black box" is more convenient even though""" start="00:10:13.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it's a bit longer - it has more""" start="00:10:16.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""letters - because when I use the term""" start="00:10:17.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""black box it invites us to use""" start="00:10:20.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""expressions like "opening the black box",""" start="00:10:22.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and I'm going to use that""" start="00:10:25.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""expression a lot.""" start="00:10:26.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Now let me try to explain what is...""" start="00:10:28.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""sorry, let me change the font...""" start="00:10:37.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""what is Lua. Lua is a minimalistic""" start="00:10:41.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""language, in the sense of""" start="00:10:45.480" video="mainVideo-repl" id="subtitle"]] +[[!template text=""""batteries not included"... it uses""" start="00:10:50.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""associative tables for most of its data""" start="00:10:53.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""structures...""" start="00:10:56.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and it is so minimalistic""" start="00:10:56.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that its default print function, when""" start="00:11:00.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""we tell... when we create an associative""" start="00:11:04.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""table and we ask it to print...""" start="00:11:06.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""when we ask "print" to print an""" start="00:11:09.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""associative table it just prints the""" start="00:11:13.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""address of the table. Here are some""" start="00:11:15.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""examples... here is a table, and when we""" start="00:11:17.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""ask "print" to print it it just says""" start="00:11:21.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that it's the table at this address here.""" start="00:11:24.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""So, one of things that that most""" start="00:11:26.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""people do when they start using Lua is""" start="00:11:30.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that either they download a package with""" start="00:11:32.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a pretty-printing function or they write""" start="00:11:35.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""their own pretty-printing functions. My""" start="00:11:37.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""own pretty-printing function is called""" start="00:11:39.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""PP, with upper case letters, and it works""" start="00:11:41.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""like this...""" start="00:11:46.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and it prints associative tables""" start="00:11:47.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in a way like this. It says that for""" start="00:11:50.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the key 1 the the value associated to""" start="00:11:53.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it is 2, for the key 2 the value is""" start="00:11:57.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""3, and for the key 3 the value is 5.""" start="00:12:00.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""When I started using Lua one of my""" start="00:12:04.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""favorite languages was also a language""" start="00:12:11.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that used associative tables a lot -""" start="00:12:13.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it was called Icon...""" start="00:12:15.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and I had to write my own""" start="00:12:16.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""pretty-printing functions for Icon, so""" start="00:12:21.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I just had to port my pretty-printing""" start="00:12:23.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""functions to Lua... and my first""" start="00:12:27.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""version looked at something like this... it""" start="00:12:29.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""just had some some global functions... lots""" start="00:12:32.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of them, actually...""" start="00:12:36.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and after a while I rewrote it, and I""" start="00:12:39.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""rewrote it again, and again, and again, and""" start="00:12:42.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this is one of the versions of that,""" start="00:12:44.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""is not even the default at this""" start="00:12:47.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""point...""" start="00:12:49.880" video="mainVideo-repl" id="subtitle"]] +[[!template text=""""Tos" is for "to string"...""" start="00:12:51.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and this is a demo...""" start="00:12:54.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it's very modular, so it's easy to replace""" start="00:12:58.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""parts of it, or to toggle flags... and this""" start="00:13:01.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""is an example. If I try to print the""" start="00:13:05.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""table of methods for a certain""" start="00:13:08.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""class... I will need a smaller font...""" start="00:13:10.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it prints the table like this, with the""" start="00:13:14.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""names of the methods and then links to""" start="00:13:16.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the source code of the functions...""" start="00:13:20.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""these links only make sense in Emacs and""" start="00:13:21.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in eev...""" start="00:13:25.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and when we run a link like this one...""" start="00:13:25.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it shows the source code in the""" start="00:13:30.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""window at the right. So, for some""" start="00:13:32.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""functions the source code is three lines,""" start="00:13:35.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""for other ones it's one line... and""" start="00:13:37.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""whatever. Anyway, let me go""" start="00:13:40.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""back... Lua can be used in many different""" start="00:13:44.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""styles... most people hate other people's""" start="00:13:47.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""styles... when I started using it in the""" start="00:13:50.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""year 2000 I learned most of the basic""" start="00:13:53.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""language in a single day - it was very""" start="00:13:57.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""similar to things that I was already""" start="00:13:59.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""using... and then I rewrote the the mini-""" start="00:14:02.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""language that I was using to""" start="00:14:05.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""generate the HTML for my pages""" start="00:14:10.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in Lua... actually I had to rewrite it""" start="00:14:13.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""many times, but the first version I""" start="00:14:16.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""certainly did in my first weeks or first""" start="00:14:18.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""months using Lua...""" start="00:14:21.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""In the beginning I was just using""" start="00:14:22.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it for writing programs that either""" start="00:14:27.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""didn't take any input at all - because""" start="00:14:30.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the input was already in the source file -""" start="00:14:32.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""or that worked as Unix programs,""" start="00:14:35.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that would read files""" start="00:14:40.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and process these files in some way""" start="00:14:43.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and output something.""" start="00:14:45.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I mentioned the "basic language" here...""" start="00:14:49.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I only learned how to use closures,""" start="00:14:52.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""metatables, and coroutines many years later...""" start="00:14:54.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in the beginning, when I started using Lua,""" start="00:14:58.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it didn't have a package manager...""" start="00:15:02.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it appeared later, it is called""" start="00:15:04.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Luarocks... it has had this package""" start="00:15:06.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""manager for several years, most""" start="00:15:10.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of the rocks for Luarocks are poorly""" start="00:15:13.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""documented and hacker-unfriendly,""" start="00:15:15.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so you can't rely just on the""" start="00:15:18.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""documentation and you can't rely just on the""" start="00:15:21.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""source code, because, I mean... if you are""" start="00:15:23.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a genius of course you can, but for""" start="00:15:26.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""people who are either lazy, or dumb, or""" start="00:15:29.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""whatever, like me, or unfocused...""" start="00:15:31.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the source code is hard to""" start="00:15:34.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""understand and hard to tinker with.""" start="00:15:36.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Some rocks are excellent. The""" start="00:15:38.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""best rocks are well documented""" start="00:15:43.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""but they are hacker-unfriendly""" start="00:15:46.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in a sense that I hope that""" start="00:15:48.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I'll be able to explain soon.""" start="00:15:51.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""The best rocks use local""" start="00:15:52.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""variables and metatables a lot -""" start="00:15:55.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so if you are beginner""" start="00:15:58.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""learning Lua you're not going to""" start="00:16:02.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""understand what their source code do...""" start="00:16:03.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""they use lots of dirty tricks.""" start="00:16:06.160" video="mainVideo-repl" id="subtitle"]] + +[[!template new="1" text="""Object orientation in Lua""" start="00:16:08.520" video="mainVideo-repl" id="subtitle"]] + +[[!template text="""Let me talk a bit about object""" start="00:16:08.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""orientation in Lua. It can be done in""" start="00:16:12.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""many ways...""" start="00:16:14.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the main book about Lua, called""" start="00:16:15.880" video="mainVideo-repl" id="subtitle"]] +[[!template text=""""Programming in Lua", by one of the authors""" start="00:16:19.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of the language, Roberto Ierusalimschy,""" start="00:16:21.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""presents several ways of doing""" start="00:16:23.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""object orientation in Lua... I hated all""" start="00:16:26.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of these ways - and also the ways that I""" start="00:16:29.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""tried from the rocks.""" start="00:16:33.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""And then I wrote my own way""" start="00:16:34.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of doing object orientation in Lua... it's""" start="00:16:38.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""very minimalistic, it's in this file here,""" start="00:16:40.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""eoo.lua... the main code is just this five""" start="00:16:43.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lines here...""" start="00:16:48.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and here's an example of how it works.""" start="00:16:49.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Here we define the class Vector,""" start="00:16:53.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""with some metamethods...""" start="00:16:58.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this metamethod here will tell Lua""" start="00:17:02.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""what to do when the""" start="00:17:05.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""user asks to add two vectors, this one""" start="00:17:08.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here tells Lua what to do when the user""" start="00:17:12.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""asks Lua to convert a vector to a string,""" start="00:17:15.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and... whatever, this one is""" start="00:17:18.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""something that I'm going to explain in a""" start="00:17:21.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""second. So, here we create a vector with""" start="00:17:24.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""these coordinates, 3 and 4... here we create""" start="00:17:27.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""another Vector... if we "print" here then Lua""" start="00:17:30.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""uses this function here, in the __tostring...""" start="00:17:33.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""if we add the two vectors it uses this""" start="00:17:36.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""function here, in the __add metamethod, and""" start="00:17:39.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""if we run the method :norm...""" start="00:17:43.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it is defined here, in the table __index.""" start="00:17:45.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Anyway...""" start="00:17:49.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Even this thing being so small I used""" start="00:17:58.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to forget how its innards worked all""" start="00:18:02.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the time. Actually I always forget how""" start="00:18:04.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""things work and I have to remember them""" start="00:18:08.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""somehow... and I have to have""" start="00:18:09.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""tricks for remembering, and tricks for""" start="00:18:12.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""summarizing things, and diagrams, and so""" start="00:18:15.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""on. And every time that I forgot how this""" start="00:18:18.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""thing worked I went back to the""" start="00:18:22.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""source code, and then I looked at the""" start="00:18:24.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagrams... or, of course, in the""" start="00:18:26.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""first times I had to draw the diagrams...""" start="00:18:29.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and I run the examples, and of course in""" start="00:18:31.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in the beginning I thought that the code""" start="00:18:35.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""was clear and my examples were very""" start="00:18:36.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""brief, and so I had to rewrite the""" start="00:18:39.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""examples many times until they became,""" start="00:18:41.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""let's say...""" start="00:18:44.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""perfect.""" start="00:18:45.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I was saying that Lua can be used in""" start="00:18:47.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""many ways, and in my way of using Lua - in""" start="00:18:52.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""my favorite way - everything can be""" start="00:18:56.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""inspected and modified from REPLs,""" start="00:18:59.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""like we can do in Emacs and in SmallTalk,""" start="00:19:02.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""or sort of. So, in my""" start="00:19:06.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""favorite way of using Lua there's no""" start="00:19:08.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""security at all, everything can be""" start="00:19:10.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""changed at all times.""" start="00:19:12.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Of course most people hate that...""" start="00:19:14.920" video="mainVideo-repl" id="subtitle"]] + +[[!template new="1" text="""My init file""" start="00:19:19.120" video="mainVideo-repl" id="subtitle"]] + +[[!template text="""My init file has lots of classes... by the""" start="00:19:19.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""way, instead of keeping many small files""" start="00:19:22.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""with many things I put lots of stuff""" start="00:19:26.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in just one big init file.""" start="00:19:29.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""My init file has lots of classes,""" start="00:19:31.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and lots of global functions, and""" start="00:19:34.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lots of cruft - and people hate that,""" start="00:19:37.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of course. This is an example...""" start="00:19:41.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this is the index at the top""" start="00:19:44.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of my init file,""" start="00:19:46.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the classes start here, and then""" start="00:19:48.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""we have some functions, and""" start="00:19:53.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""then we have functions that load""" start="00:19:59.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""certain packages, and then we have... cruft.""" start="00:20:01.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Whatever.""" start="00:20:03.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Most people think that my style""" start="00:20:04.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of using Lua is dirty, and dangerous...""" start="00:20:08.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and they wouldn't touch my Lua code""" start="00:20:10.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""with a 10 feet pole... but most of the""" start="00:20:12.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""things that I'm going to present here in""" start="00:20:15.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this presentation are ideas that should""" start="00:20:18.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""be easy to port to other environments""" start="00:20:23.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and other languages, especially the""" start="00:20:28.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagrams... so the code is not so important.""" start="00:20:32.280" video="mainVideo-repl" id="subtitle"]] + +[[!template new="1" text="""LaTeX and LuaLaTeX""" start="00:20:35.280" video="mainVideo-repl" id="subtitle"]] + +[[!template text="""Now let me talk a bit about LuaLaTeX,""" start="00:20:35.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that is LaTeX with a Lua interpreter""" start="00:20:39.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""embedded inside, and two ways""" start="00:20:41.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of generating pictures in LaTeX: TikZ,""" start="00:20:44.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that is very famous, and Pict2e, that is not""" start="00:20:48.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""very famous and that is very low level...""" start="00:20:54.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and I think that not many people use it.""" start="00:20:57.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I said before that when I""" start="00:21:02.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""learned Lua I realized that it was""" start="00:21:04.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""very good for writing little""" start="00:21:06.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""languages. I was doing my PhD at the""" start="00:21:09.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""time and typesetting the diagrams for""" start="00:21:14.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""my PhD thesis was very boring, so""" start="00:21:19.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""one of the things that I did was that I""" start="00:21:24.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""created a little language for typesetting""" start="00:21:29.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the diagrams for me. it was""" start="00:21:34.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""called Dednat because initially""" start="00:21:36.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it only generated diagrams for""" start="00:21:38.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Natural Deduction, and then it had""" start="00:21:41.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""several versions...""" start="00:21:43.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""these are the slides for my""" start="00:21:45.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""presentation about Dednat6... "Dednat6 is""" start="00:21:46.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""an extensible semi-preprocessor for""" start="00:21:52.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""LuaLaTeX that understands diagrams in""" start="00:21:56.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""ASCII art"... in the sense that when I have""" start="00:22:01.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a .tex file that has this, and when""" start="00:22:05.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Dednat6 is loaded,""" start="00:22:11.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""when I give the right commands""" start="00:22:13.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Dednat6 interprets this block here as""" start="00:22:15.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""something that defines this""" start="00:22:19.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagram... oops, sorry, it interprets this""" start="00:22:22.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagram here, this diagram in""" start="00:22:28.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""comments here, as something that defines""" start="00:22:30.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a diagram called foo... a deduction called""" start="00:22:34.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""foo, and it generates this code here...""" start="00:22:39.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so that we can just invoke""" start="00:22:41.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the definition of the""" start="00:22:44.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""deduction by typing \ded{foo}.""" start="00:22:45.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""And Dednat6 also""" start="00:22:47.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""supports another language for typesetting""" start="00:22:50.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""bidimensional diagrams with""" start="00:22:57.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""arrows and stuff for category Theory and""" start="00:22:59.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""blah blah blah... the specifications of""" start="00:23:05.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""these diagrams look like this...""" start="00:23:08.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here is a... sorry, here is a very good""" start="00:23:12.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""example, this is a huge diagram...""" start="00:23:14.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""sorry, one second...""" start="00:23:16.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so, the source code that generates""" start="00:23:18.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this diagram here is just this thing at""" start="00:23:20.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the left, so it's very visual... we can""" start="00:23:25.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""typeset the diagram in ASCII art here and""" start="00:23:32.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""then in this part here we tell how""" start="00:23:35.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the nodes are to be joined, which""" start="00:23:38.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""arrows have to to have annotations, and""" start="00:23:41.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so on...""" start="00:23:43.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and this language is extensible in""" start="00:23:45.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the sense that... uh, where's that...""" start="00:23:46.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here: comments that start with "%:"""" start="00:23:48.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""are interpreted as""" start="00:23:52.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""definitions for tree diagrams,""" start="00:23:54.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lines that start with "%D"""" start="00:23:56.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""define 2D diagrams with arrows and""" start="00:23:58.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""stuff, and lines that start with "%L"""" start="00:24:00.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""contain blocks of Lua code""" start="00:24:04.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that we can use to extend the interpreter""" start="00:24:06.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""on-the-fly...""" start="00:24:09.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""anyway, here are some recent""" start="00:24:10.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""examples of diagrams that I used""" start="00:24:12.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Dednat6 to typeset... this diagram""" start="00:24:15.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here was generated by this""" start="00:24:19.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""specification here...""" start="00:24:21.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and this diagram here with the""" start="00:24:22.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""curved arrows was generated by this""" start="00:24:27.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""specification here.""" start="00:24:30.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""So, Dednat6 was very easy to extend,""" start="00:24:32.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and at some point I started to use it""" start="00:24:39.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to generate diagrams using Pict2e -""" start="00:24:41.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""mainly for the classes that I give""" start="00:24:44.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""at the University... I teach mathematics and""" start="00:24:47.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""whatever... in a bad place. Whatever...""" start="00:24:50.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Let me show an animation... here is a""" start="00:24:57.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagram that I generated with Dednat6,""" start="00:25:00.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and it is a flip book animation, like... we""" start="00:25:02.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""type PgUp and PgDn and we go""" start="00:25:06.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to the next page of the book and to the""" start="00:25:09.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""previous page of the book...""" start="00:25:11.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and here is the source code that generates""" start="00:25:12.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that. This source code is not very visual,""" start="00:25:16.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so it's quite clumsy to edit that""" start="00:25:19.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagram directly in the .tex file like""" start="00:25:22.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that...""" start="00:25:27.520" video="mainVideo-repl" id="subtitle"]] + +[[!template new="1" text="""Manim""" start="00:25:28.080" video="mainVideo-repl" id="subtitle"]] + +[[!template text="""These diagrams were inspired""" start="00:25:28.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""by something called my Manim, that...""" start="00:25:30.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I forgot the name of the guy, but""" start="00:25:33.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it's a guy that makes many videos about""" start="00:25:37.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Mathematics, and he created this library""" start="00:25:41.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""called Manim for generating his""" start="00:25:44.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""animations, and other people adapted""" start="00:25:48.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""his library to make it more accessible...""" start="00:25:51.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I tried to learn it, but""" start="00:25:55.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""each animation, even an animation""" start="00:25:59.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that has very few frames... each""" start="00:26:01.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""animation took ages to render, so it""" start="00:26:03.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""wasn't fun... and animations in PDFs can""" start="00:26:07.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""be rendered in seconds. So these""" start="00:26:11.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""things were fun for me, because my laptop""" start="00:26:13.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""is very very slow, and my Manim was not fun.""" start="00:26:18.680" video="mainVideo-repl" id="subtitle"]] + +[[!template new="1" text="""Generating diagrams from REPLs""" start="00:26:24.360" video="mainVideo-repl" id="subtitle"]] + +[[!template text="""Anyway, writing code like this""" start="00:26:24.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""inside a .tex file was not very""" start="00:26:27.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""fun because it was hard to""" start="00:26:32.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""debug... so in 2022 I started to play""" start="00:26:35.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""with ways of generating these""" start="00:26:38.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagrams from REPLs, and I found a""" start="00:26:41.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""way for Pict2e and a way for TikZ...""" start="00:26:43.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""each one of these ways became a video...""" start="00:26:47.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""if you go to the list of first-class""" start="00:26:50.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""videos of eev you're going to see""" start="00:26:53.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that there's a video about Pict2e here""" start="00:26:57.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here and a video about TikZ...""" start="00:26:59.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here you have some some information""" start="00:27:03.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""like length, an explanation, etc...""" start="00:27:05.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and here are the pages for these videos.""" start="00:27:09.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""My page about the video about Pict2e""" start="00:27:11.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""looks like this, it has some diagrams...""" start="00:27:16.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""whatever... and this one is much""" start="00:27:20.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""nicer, and a lot of people""" start="00:27:23.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""watched that video... I mean, I think""" start="00:27:26.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that 250 people watched it - for me that's""" start="00:27:30.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a million of people...""" start="00:27:33.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and this video is about how to""" start="00:27:35.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""extract diagrams from the manual... from""" start="00:27:39.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the TikZ manual and how to run those""" start="00:27:44.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""examples in a REPL and modify""" start="00:27:46.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""them bit by bit... this is a a""" start="00:27:49.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""screenshot... but let me go back.""" start="00:27:53.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""At that point these things were just""" start="00:27:57.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""prototypes, the code was not very nice...""" start="00:28:00.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and in this year I wrote... I was able""" start="00:28:03.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to unify those two ways of generating PDFs,""" start="00:28:07.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the one for TikZ and the one for Pict2e,""" start="00:28:12.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and I unified them with many other""" start="00:28:16.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""things that generated diagrams.""" start="00:28:18.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""The basis of these things is""" start="00:28:20.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""something called Show2.lua... I'm not going""" start="00:28:24.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to show its details now, but its""" start="00:28:29.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""extension that generates TikZ code""" start="00:28:35.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""is just this, so we can specify a""" start="00:28:39.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagram with just a block like this,""" start="00:28:43.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and then uh if we""" start="00:28:45.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""run :show00() it returns a string""" start="00:28:49.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that is just the body... the inner""" start="00:28:54.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""body of the .tex file, if we run this we""" start="00:28:56.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""see the whole .tex file, and if we run""" start="00:29:00.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this we save the .tex file and we""" start="00:29:03.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""compile the .tex file to generate a PDF...""" start="00:29:05.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and if we run this we show the PDF in""" start="00:29:08.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the lower right window.""" start="00:29:10.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""And that's the same thing for all""" start="00:29:14.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""my recent programs that generate""" start="00:29:17.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""PDFs - they are all""" start="00:29:20.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""integrated... here is the one that...""" start="00:29:22.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the basis for all my modules that generate""" start="00:29:26.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagrams with Pict2e...""" start="00:29:29.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""its demos are not very interesting,""" start="00:29:30.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so let me show some demos of""" start="00:29:34.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""extensions that do interesting things...""" start="00:29:36.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so, this is a diagram that I created""" start="00:29:39.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""by editing it in a REPL...""" start="00:29:45.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I create several Pict objects here...""" start="00:29:47.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and if I execute this it""" start="00:29:51.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""compiles an object, generates a PDF, and""" start="00:29:54.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""if I tap this... here is the PDF.""" start="00:29:59.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""And if I just ask Lua to""" start="00:30:04.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""display what is "pux", here,""" start="00:30:07.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it shows the source code in Pict2e""" start="00:30:10.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of the diagram... and the""" start="00:30:15.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""nice thing is that it is indented, so""" start="00:30:18.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it's easy to debug the Pict2e code.""" start="00:30:20.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""If anyone is interested the""" start="00:30:23.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""module that does the tricks for""" start="00:30:25.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""indentation is very easy to understand...""" start="00:30:28.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it has lots of tests and test blocks,""" start="00:30:31.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and I think that its data""" start="00:30:35.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""structures are easy to understand.""" start="00:30:38.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Anyway... here is another""" start="00:30:42.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""example. The :show() is""" start="00:30:44.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here... it generates a 3D diagram.""" start="00:30:51.360" video="mainVideo-repl" id="subtitle"]] + +[[!template new="1" text="""Parsers""" start="00:30:56.440" video="mainVideo-repl" id="subtitle"]] + +[[!template text="""Now let me talk about parsers and""" start="00:30:56.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""REPLs in VERY strange places... I mean,""" start="00:31:06.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""using REPLs to build parsers step by step""" start="00:31:09.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and" replacing parts by more complex""" start="00:31:13.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""parts. So, I said that Lua is very""" start="00:31:17.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""minimalistic, and everybody knows that""" start="00:31:23.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""implementations of regular expressions""" start="00:31:28.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""are big and complex..""" start="00:31:30.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so, instead of coming with""" start="00:31:32.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""full regular expressions Lua comes with""" start="00:31:34.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""something called "patterns" and a""" start="00:31:37.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""library function called "string.match".""" start="00:31:39.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Here is""" start="00:31:43.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a copy of the part of the manual that""" start="00:31:44.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""explains the syntax... a part of the""" start="00:31:50.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""syntax of of patterns... here's how""" start="00:31:53.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""string.match is described in the""" start="00:31:57.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""manual - it's just this... "looks for""" start="00:31:59.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the first match of pattern in the string""" start="00:32:03.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""as blah blah blah"... and then we have to""" start="00:32:05.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""go to the other section of the menual""" start="00:32:08.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that explains patterns.""" start="00:32:10.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Lua patterns are so simple,""" start="00:32:11.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so limited, that they don't even""" start="00:32:20.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""have the the alternation operator...""" start="00:32:23.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here is how it is described in the""" start="00:32:26.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""elisp manual -""" start="00:32:29.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""backslash-pipe specifies""" start="00:32:31.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""an alternative, blah blah blah.""" start="00:32:36.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""When we want to to build more""" start="00:32:40.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""complex... regular expressions,""" start="00:32:42.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""patterns, grammars, etc... we have to use""" start="00:32:45.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""an external library for that... no,""" start="00:32:49.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""sorry, a library that is external""" start="00:32:52.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""but that was written by one of the""" start="00:32:56.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""authors of Lua itself. This library""" start="00:32:58.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""is called Lpeg, and its manual says...""" start="00:33:00.880" video="mainVideo-repl" id="subtitle"]] +[[!template text=""""Lpeg is a new pattern matching library for""" start="00:33:05.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Lua based on Parsing Expression Grammars""" start="00:33:09.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""(PEGs)". The manual is very terse, I""" start="00:33:12.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""found it incredibly hard to read... it""" start="00:33:18.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""doesn't have any diagrams - it has some""" start="00:33:21.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""examples, though... and the Lua Wiki""" start="00:33:25.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""has a big page called Lpeg Tutorial""" start="00:33:29.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""with lots of examples...""" start="00:33:33.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""but it it also doesn't have""" start="00:33:35.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagrams and I found some things""" start="00:33:38.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""incredibly hard to understand.""" start="00:33:41.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""For example, this is something that is in""" start="00:33:42.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the the manual of Lpeg that I saw and I""" start="00:33:45.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""thought: "Wow, great! This makes all sense""" start="00:33:48.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and is going to be very useful!"...""" start="00:33:51.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it's a way to to build""" start="00:33:53.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""grammars that can be recursive,""" start="00:33:54.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and they sort of can encode BNF""" start="00:33:57.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""grammars... we just have to translate the""" start="00:34:01.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""BNF a bit to get rid of some""" start="00:34:03.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""recursions and to translate them to""" start="00:34:06.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""something else.""" start="00:34:08.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""And the manual also has some things""" start="00:34:09.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that I thought: "Oh, no! I don't have any""" start="00:34:11.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""idea of what this thing does"... and in fact""" start="00:34:15.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I saw these things for the first""" start="00:34:18.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""time more than 10 years ago and they""" start="00:34:20.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""only started to make sense one year ago.""" start="00:34:22.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""One example is group captures.""" start="00:34:26.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Lpeg also comes with a""" start="00:34:30.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""module called the Re module... let me""" start="00:34:36.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""pronounce as it in Portuguese - the Re""" start="00:34:38.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""module... its manual says: "The Re""" start="00:34:41.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""module (provided by the file re.lua in the""" start="00:34:45.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""distribution) supports a somewhat conventional""" start="00:34:48.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""regular expression syntax for pattern usage""" start="00:34:51.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""within lpeg"... and""" start="00:34:56.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this is a quick reference... this""" start="00:34:58.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""thing is very brief, it has some nice""" start="00:35:03.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""examples but it's hard to understand anyway...""" start="00:35:06.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and here are some comments about""" start="00:35:08.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""my attempts to learn Re.lua. This is""" start="00:35:13.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a class... in this case it's a very small""" start="00:35:17.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""class... this file implements a :pm()""" start="00:35:20.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""method - I'm going to show examples of""" start="00:35:24.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""other :pm() methods very soon - so, this is""" start="00:35:28.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a :pm() method for Re.lua that lets us""" start="00:35:32.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""compare the syntax of Lua patterns, Lpeg,""" start="00:35:35.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and Re... let's see this example here... so,""" start="00:35:38.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""if we run this it loads my version of""" start="00:35:44.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lpeg... no, sorry, my version of lpegrex...""" start="00:35:47.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and it shows that when we apply""" start="00:35:52.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the :pm() method to this Lua pattern, this""" start="00:35:57.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lpeg pattern, and this Re pattern""" start="00:36:01.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""they all give the same results. So we can""" start="00:36:04.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""use this thing... this kind of thing here""" start="00:36:08.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to show how to translate from Lua""" start="00:36:10.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""patterns, that are familiar because""" start="00:36:14.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""they're similar to regular expressions,""" start="00:36:16.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""only weaker...""" start="00:36:18.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to lpeg, that is super weird""" start="00:36:20.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and to Re, that is not so weird.""" start="00:36:24.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Anyway, the comment says that in 2012""" start="00:36:27.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I had a project that needed a""" start="00:36:35.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""precedence passer that could parse""" start="00:36:37.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""arithmetical expressions with the right""" start="00:36:40.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""precedences... and at that point I was""" start="00:36:43.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""still struggling with pure lpeg, and I""" start="00:36:46.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""couldn't do much with it, so I tried to""" start="00:36:49.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""learn Re.lua instead, and I wrote this old""" start="00:36:52.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""class here...""" start="00:36:55.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that allowed me to use a preprocessor""" start="00:36:56.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""on patterns for Lua. And the thing is that""" start="00:37:01.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""with this preprocessor I could""" start="00:37:03.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""specify precedence grammars using this""" start="00:37:04.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""thing here, that worked, but was super""" start="00:37:07.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""clumsy... and I gave up after a few attempts.""" start="00:37:11.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and in 2022 I heard about something""" start="00:37:16.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""called lpegrex,""" start="00:37:21.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that was a... a kind of extension or Re,""" start="00:37:23.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and it was much more powerful than re.lua,""" start="00:37:29.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""but after a while I realized that it""" start="00:37:32.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""had the same defects as re.lua...""" start="00:37:34.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and let me explain that, because""" start="00:37:37.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it has all to do with the things about""" start="00:37:40.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""black boxes and magic that I told in the""" start="00:37:44.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""beginning. Both... I mean, sorry, neither""" start="00:37:48.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""re.lua or lpegrex had some features that""" start="00:37:52.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I needed... they didn't let us explore...""" start="00:37:57.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""sorry, they received a pattern that was""" start="00:38:00.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""specified as a string, and it converted""" start="00:38:03.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that into an lpeg pattern, but it didn't""" start="00:38:06.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""let us explore the the lpeg patterns""" start="00:38:09.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that it generated...""" start="00:38:12.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""their code was written in a way""" start="00:38:15.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that was REPL-unfriendly - I""" start="00:38:18.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""couldn't modify parts of the code""" start="00:38:21.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""bit by bit in a REPL and try to change""" start="00:38:24.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the code without changing the""" start="00:38:28.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""original file... the code was very""" start="00:38:31.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""hard to explore, to hack, and to extend -""" start="00:38:34.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in my opinion... the documentation was not""" start="00:38:36.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""very clear... and I sent one or two messages""" start="00:38:39.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to the the developer of lpegrex and...""" start="00:38:43.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""he was too busy to help me. He""" start="00:38:47.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""answered it very briefly, and, uh, to be""" start="00:38:50.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""honest I felt... rejected. I felt that I""" start="00:38:53.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""wasn't doing anything interesting...""" start="00:38:56.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""whatever, whatever...""" start="00:38:58.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""So, in 2022 I was trying to learn lpegrex""" start="00:39:03.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""because I was thinking that it would""" start="00:39:09.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""solve my problems - but it didn't...""" start="00:39:11.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it didn't have the features that I needed,""" start="00:39:13.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it was hard to extend, hard to explore,""" start="00:39:16.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and hard to debug, and I""" start="00:39:20.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""decided to rewrite it in a more""" start="00:39:23.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""hacker-friendly way - in the sense that...""" start="00:39:25.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""was modular, and I could replace any""" start="00:39:30.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""part of the module from a REPL...""" start="00:39:33.760" video="mainVideo-repl" id="subtitle"]] + +[[!template new="1" text="""ELpeg1.lua""" start="00:39:35.400" video="mainVideo-repl" id="subtitle"]] + +[[!template text="""My version of it was called ELpeg1.lua...""" start="00:39:35.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and I decided that in my version I""" start="00:39:43.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""wouldn't have the part that""" start="00:39:47.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""receives a grammar specified as a string""" start="00:39:49.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and converts that to lpeg... I would""" start="00:39:54.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""just have the backend part, that are the""" start="00:39:57.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""functions in lpeg that let us specify""" start="00:40:00.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""powerful grammars.""" start="00:40:04.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Let me go back. Let me explain a""" start="00:40:05.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""bit about lpeg... Lua has""" start="00:40:11.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""coercions: the + expects to receive""" start="00:40:15.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""true numbers, and if one of its arguments,""" start="00:40:21.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""or both of them, are strings, it converts""" start="00:40:24.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the string... the strings to numbers so in""" start="00:40:27.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this case here, 2+"3",""" start="00:40:29.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it returns the number 5,""" start="00:40:33.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and this is the concatenation""" start="00:40:36.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""operator... it expects to receive""" start="00:40:39.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""strings, so in this case it will""" start="00:40:42.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""convert the number 2 to the string "2",""" start="00:40:45.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and the concatenation of thes two""" start="00:40:47.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""things will be 23... oops, sorry, "23"""" start="00:40:50.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""as a string.""" start="00:40:54.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Lpeg also has some coercions.""" start="00:40:56.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I usually set these""" start="00:40:58.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""globals to let me write my grammars""" start="00:41:01.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in a very compact way, so instead""" start="00:41:05.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of lpeg.B, lpeg.C, etc I use these globals,""" start="00:41:09.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""like uppercase B, uppercase C, and so on...""" start="00:41:14.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and with these globals I can write""" start="00:41:18.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""things like this: C(1)*"_"...""" start="00:41:21.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and lpeg knows that lpeg.C...""" start="00:41:26.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it sort of expands this to lpeg.C,""" start="00:41:33.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""but lpeg.C expects to receive""" start="00:41:38.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""an lpeg pattern, and 1 is not yet an""" start="00:41:42.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lpeg pattern, so it is coerced into an""" start="00:41:44.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lpeg pattern by calling lpeg.P,""" start="00:41:47.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so this short thing here becomes""" start="00:41:51.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""equivalent to lpeg.C(lpeg.P(1)), and the""" start="00:41:55.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""multiplication, when at least one of its""" start="00:42:03.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""arguments is an lpeg pattern... it expects""" start="00:42:07.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to receive two lpeg patterns, and in""" start="00:42:10.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this case the one at the right is""" start="00:42:13.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""just a string, so it is coerced to an lpeg""" start="00:42:15.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""pattern by using lpeg.P.""" start="00:42:18.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""With this idea we can sort of""" start="00:42:20.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""understand the comparison here. I mean,""" start="00:42:25.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""let me run it again... this first part is""" start="00:42:28.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""very similar to a regular expression""" start="00:42:31.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here at the left...""" start="00:42:34.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and when we apply this... Lua pattern""" start="00:42:35.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to this subject here the result""" start="00:42:39.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""is this thing here, this thing, this""" start="00:42:43.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""thing and this thing... I'm going to""" start="00:42:47.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""call each one of these results""" start="00:42:54.320" video="mainVideo-repl" id="subtitle"]] +[[!template text=""""captures", so each of these things""" start="00:42:56.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""between parentheses "captures" a substring""" start="00:42:59.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of the original string and these""" start="00:43:03.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""captured substrings are returned in a""" start="00:43:06.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""certain order. Here is how to express the""" start="00:43:08.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""same thing in lpeg...""" start="00:43:11.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it's very cryptic but it's a""" start="00:43:12.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""good way to understand the some basic""" start="00:43:15.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""operators of lpeg, I mean we can look at""" start="00:43:20.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the manual and understand and""" start="00:43:23.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""what C, S and R do, and also""" start="00:43:26.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""exponentiation... and this strange thing""" start="00:43:30.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here receives this string here, runs""" start="00:43:37.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a function that I have defined, that""" start="00:43:41.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""converts it to an object of a certain""" start="00:43:43.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""class, and that class""" start="00:43:46.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""represents Re patterns, so this thing""" start="00:43:47.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""is treated as a pattern for re.lua,""" start="00:43:52.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and it is matched against the string,""" start="00:43:54.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and it returns the same thing as the""" start="00:43:56.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""other one.""" start="00:43:59.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Also, this thing here also has a""" start="00:44:02.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""comparison with lpegrex, but these""" start="00:44:05.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""patterns are very trivial, they""" start="00:44:08.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""don't do anything very strange...""" start="00:44:11.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so let's go back and see what""" start="00:44:13.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""kinds of very strange things there are.""" start="00:44:15.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Here is the page of lpegrex at github,""" start="00:44:18.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here's the documentation...""" start="00:44:26.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it's relatively brief,""" start="00:44:29.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it explains lpegrex as being an""" start="00:44:32.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""extension of Re.lua, so it explains""" start="00:44:35.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""mainly the additional features... here is a""" start="00:44:39.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""quick reference that explains only the""" start="00:44:42.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""additional features...""" start="00:44:45.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""some of the these things""" start="00:44:46.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I was able to understand""" start="00:44:49.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""by struggling a lot, and some I wasn't""" start="00:44:50.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""able to even by spending several evenings""" start="00:44:57.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""try to to build examples...""" start="00:45:02.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and this is something very nice. Lpegrex""" start="00:45:04.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""comes with some example parsers... and""" start="00:45:12.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here is a parser that parses the Lua""" start="00:45:15.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""grammar - I mean, this is the the grammar""" start="00:45:18.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""for Lua 5.4 at the end of the""" start="00:45:22.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""reference manual... it's just this... this""" start="00:45:25.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""is in a kind of BNF, and this is the BNF""" start="00:45:31.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""translated""" start="00:45:34.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to the language of lpegrex, so this""" start="00:45:35.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""thing uses many constructions that are""" start="00:45:39.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in re.lua and some extra constructions that""" start="00:45:43.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""are described here... and with these""" start="00:45:48.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""examples I was able to to understand""" start="00:45:50.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""some of the...""" start="00:45:54.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of these things here that are""" start="00:45:55.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""described here in the quick""" start="00:45:58.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""reference - but not all.""" start="00:46:00.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""So, I wasn't able to use lpegrex""" start="00:46:04.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""by itself, because some things didn't""" start="00:46:11.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""make much sense, and I decided to""" start="00:46:14.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""reimplement it in my own style,""" start="00:46:16.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""because that would be a way to map...""" start="00:46:18.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to at the very least map what I had""" start="00:46:23.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""understood and what I didn't, learn""" start="00:46:26.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""one feature at a time, do comparisons, and""" start="00:46:29.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so on.""" start="00:46:33.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Here I pointed to two features of lpeg...""" start="00:46:35.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in one I said "Oh, great! This thing can""" start="00:46:38.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""be used to to define grammars, even""" start="00:46:41.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""recursive grammars", and so on...""" start="00:46:44.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and this is an "Oh, no!" feature - one""" start="00:46:45.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""thing that didn't make any sense at all...""" start="00:46:49.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""group captures. One thing that I did to""" start="00:46:51.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""understand group captures was to""" start="00:46:56.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""represent them as diagrams. Of course in""" start="00:46:59.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the beginning I was drawing these""" start="00:47:02.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagrams by hand, but then I realized""" start="00:47:05.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that I could use the bits of lpeg""" start="00:47:08.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that I already knew to build a grammar""" start="00:47:11.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that would parse a little language and""" start="00:47:14.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""generate these diagrams in LaTeX, and I was""" start="00:47:17.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""able to make this.""" start="00:47:21.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""In this diagram here""" start="00:47:21.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this thing above the arrow is Lua code...""" start="00:47:25.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""a piece of Lua code that""" start="00:47:30.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""specifies an lpeg pattern... this""" start="00:47:33.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""thing here at the top is the string that""" start="00:47:37.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""is being matched, and the things below""" start="00:47:39.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the underbraces are the captures that""" start="00:47:43.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""each thing... sorry, that each thing""" start="00:47:46.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""captures.""" start="00:47:50.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""For example, this underbrace here""" start="00:47:51.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""corresponds to this pattern here,""" start="00:47:58.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that parses a single character but""" start="00:48:00.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""doesn't return any captures, this thing""" start="00:48:02.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here parses a single "b" and doesn't""" start="00:48:05.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""return any captures, this thing here""" start="00:48:08.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""parses a single character and captures""" start="00:48:11.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it, and this thing here parses the""" start="00:48:14.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""character "d" and captures it... and this""" start="00:48:16.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""other thing here transforms this""" start="00:48:21.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""pattern into another pattern...""" start="00:48:24.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""returns first a capture with all""" start="00:48:27.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the string that was parsed by this""" start="00:48:33.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""pattern here, and then all the captures""" start="00:48:35.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""returned by this thing here before""" start="00:48:37.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the ":".""" start="00:48:41.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""So, this was a way to build""" start="00:48:42.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""concrete examples for things that the""" start="00:48:45.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lpag manual was explaining in a very terse""" start="00:48:48.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""way, and it worked for me - some things""" start="00:48:52.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that were very""" start="00:48:55.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""mysterious started to make sense, and I""" start="00:48:57.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""started to have intelligent questions""" start="00:48:59.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to ask in the mailing list.""" start="00:49:03.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""And with that I was able to""" start="00:49:06.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""understand what are group captures,""" start="00:49:10.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and group captures that receive a name...""" start="00:49:12.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Well, let me explain what this does.""" start="00:49:17.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""This thing here captures... sorry, parses""" start="00:49:22.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the empty string and returns this as a""" start="00:49:27.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""constant... so, this is something that""" start="00:49:29.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""doesn't exist in regular expressions...""" start="00:49:32.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""it parses nothing and""" start="00:49:35.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""returns this as a capture... then this""" start="00:49:38.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""thing here returns these two""" start="00:49:41.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""constants here, and parses the empty""" start="00:49:44.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""string, and this thing here converts""" start="00:49:47.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the results of this thing here into a""" start="00:49:51.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""group capture, and stores it in the label""" start="00:49:54.160" video="mainVideo-repl" id="subtitle"]] +[[!template text=""""d"... and then here's another constant""" start="00:49:57.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""capture.""" start="00:50:03.280" video="mainVideo-repl" id="subtitle"]] + +[[!template new="1" text="""Building lists""" start="00:50:03.720" video="mainVideo-repl" id="subtitle"]] + +[[!template text="""And I realized that these things""" start="00:50:03.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here were similar to how Lua""" start="00:50:05.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""specifies building lists...""" start="00:50:08.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""when we build... sorry, tables. When""" start="00:50:09.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""we build a table, and we say that the""" start="00:50:16.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""first element of the table is here, this""" start="00:50:18.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""element is put at the end of the table...""" start="00:50:21.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""when after the that would say d=42...""" start="00:50:23.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""we are putting the 42""" start="00:50:29.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in the the slot whose key is "d".""" start="00:50:31.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""This was happening with lpeg captures,""" start="00:50:34.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""but there was something very strange...""" start="00:50:39.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""these group captures could hold""" start="00:50:43.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""more than one capture - more than one""" start="00:50:46.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""value... so there was something between""" start="00:50:49.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lists and tables. I started to use this""" start="00:50:51.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""notation to...""" start="00:50:58.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""explain in my notation what they""" start="00:51:00.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""were doing... many things started""" start="00:51:04.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to make sense, many mysterious""" start="00:51:08.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""sentences in the manual started to""" start="00:51:10.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""make sense... but some didn't...""" start="00:51:12.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""but at least I was able to send""" start="00:51:14.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""some intelligent questions to the""" start="00:51:19.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""mailing lis,t and the author of Lua and""" start="00:51:22.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lpeg answered some of them...""" start="00:51:25.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""he was not very happy about my""" start="00:51:27.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""questions - he... told me that those""" start="00:51:31.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""diagrams were a waste of time, the""" start="00:51:34.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""manual was perfectly clear, and so on...""" start="00:51:37.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""whatever - but I was able to...""" start="00:51:40.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so, it was weird, but I was able to""" start="00:51:44.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""understand lots of things from his""" start="00:51:48.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""answers. This is a copy of one of""" start="00:51:51.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""my messages, then there's another one,""" start="00:51:56.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""another one, some of them had diagrams...""" start="00:51:58.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""then he complained about these diagrams,""" start="00:52:01.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""he said that these things here, that look""" start="00:52:04.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""like table constructors, "do not exist"...""" start="00:52:08.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""whatever... anyway, once I understood""" start="00:52:11.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""group captures many features""" start="00:52:17.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""were very easy to understand""" start="00:52:20.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and I started to be able to use lpeg to""" start="00:52:23.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""to build some very interesting things...""" start="00:52:26.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I was able to reproduce some""" start="00:52:28.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of the features that I saw in lpegrex -""" start="00:52:33.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""remember that this... where is that?""" start="00:52:36.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this is the syntax of Lua... here -""" start="00:52:41.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I was able to understand""" start="00:52:46.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""how these things here were translated to""" start="00:52:48.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lpeg code... to lpeg patterns""" start="00:52:52.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""by using group captures in a certain""" start="00:52:55.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""way... I was able to implement them""" start="00:52:58.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in ELpeg1.lua...""" start="00:53:03.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and after some time I was able to use""" start="00:53:04.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""ELpeg1.lua to build grammars that""" start="00:53:08.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""were able to parse""" start="00:53:12.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""arithmetical expressions with the""" start="00:53:14.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""right precedence... and here's an example""" start="00:53:18.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in which I built the grammar step by step...""" start="00:53:20.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and I test the current grammar, and I""" start="00:53:23.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""replace a bit, and then I test the new""" start="00:53:29.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""grammar and so on...""" start="00:53:35.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and you can see that the result is""" start="00:53:36.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""always a tree that is drawn in a""" start="00:53:39.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""nice two dimensional way...""" start="00:53:43.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""At this point these powers here""" start="00:53:44.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""are returned as a list,""" start="00:53:48.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""as an operation "pow"""" start="00:53:50.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""with several arguments, here... and then""" start="00:53:53.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I apply a kind of parsing combinator,""" start="00:53:57.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here... that transforms these trees into""" start="00:54:00.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""other trees and with these combinators""" start="00:54:03.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here I can specify that the "^" is""" start="00:54:08.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""associative in a certain direction...""" start="00:54:12.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that the "/" is associative in""" start="00:54:14.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""another direction... the "-" uses""" start="00:54:17.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the same direction as a the "/",""" start="00:54:20.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and so on... and they have the""" start="00:54:23.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""right precedences.""" start="00:54:26.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""So, here are the tests...""" start="00:54:29.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here is my file ELpeg1.lua... it has""" start="00:54:34.560" video="mainVideo-repl" id="subtitle"]] +[[!template text="""several classes, each class has tests""" start="00:54:38.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""after it...""" start="00:54:41.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I was able to implement something""" start="00:54:42.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that lpegrex has, that is called""" start="00:54:46.240" video="mainVideo-repl" id="subtitle"]] +[[!template text=""""keywords", that is very useful for parsing""" start="00:54:50.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""programs in programming languages...""" start="00:54:53.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I was able to implement something""" start="00:54:56.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""similar to the debugger... to the""" start="00:54:59.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""lpeg debugger lpeg uses... I was""" start="00:55:02.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""frustrated by some limitations of""" start="00:55:08.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the lpeg debugger, and I implemented""" start="00:55:11.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""my own that is, uh... much better!...""" start="00:55:16.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Let me show something else... I was""" start="00:55:23.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""able to translate a good part of the""" start="00:55:24.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Lua parser, here, to ELpeg1.lua... I haven't""" start="00:55:27.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""finished yet, but I have most of the""" start="00:55:33.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the translation here...""" start="00:55:38.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and after having all that I was able to""" start="00:55:39.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""build other grammars very quickly...""" start="00:55:47.280" video="mainVideo-repl" id="subtitle"]] +[[!template text="""writing new parsers finally became fun.""" start="00:55:50.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""And here's one example that I showed in the""" start="00:55:55.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""beginning.""" start="00:55:58.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""If I remember correctly...""" start="00:56:00.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I took a figure from the Wikipedia...""" start="00:56:05.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I don't have its link now...""" start="00:56:10.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""but I specified a grammar that parses""" start="00:56:12.440" video="mainVideo-repl" id="subtitle"]] +[[!template text="""exactly the example that appears""" start="00:56:17.080" video="mainVideo-repl" id="subtitle"]] +[[!template text="""in the Wikipedia...""" start="00:56:20.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""so, with my grammar, considering that""" start="00:56:20.840" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the top level entry is "Stmt", when I""" start="00:56:24.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""parse this string here""" start="00:56:28.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the result is this tree...""" start="00:56:30.680" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and I can do some operations on that,""" start="00:56:36.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I can define how this thing is to be""" start="00:56:41.120" video="mainVideo-repl" id="subtitle"]] +[[!template text="""converted into LaTeX,""" start="00:56:44.040" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I can define other operations""" start="00:56:45.640" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that convert trees into other trees, and""" start="00:56:49.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""here are some tests of these operations...""" start="00:56:53.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""This is what I showed in the beginning...""" start="00:56:54.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I'm not going to explain all the details""" start="00:57:00.360" video="mainVideo-repl" id="subtitle"]] +[[!template text="""of this thing now...""" start="00:57:02.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this :show() converts this thing""" start="00:57:04.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""into LaTeX in the way specified by these""" start="00:57:09.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""instructions here, that says that...""" start="00:57:11.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""well, whatever...""" start="00:57:16.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and here's the result - the LaTeXed result...""" start="00:57:25.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and these diagrams here are generated by""" start="00:57:32.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this file here, that defines a simple""" start="00:57:41.760" video="mainVideo-repl" id="subtitle"]] +[[!template text="""grammar that parses this thing here,""" start="00:57:46.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and then LaTeXes it in a certain way, and""" start="00:57:48.480" video="mainVideo-repl" id="subtitle"]] +[[!template text="""and also tests to check if this code here...""" start="00:57:52.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""this Lua code that generates an lpeg grammar...""" start="00:57:56.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""parses this subject here and""" start="00:58:02.000" video="mainVideo-repl" id="subtitle"]] +[[!template text="""returns the expected result...""" start="00:58:05.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""So: this is the code that I""" start="00:58:08.600" video="mainVideo-repl" id="subtitle"]] +[[!template text="""wanted to show. I wanted to show many""" start="00:58:12.240" video="mainVideo-repl" id="subtitle"]] +[[!template text="""more things but I wasn't able to prepare""" start="00:58:16.720" video="mainVideo-repl" id="subtitle"]] +[[!template text="""them before the conference... and I hope""" start="00:58:19.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""that soon - for some value of "soon" -""" start="00:58:23.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I'll be able to create REPL-based""" start="00:58:27.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""tutorials for lpeg, Re, and ELpeg1.lua...""" start="00:58:30.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""where lpeg is something very famous,""" start="00:58:33.920" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Re is a module of lpeg...""" start="00:58:36.320" video="mainVideo-repl" id="subtitle"]] +[[!template text="""I could also do something like this""" start="00:58:39.200" video="mainVideo-repl" id="subtitle"]] +[[!template text="""for lpegrex... and ELpeg1.lua is""" start="00:58:42.400" video="mainVideo-repl" id="subtitle"]] +[[!template text="""the thing that I wrote, the one that""" start="00:58:47.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""has test in comments, and the tests""" start="00:58:51.160" video="mainVideo-repl" id="subtitle"]] +[[!template text="""usually generate trees, and sometimes""" start="00:58:56.800" video="mainVideo-repl" id="subtitle"]] +[[!template text="""they generate TeX code.""" start="00:58:59.520" video="mainVideo-repl" id="subtitle"]] +[[!template text="""Yeah, so that's it! I wanted to""" start="00:59:00.880" video="mainVideo-repl" id="subtitle"]] +[[!template text="""present much more but I wasn't able to""" start="00:59:04.960" video="mainVideo-repl" id="subtitle"]] +[[!template text="""prepare it... so: sorry, thanks, bye! =)""" start="00:59:07.160" 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) |