summaryrefslogtreecommitdiffstats
path: root/2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt
diff options
context:
space:
mode:
Diffstat (limited to '2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt')
-rw-r--r--2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt3324
1 files changed, 3324 insertions, 0 deletions
diff --git a/2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt b/2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt
new file mode 100644
index 00000000..723fc45a
--- /dev/null
+++ b/2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt
@@ -0,0 +1,3324 @@
+WEBVTT captioned by eduardo
+Kind: captions
+Language: en-GB
+
+NOTE Intro
+
+00:00:00.000 --> 00:00:03.079
+Hi! My name is Eduardo Ochs
+
+00:00:03.080 --> 00:00:05.519
+and the title of this talk is: REPLs
+
+00:00:05.520 --> 00:00:09.399
+in strange places - Lua, LateX, LPeg, LPegRex,
+
+00:00:09.400 --> 00:00:12.119
+and TikZ. I'm the author of an Emacs
+
+00:00:12.120 --> 00:00:14.879
+package called eev, and this is a talk
+
+00:00:14.880 --> 00:00:18.479
+at the EmacsConf 2023, that is happening in
+
+00:00:18.480 --> 00:00:22.519
+December 2023, at the internets.
+
+NOTE Diagrams
+
+00:00:22.520 --> 00:00:23.079
+This is one of the
+
+00:00:23.080 --> 00:00:24.919
+examples of diagrams that we are
+
+00:00:24.920 --> 00:00:27.639
+going to see - let me show how I generate
+
+00:00:27.640 --> 00:00:30.599
+it... one second,
+
+00:00:30.600 --> 00:00:35.799
+I have to use a smaller font here...
+
+00:00:35.800 --> 00:00:39.159
+this is a file called ParseTree2.lua...
+
+00:00:39.160 --> 00:00:42.919
+let me go back to this block of tests again...
+
+00:00:42.920 --> 00:00:43.879
+and now if I run
+
+00:00:43.880 --> 00:00:47.759
+this...
+
+00:00:47.760 --> 00:00:50.159
+we get these outputs here at the
+
+00:00:50.160 --> 00:00:53.959
+right, and then in this line here it
+
+00:00:53.960 --> 00:00:58.119
+generates a PDF, and if I type f8 here it
+
+00:00:58.120 --> 00:01:03.919
+shows the PDF in the lower right window.
+
+NOTE eev
+
+00:01:03.920 --> 00:01:06.079
+Let me start by explaining
+
+00:01:06.080 --> 00:01:09.839
+briefly what is eev.
+
+00:01:09.840 --> 00:01:12.239
+First: it is something that
+
+00:01:12.240 --> 00:01:14.759
+appeared by accident in the mid-90s - I
+
+00:01:14.760 --> 00:01:16.799
+explained this story in my
+
+00:01:16.800 --> 00:01:20.159
+presentation at the EmacsConf 2019...
+
+00:01:20.160 --> 00:01:23.159
+it's a package... it's an Emacs
+
+00:01:23.160 --> 00:01:26.519
+package that is part of ELPA... it has at
+
+00:01:26.520 --> 00:01:29.679
+least 10 users - those are the ones
+
+00:01:29.680 --> 00:01:32.559
+that I know by name...
+
+00:01:32.560 --> 00:01:38.439
+eev means `emacs-execute-verbosely'...
+
+00:01:38.440 --> 00:01:40.959
+eev is something that treats eval-last-sexp
+
+00:01:40.960 --> 00:01:43.999
+as the central feature of Emacs...
+
+00:01:44.000 --> 00:01:45.599
+eev blurs the distinction between
+
+00:01:45.600 --> 00:01:48.919
+programmers and users, and it replaces
+
+00:01:48.920 --> 00:01:51.679
+the slogan "users should not be forced to
+
+00:01:51.680 --> 00:01:53.679
+see Lisp", that is something that Richard
+
+00:01:53.680 --> 00:01:57.559
+Stallman told me once, by "users should see
+
+00:01:57.560 --> 00:02:00.479
+Lisp instead of buttons" and "new users
+
+00:02:00.480 --> 00:02:03.999
+should see Lisp in the first 5 minutes"...
+
+00:02:04.000 --> 00:02:05.279
+I'm going to show
+
+00:02:05.280 --> 00:02:08.959
+some examples of that soon.
+
+00:02:08.960 --> 00:02:11.959
+Eev uses code in comments a lot,
+
+00:02:11.960 --> 00:02:15.119
+and also tests in comments...
+
+00:02:15.120 --> 00:02:17.679
+I changed my way of presenting it
+
+00:02:17.680 --> 00:02:19.679
+and it became very REPL-centric
+
+00:02:19.680 --> 00:02:22.319
+in the last few years, in the
+
+00:02:22.320 --> 00:02:24.399
+sense that I start by explaining its
+
+00:02:24.400 --> 00:02:28.679
+main features by its support for REPLs...
+
+00:02:28.680 --> 00:02:31.079
+eev supposes
+
+00:02:31.080 --> 00:02:32.639
+that we want to keep
+
+00:02:32.640 --> 00:02:35.199
+executable notes of everything - I'm also
+
+00:02:35.200 --> 00:02:37.159
+going to show examples of this in a
+
+00:02:37.160 --> 00:02:40.479
+second... eev has lots of "videos for
+
+00:02:40.480 --> 00:02:43.559
+people who hate videos", and it tries to
+
+00:02:43.560 --> 00:02:46.159
+do everything with very little magic and
+
+00:02:46.160 --> 00:02:48.839
+without black boxes - I'm going to explain
+
+00:02:48.840 --> 00:02:50.319
+many of these things very soon.
+
+NOTE Another figure
+
+00:02:50.320 --> 00:02:52.799
+This is a figure that that I'm going
+
+00:02:52.800 --> 00:02:57.119
+to show in details soon, that is
+
+00:02:57.120 --> 00:02:59.959
+about something important about Lua...
+
+00:02:59.960 --> 00:03:03.959
+the font is very bad now, so let me
+
+00:03:03.960 --> 00:03:07.559
+change the font... the figure is this one...
+
+00:03:07.560 --> 00:03:08.239
+and...
+
+00:03:08.240 --> 00:03:12.519
+what most people do when they
+
+00:03:12.520 --> 00:03:14.479
+visit a file with something
+
+00:03:14.480 --> 00:03:16.479
+interesting on it is that they just go
+
+00:03:16.480 --> 00:03:18.679
+there and they set a bookmark there, or
+
+00:03:18.680 --> 00:03:21.959
+they put the position in a register...
+
+00:03:21.960 --> 00:03:26.959
+but I prefer to keep
+
+00:03:26.960 --> 00:03:29.199
+links to everything that is interesting
+
+00:03:29.200 --> 00:03:32.119
+as elisp hyperlinks. So, for example, this is
+
+00:03:32.120 --> 00:03:35.079
+an elisp hyperlink to a file, that goes
+
+00:03:35.080 --> 00:03:37.599
+to this anchor here, and to this string
+
+00:03:37.600 --> 00:03:41.439
+after this anchor... this is a variant
+
+00:03:41.440 --> 00:03:44.239
+that opens that file in the window
+
+00:03:44.240 --> 00:03:45.479
+at the right -
+
+00:03:45.480 --> 00:03:48.879
+here... and this is
+
+00:03:48.880 --> 00:03:53.279
+a sexp that changes the font. I
+
+00:03:53.280 --> 00:03:56.679
+have a command with a very short name
+
+00:03:56.680 --> 00:03:59.439
+that does that, but I
+
+00:03:59.440 --> 00:04:02.959
+prefer to keep that as a one-liner.
+
+00:04:02.960 --> 00:04:06.919
+About the videos... we can see
+
+00:04:06.920 --> 00:04:10.079
+the list of first-class videos of eev
+
+00:04:10.080 --> 00:04:14.759
+by executing this, M-x find-1stclassvideos,
+
+00:04:14.760 --> 00:04:18.639
+or by running this alias here, M-x 1c...
+
+00:04:18.640 --> 00:04:20.679
+and then what we see is this...
+
+00:04:20.680 --> 00:04:24.239
+the first sexp here
+
+00:04:24.240 --> 00:04:26.959
+regenerates this buffer - so we can make a
+
+00:04:26.960 --> 00:04:29.399
+mess here and then run this and the
+
+00:04:29.400 --> 00:04:33.519
+original buffer is regenerated again in
+
+00:04:33.520 --> 00:04:34.959
+a clean way...
+
+00:04:34.960 --> 00:04:36.919
+each of these things here
+
+00:04:36.920 --> 00:04:40.879
+opens a buffer with information about
+
+00:04:40.880 --> 00:04:43.999
+a video... let me take a specific
+
+00:04:44.000 --> 00:04:49.159
+example here... this video here is about
+
+00:04:49.160 --> 00:04:51.039
+one of the ancestors of this talk, that
+
+00:04:51.040 --> 00:04:53.479
+is a library that I wrote
+
+00:04:53.480 --> 00:04:58.479
+for creating diagrams in LaTeX using
+
+00:04:58.480 --> 00:05:03.519
+a package called Pict2e using REPLs...
+
+00:05:03.520 --> 00:05:03.959
+anyway...
+
+00:05:03.960 --> 00:05:06.599
+the thing is that if we
+
+00:05:06.600 --> 00:05:11.599
+run a sexp like this one and we don't
+
+00:05:11.600 --> 00:05:14.679
+have a local copy of the video eev
+
+00:05:14.680 --> 00:05:17.599
+will try to download to the local copy -
+
+00:05:17.600 --> 00:05:20.119
+and instead of doing that by asking
+
+00:05:20.120 --> 00:05:21.719
+something like "do you want me
+
+00:05:21.720 --> 00:05:23.999
+to download the local copy? Blah
+
+00:05:24.000 --> 00:05:27.999
+blah blah blah blah..." it simply opens a
+
+00:05:28.000 --> 00:05:30.719
+buffer like this, I mean, if we don't
+
+00:05:30.720 --> 00:05:33.359
+have a local copy yet it will open a
+
+00:05:33.360 --> 00:05:36.359
+buffer like this one, in which these
+
+00:05:36.360 --> 00:05:39.199
+things here in comments are links to the
+
+00:05:39.200 --> 00:05:43.839
+documentation... I mean, this thing here
+
+00:05:43.840 --> 00:05:46.159
+explains the idea of local copies
+
+00:05:46.160 --> 00:05:48.759
+of files from the internet...
+
+00:05:48.760 --> 00:05:54.759
+there are more details here, and here...
+
+00:05:54.760 --> 00:05:57.159
+and this is a script that we
+
+00:05:57.160 --> 00:06:00.519
+can execute line by line, so instead of
+
+00:06:00.520 --> 00:06:02.359
+this script being hidden behind the
+
+00:06:02.360 --> 00:06:06.119
+button that we just press after a
+
+00:06:06.120 --> 00:06:08.399
+question like "Do you want me to do
+
+00:06:08.400 --> 00:06:10.239
+something blah blah blah? Yes or no?"
+
+00:06:10.240 --> 00:06:13.639
+the script is visible here and we can
+
+00:06:13.640 --> 00:06:17.599
+execute it step by step... it creates a
+
+00:06:17.600 --> 00:06:20.799
+terminal with a shell here in the
+
+00:06:20.800 --> 00:06:24.799
+right window, and when we type f8 in
+
+00:06:24.800 --> 00:06:26.839
+one of these lines here the lines are
+
+00:06:26.840 --> 00:06:29.119
+sent... (...) so this is going
+
+00:06:29.120 --> 00:06:31.759
+to download a copy of the video... the
+
+00:06:31.760 --> 00:06:36.639
+wget says that I already have a copy of
+
+00:06:36.640 --> 00:06:39.479
+the video and its subtitles... and so on.
+
+00:06:39.480 --> 00:06:43.879
+And after getting a copy of the video
+
+00:06:43.880 --> 00:06:48.159
+we can run this sexp here and it displays
+
+00:06:48.160 --> 00:06:49.919
+the video.
+
+00:06:49.920 --> 00:06:55.399
+I said that eev has lots of
+
+00:06:55.400 --> 00:06:58.399
+"videos for people who hate videos", and
+
+00:06:58.400 --> 00:06:59.679
+the idea is that very few
+
+00:06:59.680 --> 00:07:02.039
+people are going to watch the videos in
+
+00:07:02.040 --> 00:07:06.559
+real time... and most of the people that
+
+00:07:06.560 --> 00:07:08.279
+I know - or: most of the people that
+
+00:07:08.280 --> 00:07:10.639
+are interested in eev in some
+
+00:07:10.640 --> 00:07:13.479
+way... they are going to watch just
+
+00:07:13.480 --> 00:07:16.319
+small sections of the video, and most of
+
+00:07:16.320 --> 00:07:17.559
+the time they're just going to read the
+
+00:07:17.560 --> 00:07:20.799
+subtitles of the video. So, for each
+
+00:07:20.800 --> 00:07:23.479
+one of the videos we have a page
+
+00:07:23.480 --> 00:07:27.039
+about the video... let me see if I
+
+00:07:27.040 --> 00:07:29.999
+have internet here... yes. This is a
+
+00:07:30.000 --> 00:07:32.879
+page...
+
+00:07:32.880 --> 00:07:38.999
+and usually these pages have a link
+
+00:07:39.000 --> 00:07:40.759
+to another page that
+
+00:07:40.760 --> 00:07:43.239
+has all the subtitles of the
+
+00:07:43.240 --> 00:07:46.639
+video... uh, wherever... in this one
+
+00:07:46.640 --> 00:07:48.319
+it's not so visible...
+
+00:07:48.320 --> 00:07:50.599
+but anyway, there are several
+
+00:07:50.600 --> 00:07:52.479
+ways of accessing the subtitles of the
+
+00:07:52.480 --> 00:07:56.239
+video, and one of the ways is by running
+
+00:07:56.240 --> 00:07:57.519
+this sexp here,
+
+00:07:57.520 --> 00:08:01.559
+that opens a file in Lua that is
+
+00:08:01.560 --> 00:08:03.319
+what I use to generate the
+
+00:08:03.320 --> 00:08:04.479
+subtitles.
+
+00:08:04.480 --> 00:08:08.519
+Anyway... by the way, these things... each
+
+00:08:08.520 --> 00:08:12.039
+one of these things here is a hyperlink
+
+00:08:12.040 --> 00:08:15.239
+to a position of the video, so if I type
+
+00:08:15.240 --> 00:08:18.879
+this the right way it goes to that
+
+00:08:18.880 --> 00:08:24.119
+position. Anyway, let me go back...
+
+00:08:24.120 --> 00:08:27.279
+also, the tutorials of eev... the
+
+00:08:27.280 --> 00:08:31.359
+"intros" of eev, that start with "find-" and
+
+00:08:31.360 --> 00:08:34.279
+end with "-intro", they have lots of blocks
+
+00:08:34.280 --> 00:08:39.039
+that say "[Video links:]", like this one, and
+
+00:08:39.040 --> 00:08:41.359
+these blocks have links to positions
+
+00:08:41.360 --> 00:08:43.879
+in videos, and if we don't have a local
+
+00:08:43.880 --> 00:08:47.919
+copy of the video yet the thing shows
+
+00:08:47.920 --> 00:08:49.799
+us a script that lets us download the
+
+00:08:49.800 --> 00:08:50.599
+local copy.
+
+00:08:50.600 --> 00:08:54.399
+Anyway, I said that I was going
+
+00:08:54.400 --> 00:08:58.759
+to explain what I mean by "magic" and
+
+00:08:58.760 --> 00:08:59.639
+"black boxes".
+
+00:08:59.640 --> 00:09:03.119
+this is something that I've been
+
+00:09:03.120 --> 00:09:05.119
+trying to explain for a long time, and I
+
+00:09:05.120 --> 00:09:07.319
+think that I got a very good explanation
+
+00:09:07.320 --> 00:09:09.839
+about that in a video that I made
+
+00:09:09.840 --> 00:09:13.199
+about something called eev-wconfig, that
+
+00:09:13.200 --> 00:09:14.999
+is a tool for configuring eev on
+
+00:09:15.000 --> 00:09:19.199
+Windows without "magic" - without buttons
+
+00:09:19.200 --> 00:09:22.479
+that do things without explaining what
+
+00:09:22.480 --> 00:09:22.879
+they're doing.
+
+00:09:22.880 --> 00:09:25.799
+This is a part of the subtitles
+
+00:09:25.800 --> 00:09:28.039
+of the video, let me read that...
+
+00:09:28.040 --> 00:09:32.319
+eev-wconfig is an attempt to solve the
+
+00:09:32.320 --> 00:09:35.039
+problem of how to install these things
+
+00:09:35.040 --> 00:09:37.279
+on Windows both without magic and with
+
+00:09:37.280 --> 00:09:37.879
+very little
+
+00:09:37.880 --> 00:09:41.679
+magic. Remember this slogan: "any
+
+00:09:41.680 --> 00:09:44.359
+sufficiently advanced technology is
+
+00:09:44.360 --> 00:09:45.399
+indistinguishable from
+
+00:09:45.400 --> 00:09:49.679
+magic". Here in this video I'm going to
+
+00:09:49.680 --> 00:09:52.199
+use the term magic as a shorthand
+
+00:09:52.200 --> 00:09:55.239
+for sufficiently advanced technology,
+
+00:09:55.240 --> 00:09:57.799
+that is something that is complex and
+
+00:09:57.800 --> 00:10:00.199
+non-obvious and that is
+
+00:10:00.200 --> 00:10:02.119
+indistinguishable from magic in the
+
+00:10:02.120 --> 00:10:04.119
+sense of being almost impossible to
+
+00:10:04.120 --> 00:10:07.439
+understand. And I'm also going to use a
+
+00:10:07.440 --> 00:10:10.279
+the term "black box" as a near-synonym for
+
+00:10:10.280 --> 00:10:13.079
+magic, and sometimes the term
+
+00:10:13.080 --> 00:10:16.039
+"black box" is more convenient even though
+
+00:10:16.040 --> 00:10:17.919
+it's a bit longer - it has more
+
+00:10:17.920 --> 00:10:20.159
+letters - because when I use the term
+
+00:10:20.160 --> 00:10:22.599
+black box it invites us to use
+
+00:10:22.600 --> 00:10:25.479
+expressions like "opening the black box",
+
+00:10:25.480 --> 00:10:26.639
+and I'm going to use that
+
+00:10:26.640 --> 00:10:28.039
+expression a lot.
+
+00:10:28.040 --> 00:10:37.399
+Now let me try to explain what is...
+
+00:10:37.400 --> 00:10:41.039
+sorry, let me change the font...
+
+00:10:41.040 --> 00:10:45.479
+what is Lua. Lua is a minimalistic
+
+00:10:45.480 --> 00:10:49.999
+language, in the sense of
+
+00:10:50.000 --> 00:10:53.679
+"batteries not included"... it uses
+
+00:10:53.680 --> 00:10:55.999
+associative tables for most of its data
+
+00:10:56.000 --> 00:10:56.799
+structures...
+
+00:10:56.800 --> 00:11:00.239
+and it is so minimalistic
+
+00:11:00.240 --> 00:11:03.999
+that its default print function, when
+
+00:11:04.000 --> 00:11:06.679
+we tell... when we create an associative
+
+00:11:06.680 --> 00:11:09.559
+table and we ask it to print...
+
+00:11:09.560 --> 00:11:13.319
+when we ask "print" to print an
+
+00:11:13.320 --> 00:11:15.719
+associative table it just prints the
+
+00:11:15.720 --> 00:11:17.879
+address of the table. Here are some
+
+00:11:17.880 --> 00:11:21.599
+examples... here is a table, and when we
+
+00:11:21.600 --> 00:11:24.679
+ask "print" to print it it just says
+
+00:11:24.680 --> 00:11:26.839
+that it's the table at this address here.
+
+00:11:26.840 --> 00:11:30.119
+So, one of things that that most
+
+00:11:30.120 --> 00:11:32.919
+people do when they start using Lua is
+
+00:11:32.920 --> 00:11:35.239
+that either they download a package with
+
+00:11:35.240 --> 00:11:37.079
+a pretty-printing function or they write
+
+00:11:37.080 --> 00:11:39.359
+their own pretty-printing functions. My
+
+00:11:39.360 --> 00:11:41.519
+own pretty-printing function is called
+
+00:11:41.520 --> 00:11:46.159
+PP, with upper case letters, and it works
+
+00:11:46.160 --> 00:11:47.679
+like this...
+
+00:11:47.680 --> 00:11:50.279
+and it prints associative tables
+
+00:11:50.280 --> 00:11:53.839
+in a way like this. It says that for
+
+00:11:53.840 --> 00:11:57.479
+the key 1 the the value associated to
+
+00:11:57.480 --> 00:12:00.039
+it is 2, for the key 2 the value is
+
+00:12:00.040 --> 00:12:04.959
+3, and for the key 3 the value is 5.
+
+00:12:04.960 --> 00:12:11.079
+When I started using Lua one of my
+
+00:12:11.080 --> 00:12:13.839
+favorite languages was also a language
+
+00:12:13.840 --> 00:12:15.639
+that used associative tables a lot -
+
+00:12:15.640 --> 00:12:16.839
+it was called Icon...
+
+00:12:16.840 --> 00:12:21.039
+and I had to write my own
+
+00:12:21.040 --> 00:12:23.839
+pretty-printing functions for Icon, so
+
+00:12:23.840 --> 00:12:27.319
+I just had to port my pretty-printing
+
+00:12:27.320 --> 00:12:29.719
+functions to Lua... and my first
+
+00:12:29.720 --> 00:12:32.239
+version looked at something like this... it
+
+00:12:32.240 --> 00:12:35.999
+just had some some global functions... lots
+
+00:12:36.000 --> 00:12:39.639
+of them, actually...
+
+00:12:39.640 --> 00:12:42.279
+and after a while I rewrote it, and I
+
+00:12:42.280 --> 00:12:44.599
+rewrote it again, and again, and again, and
+
+00:12:44.600 --> 00:12:47.279
+this is one of the versions of that,
+
+00:12:47.280 --> 00:12:49.879
+is not even the default at this
+
+00:12:49.880 --> 00:12:51.559
+point...
+
+00:12:51.560 --> 00:12:54.119
+"Tos" is for "to string"...
+
+00:12:54.120 --> 00:12:58.279
+and this is a demo...
+
+00:12:58.280 --> 00:13:01.919
+it's very modular, so it's easy to replace
+
+00:13:01.920 --> 00:13:05.639
+parts of it, or to toggle flags... and this
+
+00:13:05.640 --> 00:13:08.119
+is an example. If I try to print the
+
+00:13:08.120 --> 00:13:09.999
+table of methods for a certain
+
+00:13:10.000 --> 00:13:14.359
+class... I will need a smaller font...
+
+00:13:14.360 --> 00:13:16.799
+it prints the table like this, with the
+
+00:13:16.800 --> 00:13:20.039
+names of the methods and then links to
+
+00:13:20.040 --> 00:13:21.719
+the source code of the functions...
+
+00:13:21.720 --> 00:13:25.399
+these links only make sense in Emacs and
+
+00:13:25.400 --> 00:13:25.959
+in eev...
+
+00:13:25.960 --> 00:13:30.359
+and when we run a link like this one...
+
+00:13:30.360 --> 00:13:32.039
+it shows the source code in the
+
+00:13:32.040 --> 00:13:35.079
+window at the right. So, for some
+
+00:13:35.080 --> 00:13:37.879
+functions the source code is three lines,
+
+00:13:37.880 --> 00:13:39.999
+for other ones it's one line... and
+
+00:13:40.000 --> 00:13:44.879
+whatever. Anyway, let me go
+
+00:13:44.880 --> 00:13:47.039
+back... Lua can be used in many different
+
+00:13:47.040 --> 00:13:50.359
+styles... most people hate other people's
+
+00:13:50.360 --> 00:13:53.839
+styles... when I started using it in the
+
+00:13:53.840 --> 00:13:57.679
+year 2000 I learned most of the basic
+
+00:13:57.680 --> 00:13:59.839
+language in a single day - it was very
+
+00:13:59.840 --> 00:14:02.119
+similar to things that I was already
+
+00:14:02.120 --> 00:14:05.639
+using... and then I rewrote the the mini-
+
+00:14:05.640 --> 00:14:10.279
+language that I was using to
+
+00:14:10.280 --> 00:14:13.559
+generate the HTML for my pages
+
+00:14:13.560 --> 00:14:16.199
+in Lua... actually I had to rewrite it
+
+00:14:16.200 --> 00:14:18.079
+many times, but the first version I
+
+00:14:18.080 --> 00:14:21.519
+certainly did in my first weeks or first
+
+00:14:21.520 --> 00:14:22.519
+months using Lua...
+
+00:14:22.520 --> 00:14:27.279
+In the beginning I was just using
+
+00:14:27.280 --> 00:14:30.159
+it for writing programs that either
+
+00:14:30.160 --> 00:14:32.759
+didn't take any input at all - because
+
+00:14:32.760 --> 00:14:35.079
+the input was already in the source file -
+
+00:14:35.080 --> 00:14:40.599
+or that worked as Unix programs,
+
+00:14:40.600 --> 00:14:43.199
+that would read files
+
+00:14:43.200 --> 00:14:45.279
+and process these files in some way
+
+00:14:45.280 --> 00:14:48.999
+and output something.
+
+00:14:49.000 --> 00:14:52.319
+I mentioned the "basic language" here...
+
+00:14:52.320 --> 00:14:54.719
+I only learned how to use closures,
+
+00:14:54.720 --> 00:14:58.479
+metatables, and coroutines many years later...
+
+00:14:58.480 --> 00:15:02.399
+in the beginning, when I started using Lua,
+
+00:15:02.400 --> 00:15:04.199
+it didn't have a package manager...
+
+00:15:04.200 --> 00:15:06.799
+it appeared later, it is called
+
+00:15:06.800 --> 00:15:10.119
+Luarocks... it has had this package
+
+00:15:10.120 --> 00:15:13.279
+manager for several years, most
+
+00:15:13.280 --> 00:15:15.719
+of the rocks for Luarocks are poorly
+
+00:15:15.720 --> 00:15:18.959
+documented and hacker-unfriendly,
+
+00:15:18.960 --> 00:15:21.199
+so you can't rely just on the
+
+00:15:21.200 --> 00:15:23.679
+documentation and you can't rely just on the
+
+00:15:23.680 --> 00:15:26.719
+source code, because, I mean... if you are
+
+00:15:26.720 --> 00:15:29.159
+a genius of course you can, but for
+
+00:15:29.160 --> 00:15:31.479
+people who are either lazy, or dumb, or
+
+00:15:31.480 --> 00:15:34.279
+whatever, like me, or unfocused...
+
+00:15:34.280 --> 00:15:36.759
+the source code is hard to
+
+00:15:36.760 --> 00:15:38.959
+understand and hard to tinker with.
+
+00:15:38.960 --> 00:15:43.319
+Some rocks are excellent. The
+
+00:15:43.320 --> 00:15:46.599
+best rocks are well documented
+
+00:15:46.600 --> 00:15:48.719
+but they are hacker-unfriendly
+
+00:15:48.720 --> 00:15:50.999
+in a sense that I hope that
+
+00:15:51.000 --> 00:15:52.879
+I'll be able to explain soon.
+
+00:15:52.880 --> 00:15:54.999
+The best rocks use local
+
+00:15:55.000 --> 00:15:58.799
+variables and metatables a lot -
+
+00:15:58.800 --> 00:16:02.519
+so if you are beginner
+
+00:16:02.520 --> 00:16:03.799
+learning Lua you're not going to
+
+00:16:03.800 --> 00:16:06.159
+understand what their source code do...
+
+00:16:06.160 --> 00:16:08.519
+they use lots of dirty tricks.
+
+NOTE Object orientation in Lua
+
+00:16:08.520 --> 00:16:12.479
+Let me talk a bit about object
+
+00:16:12.480 --> 00:16:14.959
+orientation in Lua. It can be done in
+
+00:16:14.960 --> 00:16:15.879
+many ways...
+
+00:16:15.880 --> 00:16:18.999
+the main book about Lua, called
+
+00:16:19.000 --> 00:16:21.439
+"Programming in Lua", by one of the authors
+
+00:16:21.440 --> 00:16:23.959
+of the language, Roberto Ierusalimschy,
+
+00:16:23.960 --> 00:16:26.679
+presents several ways of doing
+
+00:16:26.680 --> 00:16:29.279
+object orientation in Lua... I hated all
+
+00:16:29.280 --> 00:16:33.199
+of these ways - and also the ways that I
+
+00:16:33.200 --> 00:16:34.519
+tried from the rocks.
+
+00:16:34.520 --> 00:16:38.559
+And then I wrote my own way
+
+00:16:38.560 --> 00:16:40.639
+of doing object orientation in Lua... it's
+
+00:16:40.640 --> 00:16:43.559
+very minimalistic, it's in this file here,
+
+00:16:43.560 --> 00:16:48.679
+eoo.lua... the main code is just this five
+
+00:16:48.680 --> 00:16:49.639
+lines here...
+
+00:16:49.640 --> 00:16:53.439
+and here's an example of how it works.
+
+00:16:53.440 --> 00:16:58.439
+Here we define the class Vector,
+
+00:16:58.440 --> 00:17:02.719
+with some metamethods...
+
+00:17:02.720 --> 00:17:05.959
+this metamethod here will tell Lua
+
+00:17:05.960 --> 00:17:08.319
+what to do when the
+
+00:17:08.320 --> 00:17:12.639
+user asks to add two vectors, this one
+
+00:17:12.640 --> 00:17:15.919
+here tells Lua what to do when the user
+
+00:17:15.920 --> 00:17:18.479
+asks Lua to convert a vector to a string,
+
+00:17:18.480 --> 00:17:21.439
+and... whatever, this one is
+
+00:17:21.440 --> 00:17:24.039
+something that I'm going to explain in a
+
+00:17:24.040 --> 00:17:27.479
+second. So, here we create a vector with
+
+00:17:27.480 --> 00:17:30.279
+these coordinates, 3 and 4... here we create
+
+00:17:30.280 --> 00:17:33.319
+another Vector... if we "print" here then Lua
+
+00:17:33.320 --> 00:17:36.439
+uses this function here, in the __tostring...
+
+00:17:36.440 --> 00:17:39.759
+if we add the two vectors it uses this
+
+00:17:39.760 --> 00:17:43.479
+function here, in the __add metamethod, and
+
+00:17:43.480 --> 00:17:45.359
+if we run the method :norm...
+
+00:17:45.360 --> 00:17:49.959
+it is defined here, in the table __index.
+
+00:17:49.960 --> 00:17:57.999
+Anyway...
+
+00:17:58.000 --> 00:18:02.439
+Even this thing being so small I used
+
+00:18:02.440 --> 00:18:04.719
+to forget how its innards worked all
+
+00:18:04.720 --> 00:18:08.119
+the time. Actually I always forget how
+
+00:18:08.120 --> 00:18:09.759
+things work and I have to remember them
+
+00:18:09.760 --> 00:18:12.479
+somehow... and I have to have
+
+00:18:12.480 --> 00:18:15.959
+tricks for remembering, and tricks for
+
+00:18:15.960 --> 00:18:18.719
+summarizing things, and diagrams, and so
+
+00:18:18.720 --> 00:18:22.199
+on. And every time that I forgot how this
+
+00:18:22.200 --> 00:18:24.799
+thing worked I went back to the
+
+00:18:24.800 --> 00:18:26.879
+source code, and then I looked at the
+
+00:18:26.880 --> 00:18:29.039
+diagrams... or, of course, in the
+
+00:18:29.040 --> 00:18:31.719
+first times I had to draw the diagrams...
+
+00:18:31.720 --> 00:18:35.239
+and I run the examples, and of course in
+
+00:18:35.240 --> 00:18:36.479
+in the beginning I thought that the code
+
+00:18:36.480 --> 00:18:39.119
+was clear and my examples were very
+
+00:18:39.120 --> 00:18:41.559
+brief, and so I had to rewrite the
+
+00:18:41.560 --> 00:18:44.719
+examples many times until they became,
+
+00:18:44.720 --> 00:18:45.639
+let's say...
+
+00:18:45.640 --> 00:18:47.759
+perfect.
+
+00:18:47.760 --> 00:18:52.599
+I was saying that Lua can be used in
+
+00:18:52.600 --> 00:18:56.359
+many ways, and in my way of using Lua - in
+
+00:18:56.360 --> 00:18:59.439
+my favorite way - everything can be
+
+00:18:59.440 --> 00:19:02.159
+inspected and modified from REPLs,
+
+00:19:02.160 --> 00:19:06.319
+like we can do in Emacs and in SmallTalk,
+
+00:19:06.320 --> 00:19:08.519
+or sort of. So, in my
+
+00:19:08.520 --> 00:19:10.239
+favorite way of using Lua there's no
+
+00:19:10.240 --> 00:19:12.679
+security at all, everything can be
+
+00:19:12.680 --> 00:19:14.919
+changed at all times.
+
+00:19:14.920 --> 00:19:19.119
+Of course most people hate that...
+
+NOTE My init file
+
+00:19:19.120 --> 00:19:22.599
+My init file has lots of classes... by the
+
+00:19:22.600 --> 00:19:26.079
+way, instead of keeping many small files
+
+00:19:26.080 --> 00:19:29.639
+with many things I put lots of stuff
+
+00:19:29.640 --> 00:19:31.279
+in just one big init file.
+
+00:19:31.280 --> 00:19:34.599
+My init file has lots of classes,
+
+00:19:34.600 --> 00:19:37.959
+and lots of global functions, and
+
+00:19:37.960 --> 00:19:41.799
+lots of cruft - and people hate that,
+
+00:19:41.800 --> 00:19:44.559
+of course. This is an example...
+
+00:19:44.560 --> 00:19:46.439
+this is the index at the top
+
+00:19:46.440 --> 00:19:48.359
+of my init file,
+
+00:19:48.360 --> 00:19:53.119
+the classes start here, and then
+
+00:19:53.120 --> 00:19:59.119
+we have some functions, and
+
+00:19:59.120 --> 00:20:01.199
+then we have functions that load
+
+00:20:01.200 --> 00:20:03.839
+certain packages, and then we have... cruft.
+
+00:20:03.840 --> 00:20:04.919
+Whatever.
+
+00:20:04.920 --> 00:20:08.119
+Most people think that my style
+
+00:20:08.120 --> 00:20:10.279
+of using Lua is dirty, and dangerous...
+
+00:20:10.280 --> 00:20:12.959
+and they wouldn't touch my Lua code
+
+00:20:12.960 --> 00:20:15.479
+with a 10 feet pole... but most of the
+
+00:20:15.480 --> 00:20:18.599
+things that I'm going to present here in
+
+00:20:18.600 --> 00:20:23.199
+this presentation are ideas that should
+
+00:20:23.200 --> 00:20:28.159
+be easy to port to other environments
+
+00:20:28.160 --> 00:20:32.279
+and other languages, especially the
+
+00:20:32.280 --> 00:20:35.279
+diagrams... so the code is not so important.
+
+NOTE LaTeX and LuaLaTeX
+
+00:20:35.280 --> 00:20:39.039
+Now let me talk a bit about LuaLaTeX,
+
+00:20:39.040 --> 00:20:41.359
+that is LaTeX with a Lua interpreter
+
+00:20:41.360 --> 00:20:44.559
+embedded inside, and two ways
+
+00:20:44.560 --> 00:20:48.839
+of generating pictures in LaTeX: TikZ,
+
+00:20:48.840 --> 00:20:54.439
+that is very famous, and Pict2e, that is not
+
+00:20:54.440 --> 00:20:57.359
+very famous and that is very low level...
+
+00:20:57.360 --> 00:21:02.359
+and I think that not many people use it.
+
+00:21:02.360 --> 00:21:04.119
+I said before that when I
+
+00:21:04.120 --> 00:21:06.919
+learned Lua I realized that it was
+
+00:21:06.920 --> 00:21:09.199
+very good for writing little
+
+00:21:09.200 --> 00:21:14.919
+languages. I was doing my PhD at the
+
+00:21:14.920 --> 00:21:19.839
+time and typesetting the diagrams for
+
+00:21:19.840 --> 00:21:24.039
+my PhD thesis was very boring, so
+
+00:21:24.040 --> 00:21:29.879
+one of the things that I did was that I
+
+00:21:29.880 --> 00:21:34.439
+created a little language for typesetting
+
+00:21:34.440 --> 00:21:36.359
+the diagrams for me. it was
+
+00:21:36.360 --> 00:21:38.879
+called Dednat because initially
+
+00:21:38.880 --> 00:21:41.039
+it only generated diagrams for
+
+00:21:41.040 --> 00:21:43.759
+Natural Deduction, and then it had
+
+00:21:43.760 --> 00:21:45.119
+several versions...
+
+00:21:45.120 --> 00:21:46.679
+these are the slides for my
+
+00:21:46.680 --> 00:21:52.159
+presentation about Dednat6... "Dednat6 is
+
+00:21:52.160 --> 00:21:56.159
+an extensible semi-preprocessor for
+
+00:21:56.160 --> 00:22:01.159
+LuaLaTeX that understands diagrams in
+
+00:22:01.160 --> 00:22:05.359
+ASCII art"... in the sense that when I have
+
+00:22:05.360 --> 00:22:11.399
+a .tex file that has this, and when
+
+00:22:11.400 --> 00:22:13.279
+Dednat6 is loaded,
+
+00:22:13.280 --> 00:22:15.039
+when I give the right commands
+
+00:22:15.040 --> 00:22:19.559
+Dednat6 interprets this block here as
+
+00:22:19.560 --> 00:22:22.559
+something that defines this
+
+00:22:22.560 --> 00:22:28.239
+diagram... oops, sorry, it interprets this
+
+00:22:28.240 --> 00:22:30.599
+diagram here, this diagram in
+
+00:22:30.600 --> 00:22:34.879
+comments here, as something that defines
+
+00:22:34.880 --> 00:22:39.759
+a diagram called foo... a deduction called
+
+00:22:39.760 --> 00:22:41.439
+foo, and it generates this code here...
+
+00:22:41.440 --> 00:22:44.239
+so that we can just invoke
+
+00:22:44.240 --> 00:22:45.519
+the definition of the
+
+00:22:45.520 --> 00:22:47.719
+deduction by typing \ded{foo}.
+
+00:22:47.720 --> 00:22:50.759
+And Dednat6 also
+
+00:22:50.760 --> 00:22:57.159
+supports another language for typesetting
+
+00:22:57.160 --> 00:22:59.639
+bidimensional diagrams with
+
+00:22:59.640 --> 00:23:05.399
+arrows and stuff for category Theory and
+
+00:23:05.400 --> 00:23:08.519
+blah blah blah... the specifications of
+
+00:23:08.520 --> 00:23:12.039
+these diagrams look like this...
+
+00:23:12.040 --> 00:23:14.559
+here is a... sorry, here is a very good
+
+00:23:14.560 --> 00:23:16.719
+example, this is a huge diagram...
+
+00:23:16.720 --> 00:23:18.599
+sorry, one second...
+
+00:23:18.600 --> 00:23:20.399
+so, the source code that generates
+
+00:23:20.400 --> 00:23:25.119
+this diagram here is just this thing at
+
+00:23:25.120 --> 00:23:32.039
+the left, so it's very visual... we can
+
+00:23:32.040 --> 00:23:35.679
+typeset the diagram in ASCII art here and
+
+00:23:35.680 --> 00:23:38.759
+then in this part here we tell how
+
+00:23:38.760 --> 00:23:41.279
+the nodes are to be joined, which
+
+00:23:41.280 --> 00:23:43.799
+arrows have to to have annotations, and
+
+00:23:43.800 --> 00:23:45.039
+so on...
+
+00:23:45.040 --> 00:23:46.799
+and this language is extensible in
+
+00:23:46.800 --> 00:23:48.679
+the sense that... uh, where's that...
+
+00:23:48.680 --> 00:23:52.559
+here: comments that start with "%:"
+
+00:23:52.560 --> 00:23:54.119
+are interpreted as
+
+00:23:54.120 --> 00:23:56.079
+definitions for tree diagrams,
+
+00:23:56.080 --> 00:23:58.559
+lines that start with "%D"
+
+00:23:58.560 --> 00:24:00.639
+define 2D diagrams with arrows and
+
+00:24:00.640 --> 00:24:04.279
+stuff, and lines that start with "%L"
+
+00:24:04.280 --> 00:24:06.759
+contain blocks of Lua code
+
+00:24:06.760 --> 00:24:09.479
+that we can use to extend the interpreter
+
+00:24:09.480 --> 00:24:10.439
+on-the-fly...
+
+00:24:10.440 --> 00:24:12.679
+anyway, here are some recent
+
+00:24:12.680 --> 00:24:15.319
+examples of diagrams that I used
+
+00:24:15.320 --> 00:24:19.839
+Dednat6 to typeset... this diagram
+
+00:24:19.840 --> 00:24:21.919
+here was generated by this
+
+00:24:21.920 --> 00:24:22.879
+specification here...
+
+00:24:22.880 --> 00:24:27.239
+and this diagram here with the
+
+00:24:27.240 --> 00:24:30.719
+curved arrows was generated by this
+
+00:24:30.720 --> 00:24:32.719
+specification here.
+
+00:24:32.720 --> 00:24:39.079
+So, Dednat6 was very easy to extend,
+
+00:24:39.080 --> 00:24:41.879
+and at some point I started to use it
+
+00:24:41.880 --> 00:24:44.679
+to generate diagrams using Pict2e -
+
+00:24:44.680 --> 00:24:47.359
+mainly for the classes that I give
+
+00:24:47.360 --> 00:24:50.079
+at the University... I teach mathematics and
+
+00:24:50.080 --> 00:24:57.239
+whatever... in a bad place. Whatever...
+
+00:24:57.240 --> 00:25:00.039
+Let me show an animation... here is a
+
+00:25:00.040 --> 00:25:02.479
+diagram that I generated with Dednat6,
+
+00:25:02.480 --> 00:25:06.319
+and it is a flip book animation, like... we
+
+00:25:06.320 --> 00:25:09.279
+type PgUp and PgDn and we go
+
+00:25:09.280 --> 00:25:11.119
+to the next page of the book and to the
+
+00:25:11.120 --> 00:25:12.439
+previous page of the book...
+
+00:25:12.440 --> 00:25:16.279
+and here is the source code that generates
+
+00:25:16.280 --> 00:25:19.159
+that. This source code is not very visual,
+
+00:25:19.160 --> 00:25:22.559
+so it's quite clumsy to edit that
+
+00:25:22.560 --> 00:25:27.519
+diagram directly in the .tex file like
+
+00:25:27.520 --> 00:25:28.079
+that...
+
+NOTE Manim
+
+00:25:28.080 --> 00:25:30.199
+These diagrams were inspired
+
+00:25:30.200 --> 00:25:33.039
+by something called my Manim, that...
+
+00:25:33.040 --> 00:25:37.559
+I forgot the name of the guy, but
+
+00:25:37.560 --> 00:25:41.479
+it's a guy that makes many videos about
+
+00:25:41.480 --> 00:25:44.839
+Mathematics, and he created this library
+
+00:25:44.840 --> 00:25:48.599
+called Manim for generating his
+
+00:25:48.600 --> 00:25:51.839
+animations, and other people adapted
+
+00:25:51.840 --> 00:25:55.919
+his library to make it more accessible...
+
+00:25:55.920 --> 00:25:59.359
+I tried to learn it, but
+
+00:25:59.360 --> 00:26:01.199
+each animation, even an animation
+
+00:26:01.200 --> 00:26:03.679
+that has very few frames... each
+
+00:26:03.680 --> 00:26:07.319
+animation took ages to render, so it
+
+00:26:07.320 --> 00:26:11.159
+wasn't fun... and animations in PDFs can
+
+00:26:11.160 --> 00:26:13.639
+be rendered in seconds. So these
+
+00:26:13.640 --> 00:26:18.679
+things were fun for me, because my laptop
+
+00:26:18.680 --> 00:26:24.359
+is very very slow, and my Manim was not fun.
+
+NOTE Generating diagrams from REPLs
+
+00:26:24.360 --> 00:26:27.359
+Anyway, writing code like this
+
+00:26:27.360 --> 00:26:32.719
+inside a .tex file was not very
+
+00:26:32.720 --> 00:26:35.519
+fun because it was hard to
+
+00:26:35.520 --> 00:26:38.719
+debug... so in 2022 I started to play
+
+00:26:38.720 --> 00:26:41.319
+with ways of generating these
+
+00:26:41.320 --> 00:26:43.839
+diagrams from REPLs, and I found a
+
+00:26:43.840 --> 00:26:47.319
+way for Pict2e and a way for TikZ...
+
+00:26:47.320 --> 00:26:50.159
+each one of these ways became a video...
+
+00:26:50.160 --> 00:26:53.679
+if you go to the list of first-class
+
+00:26:53.680 --> 00:26:57.719
+videos of eev you're going to see
+
+00:26:57.720 --> 00:26:59.919
+that there's a video about Pict2e here
+
+00:26:59.920 --> 00:27:03.399
+here and a video about TikZ...
+
+00:27:03.400 --> 00:27:05.759
+here you have some some information
+
+00:27:05.760 --> 00:27:09.839
+like length, an explanation, etc...
+
+00:27:09.840 --> 00:27:11.719
+and here are the pages for these videos.
+
+00:27:11.720 --> 00:27:15.999
+My page about the video about Pict2e
+
+00:27:16.000 --> 00:27:20.079
+looks like this, it has some diagrams...
+
+00:27:20.080 --> 00:27:23.919
+whatever... and this one is much
+
+00:27:23.920 --> 00:27:26.679
+nicer, and a lot of people
+
+00:27:26.680 --> 00:27:30.599
+watched that video... I mean, I think
+
+00:27:30.600 --> 00:27:33.719
+that 250 people watched it - for me that's
+
+00:27:33.720 --> 00:27:35.599
+a million of people...
+
+00:27:35.600 --> 00:27:39.159
+and this video is about how to
+
+00:27:39.160 --> 00:27:44.079
+extract diagrams from the manual... from
+
+00:27:44.080 --> 00:27:46.599
+the TikZ manual and how to run those
+
+00:27:46.600 --> 00:27:49.759
+examples in a REPL and modify
+
+00:27:49.760 --> 00:27:53.159
+them bit by bit... this is a a
+
+00:27:53.160 --> 00:27:57.439
+screenshot... but let me go back.
+
+00:27:57.440 --> 00:28:00.959
+At that point these things were just
+
+00:28:00.960 --> 00:28:03.239
+prototypes, the code was not very nice...
+
+00:28:03.240 --> 00:28:07.519
+and in this year I wrote... I was able
+
+00:28:07.520 --> 00:28:12.399
+to unify those two ways of generating PDFs,
+
+00:28:12.400 --> 00:28:16.039
+the one for TikZ and the one for Pict2e,
+
+00:28:16.040 --> 00:28:18.719
+and I unified them with many other
+
+00:28:18.720 --> 00:28:20.879
+things that generated diagrams.
+
+00:28:20.880 --> 00:28:24.279
+The basis of these things is
+
+00:28:24.280 --> 00:28:29.319
+something called Show2.lua... I'm not going
+
+00:28:29.320 --> 00:28:35.759
+to show its details now, but its
+
+00:28:35.760 --> 00:28:39.079
+extension that generates TikZ code
+
+00:28:39.080 --> 00:28:43.039
+is just this, so we can specify a
+
+00:28:43.040 --> 00:28:45.799
+diagram with just a block like this,
+
+00:28:45.800 --> 00:28:49.079
+and then uh if we
+
+00:28:49.080 --> 00:28:54.239
+run :show00() it returns a string
+
+00:28:54.240 --> 00:28:56.199
+that is just the body... the inner
+
+00:28:56.200 --> 00:29:00.279
+body of the .tex file, if we run this we
+
+00:29:00.280 --> 00:29:02.999
+see the whole .tex file, and if we run
+
+00:29:03.000 --> 00:29:05.119
+this we save the .tex file and we
+
+00:29:05.120 --> 00:29:08.119
+compile the .tex file to generate a PDF...
+
+00:29:08.120 --> 00:29:10.959
+and if we run this we show the PDF in
+
+00:29:10.960 --> 00:29:14.239
+the lower right window.
+
+00:29:14.240 --> 00:29:17.759
+And that's the same thing for all
+
+00:29:17.760 --> 00:29:20.199
+my recent programs that generate
+
+00:29:20.200 --> 00:29:22.439
+PDFs - they are all
+
+00:29:22.440 --> 00:29:26.199
+integrated... here is the one that...
+
+00:29:26.200 --> 00:29:29.359
+the basis for all my modules that generate
+
+00:29:29.360 --> 00:29:30.719
+diagrams with Pict2e...
+
+00:29:30.720 --> 00:29:34.879
+its demos are not very interesting,
+
+00:29:34.880 --> 00:29:36.799
+so let me show some demos of
+
+00:29:36.800 --> 00:29:39.759
+extensions that do interesting things...
+
+00:29:39.760 --> 00:29:45.319
+so, this is a diagram that I created
+
+00:29:45.320 --> 00:29:47.479
+by editing it in a REPL...
+
+00:29:47.480 --> 00:29:51.279
+I create several Pict objects here...
+
+00:29:51.280 --> 00:29:54.479
+and if I execute this it
+
+00:29:54.480 --> 00:29:59.959
+compiles an object, generates a PDF, and
+
+00:29:59.960 --> 00:30:04.759
+if I tap this... here is the PDF.
+
+00:30:04.760 --> 00:30:07.599
+And if I just ask Lua to
+
+00:30:07.600 --> 00:30:10.079
+display what is "pux", here,
+
+00:30:10.080 --> 00:30:15.719
+it shows the source code in Pict2e
+
+00:30:15.720 --> 00:30:17.999
+of the diagram... and the
+
+00:30:18.000 --> 00:30:20.959
+nice thing is that it is indented, so
+
+00:30:20.960 --> 00:30:23.599
+it's easy to debug the Pict2e code.
+
+00:30:23.600 --> 00:30:25.919
+If anyone is interested the
+
+00:30:25.920 --> 00:30:28.639
+module that does the tricks for
+
+00:30:28.640 --> 00:30:31.879
+indentation is very easy to understand...
+
+00:30:31.880 --> 00:30:35.959
+it has lots of tests and test blocks,
+
+00:30:35.960 --> 00:30:38.599
+and I think that its data
+
+00:30:38.600 --> 00:30:42.079
+structures are easy to understand.
+
+00:30:42.080 --> 00:30:44.359
+Anyway... here is another
+
+00:30:44.360 --> 00:30:51.359
+example. The :show() is
+
+00:30:51.360 --> 00:30:56.439
+here... it generates a 3D diagram.
+
+NOTE Parsers
+
+00:30:56.440 --> 00:31:06.279
+Now let me talk about parsers and
+
+00:31:06.280 --> 00:31:09.559
+REPLs in VERY strange places... I mean,
+
+00:31:09.560 --> 00:31:13.359
+using REPLs to build parsers step by step
+
+00:31:13.360 --> 00:31:17.959
+and" replacing parts by more complex
+
+00:31:17.960 --> 00:31:23.039
+parts. So, I said that Lua is very
+
+00:31:23.040 --> 00:31:28.279
+minimalistic, and everybody knows that
+
+00:31:28.280 --> 00:31:30.759
+implementations of regular expressions
+
+00:31:30.760 --> 00:31:32.479
+are big and complex..
+
+00:31:32.480 --> 00:31:34.679
+so, instead of coming with
+
+00:31:34.680 --> 00:31:37.439
+full regular expressions Lua comes with
+
+00:31:37.440 --> 00:31:39.879
+something called "patterns" and a
+
+00:31:39.880 --> 00:31:43.839
+library function called "string.match".
+
+00:31:43.840 --> 00:31:44.599
+Here is
+
+00:31:44.600 --> 00:31:50.319
+a copy of the part of the manual that
+
+00:31:50.320 --> 00:31:53.399
+explains the syntax... a part of the
+
+00:31:53.400 --> 00:31:57.159
+syntax of of patterns... here's how
+
+00:31:57.160 --> 00:31:59.279
+string.match is described in the
+
+00:31:59.280 --> 00:32:03.199
+manual - it's just this... "looks for
+
+00:32:03.200 --> 00:32:05.359
+the first match of pattern in the string
+
+00:32:05.360 --> 00:32:08.039
+as blah blah blah"... and then we have to
+
+00:32:08.040 --> 00:32:10.159
+go to the other section of the menual
+
+00:32:10.160 --> 00:32:11.479
+that explains patterns.
+
+00:32:11.480 --> 00:32:20.079
+Lua patterns are so simple,
+
+00:32:20.080 --> 00:32:23.159
+so limited, that they don't even
+
+00:32:23.160 --> 00:32:26.519
+have the the alternation operator...
+
+00:32:26.520 --> 00:32:29.759
+here is how it is described in the
+
+00:32:29.760 --> 00:32:31.599
+elisp manual -
+
+00:32:31.600 --> 00:32:36.039
+backslash-pipe specifies
+
+00:32:36.040 --> 00:32:40.359
+an alternative, blah blah blah.
+
+00:32:40.360 --> 00:32:42.879
+When we want to to build more
+
+00:32:42.880 --> 00:32:45.319
+complex... regular expressions,
+
+00:32:45.320 --> 00:32:49.199
+patterns, grammars, etc... we have to use
+
+00:32:49.200 --> 00:32:52.679
+an external library for that... no,
+
+00:32:52.680 --> 00:32:56.279
+sorry, a library that is external
+
+00:32:56.280 --> 00:32:58.239
+but that was written by one of the
+
+00:32:58.240 --> 00:33:00.879
+authors of Lua itself. This library
+
+00:33:00.880 --> 00:33:05.879
+is called Lpeg, and its manual says...
+
+00:33:05.880 --> 00:33:09.599
+"Lpeg is a new pattern matching library for
+
+00:33:09.600 --> 00:33:12.039
+Lua based on Parsing Expression Grammars
+
+00:33:12.040 --> 00:33:18.759
+(PEGs)". The manual is very terse, I
+
+00:33:18.760 --> 00:33:21.559
+found it incredibly hard to read... it
+
+00:33:21.560 --> 00:33:25.439
+doesn't have any diagrams - it has some
+
+00:33:25.440 --> 00:33:29.759
+examples, though... and the Lua Wiki
+
+00:33:29.760 --> 00:33:33.879
+has a big page called Lpeg Tutorial
+
+00:33:33.880 --> 00:33:35.359
+with lots of examples...
+
+00:33:35.360 --> 00:33:38.879
+but it it also doesn't have
+
+00:33:38.880 --> 00:33:41.199
+diagrams and I found some things
+
+00:33:41.200 --> 00:33:42.719
+incredibly hard to understand.
+
+00:33:42.720 --> 00:33:45.879
+For example, this is something that is in
+
+00:33:45.880 --> 00:33:48.879
+the the manual of Lpeg that I saw and I
+
+00:33:48.880 --> 00:33:51.639
+thought: "Wow, great! This makes all sense
+
+00:33:51.640 --> 00:33:53.159
+and is going to be very useful!"...
+
+00:33:53.160 --> 00:33:54.199
+it's a way to to build
+
+00:33:54.200 --> 00:33:57.199
+grammars that can be recursive,
+
+00:33:57.200 --> 00:34:01.359
+and they sort of can encode BNF
+
+00:34:01.360 --> 00:34:03.439
+grammars... we just have to translate the
+
+00:34:03.440 --> 00:34:06.479
+BNF a bit to get rid of some
+
+00:34:06.480 --> 00:34:08.079
+recursions and to translate them to
+
+00:34:08.080 --> 00:34:08.999
+something else.
+
+00:34:09.000 --> 00:34:11.919
+And the manual also has some things
+
+00:34:11.920 --> 00:34:15.159
+that I thought: "Oh, no! I don't have any
+
+00:34:15.160 --> 00:34:18.359
+idea of what this thing does"... and in fact
+
+00:34:18.360 --> 00:34:20.399
+I saw these things for the first
+
+00:34:20.400 --> 00:34:22.359
+time more than 10 years ago and they
+
+00:34:22.360 --> 00:34:26.079
+only started to make sense one year ago.
+
+00:34:26.080 --> 00:34:30.519
+One example is group captures.
+
+00:34:30.520 --> 00:34:36.359
+Lpeg also comes with a
+
+00:34:36.360 --> 00:34:38.719
+module called the Re module... let me
+
+00:34:38.720 --> 00:34:41.719
+pronounce as it in Portuguese - the Re
+
+00:34:41.720 --> 00:34:45.759
+module... its manual says: "The Re
+
+00:34:45.760 --> 00:34:48.199
+module (provided by the file re.lua in the
+
+00:34:48.200 --> 00:34:51.159
+distribution) supports a somewhat conventional
+
+00:34:51.160 --> 00:34:56.239
+regular expression syntax for pattern usage
+
+00:34:56.240 --> 00:34:58.679
+within lpeg"... and
+
+00:34:58.680 --> 00:35:03.519
+this is a quick reference... this
+
+00:35:03.520 --> 00:35:06.319
+thing is very brief, it has some nice
+
+00:35:06.320 --> 00:35:08.919
+examples but it's hard to understand anyway...
+
+00:35:08.920 --> 00:35:13.199
+and here are some comments about
+
+00:35:13.200 --> 00:35:17.279
+my attempts to learn Re.lua. This is
+
+00:35:17.280 --> 00:35:20.639
+a class... in this case it's a very small
+
+00:35:20.640 --> 00:35:24.839
+class... this file implements a :pm()
+
+00:35:24.840 --> 00:35:28.679
+method - I'm going to show examples of
+
+00:35:28.680 --> 00:35:32.239
+other :pm() methods very soon - so, this is
+
+00:35:32.240 --> 00:35:35.799
+a :pm() method for Re.lua that lets us
+
+00:35:35.800 --> 00:35:38.719
+compare the syntax of Lua patterns, Lpeg,
+
+00:35:38.720 --> 00:35:43.999
+and Re... let's see this example here... so,
+
+00:35:44.000 --> 00:35:47.319
+if we run this it loads my version of
+
+00:35:47.320 --> 00:35:52.799
+lpeg... no, sorry, my version of lpegrex...
+
+00:35:52.800 --> 00:35:57.119
+and it shows that when we apply
+
+00:35:57.120 --> 00:36:01.199
+the :pm() method to this Lua pattern, this
+
+00:36:01.200 --> 00:36:04.879
+lpeg pattern, and this Re pattern
+
+00:36:04.880 --> 00:36:07.999
+they all give the same results. So we can
+
+00:36:08.000 --> 00:36:10.799
+use this thing... this kind of thing here
+
+00:36:10.800 --> 00:36:14.119
+to show how to translate from Lua
+
+00:36:14.120 --> 00:36:16.519
+patterns, that are familiar because
+
+00:36:16.520 --> 00:36:18.519
+they're similar to regular expressions,
+
+00:36:18.520 --> 00:36:20.199
+only weaker...
+
+00:36:20.200 --> 00:36:24.799
+to lpeg, that is super weird
+
+00:36:24.800 --> 00:36:27.759
+and to Re, that is not so weird.
+
+00:36:27.760 --> 00:36:35.159
+Anyway, the comment says that in 2012
+
+00:36:35.160 --> 00:36:37.519
+I had a project that needed a
+
+00:36:37.520 --> 00:36:40.479
+precedence passer that could parse
+
+00:36:40.480 --> 00:36:43.239
+arithmetical expressions with the right
+
+00:36:43.240 --> 00:36:46.639
+precedences... and at that point I was
+
+00:36:46.640 --> 00:36:49.919
+still struggling with pure lpeg, and I
+
+00:36:49.920 --> 00:36:52.359
+couldn't do much with it, so I tried to
+
+00:36:52.360 --> 00:36:55.519
+learn Re.lua instead, and I wrote this old
+
+00:36:55.520 --> 00:36:56.319
+class here...
+
+00:36:56.320 --> 00:37:01.039
+that allowed me to use a preprocessor
+
+00:37:01.040 --> 00:37:03.279
+on patterns for Lua. And the thing is that
+
+00:37:03.280 --> 00:37:04.879
+with this preprocessor I could
+
+00:37:04.880 --> 00:37:07.839
+specify precedence grammars using this
+
+00:37:07.840 --> 00:37:11.879
+thing here, that worked, but was super
+
+00:37:11.880 --> 00:37:15.999
+clumsy... and I gave up after a few attempts.
+
+00:37:16.000 --> 00:37:21.879
+and in 2022 I heard about something
+
+00:37:21.880 --> 00:37:23.239
+called lpegrex,
+
+00:37:23.240 --> 00:37:29.799
+that was a... a kind of extension or Re,
+
+00:37:29.800 --> 00:37:32.879
+and it was much more powerful than re.lua,
+
+00:37:32.880 --> 00:37:34.919
+but after a while I realized that it
+
+00:37:34.920 --> 00:37:37.639
+had the same defects as re.lua...
+
+00:37:37.640 --> 00:37:40.839
+and let me explain that, because
+
+00:37:40.840 --> 00:37:44.439
+it has all to do with the things about
+
+00:37:44.440 --> 00:37:48.039
+black boxes and magic that I told in the
+
+00:37:48.040 --> 00:37:52.919
+beginning. Both... I mean, sorry, neither
+
+00:37:52.920 --> 00:37:57.199
+re.lua or lpegrex had some features that
+
+00:37:57.200 --> 00:38:00.799
+I needed... they didn't let us explore...
+
+00:38:00.800 --> 00:38:03.679
+sorry, they received a pattern that was
+
+00:38:03.680 --> 00:38:06.839
+specified as a string, and it converted
+
+00:38:06.840 --> 00:38:09.679
+that into an lpeg pattern, but it didn't
+
+00:38:09.680 --> 00:38:12.559
+let us explore the the lpeg patterns
+
+00:38:12.560 --> 00:38:15.159
+that it generated...
+
+00:38:15.160 --> 00:38:18.759
+their code was written in a way
+
+00:38:18.760 --> 00:38:21.319
+that was REPL-unfriendly - I
+
+00:38:21.320 --> 00:38:24.279
+couldn't modify parts of the code
+
+00:38:24.280 --> 00:38:28.399
+bit by bit in a REPL and try to change
+
+00:38:28.400 --> 00:38:31.719
+the code without changing the
+
+00:38:31.720 --> 00:38:34.199
+original file... the code was very
+
+00:38:34.200 --> 00:38:36.839
+hard to explore, to hack, and to extend -
+
+00:38:36.840 --> 00:38:39.159
+in my opinion... the documentation was not
+
+00:38:39.160 --> 00:38:43.319
+very clear... and I sent one or two messages
+
+00:38:43.320 --> 00:38:47.159
+to the the developer of lpegrex and...
+
+00:38:47.160 --> 00:38:50.759
+he was too busy to help me. He
+
+00:38:50.760 --> 00:38:53.959
+answered it very briefly, and, uh, to be
+
+00:38:53.960 --> 00:38:56.599
+honest I felt... rejected. I felt that I
+
+00:38:56.600 --> 00:38:58.679
+wasn't doing anything interesting...
+
+00:38:58.680 --> 00:39:03.399
+whatever, whatever...
+
+00:39:03.400 --> 00:39:09.239
+So, in 2022 I was trying to learn lpegrex
+
+00:39:09.240 --> 00:39:11.559
+because I was thinking that it would
+
+00:39:11.560 --> 00:39:13.719
+solve my problems - but it didn't...
+
+00:39:13.720 --> 00:39:16.479
+it didn't have the features that I needed,
+
+00:39:16.480 --> 00:39:20.919
+it was hard to extend, hard to explore,
+
+00:39:20.920 --> 00:39:23.279
+and hard to debug, and I
+
+00:39:23.280 --> 00:39:25.039
+decided to rewrite it in a more
+
+00:39:25.040 --> 00:39:30.639
+hacker-friendly way - in the sense that...
+
+00:39:30.640 --> 00:39:33.759
+was modular, and I could replace any
+
+00:39:33.760 --> 00:39:35.399
+part of the module from a REPL...
+
+NOTE ELpeg1.lua
+
+00:39:35.400 --> 00:39:43.679
+My version of it was called ELpeg1.lua...
+
+00:39:43.680 --> 00:39:47.679
+and I decided that in my version I
+
+00:39:47.680 --> 00:39:49.639
+wouldn't have the part that
+
+00:39:49.640 --> 00:39:54.879
+receives a grammar specified as a string
+
+00:39:54.880 --> 00:39:57.519
+and converts that to lpeg... I would
+
+00:39:57.520 --> 00:40:00.959
+just have the backend part, that are the
+
+00:40:00.960 --> 00:40:03.999
+functions in lpeg that let us specify
+
+00:40:04.000 --> 00:40:05.479
+powerful grammars.
+
+00:40:05.480 --> 00:40:11.759
+Let me go back. Let me explain a
+
+00:40:11.760 --> 00:40:15.519
+bit about lpeg... Lua has
+
+00:40:15.520 --> 00:40:21.599
+coercions: the + expects to receive
+
+00:40:21.600 --> 00:40:23.999
+true numbers, and if one of its arguments,
+
+00:40:24.000 --> 00:40:26.999
+or both of them, are strings, it converts
+
+00:40:27.000 --> 00:40:29.839
+the string... the strings to numbers so in
+
+00:40:29.840 --> 00:40:33.519
+this case here, 2+"3",
+
+00:40:33.520 --> 00:40:36.159
+it returns the number 5,
+
+00:40:36.160 --> 00:40:39.359
+and this is the concatenation
+
+00:40:39.360 --> 00:40:42.119
+operator... it expects to receive
+
+00:40:42.120 --> 00:40:44.999
+strings, so in this case it will
+
+00:40:45.000 --> 00:40:47.359
+convert the number 2 to the string "2",
+
+00:40:47.360 --> 00:40:50.279
+and the concatenation of thes two
+
+00:40:50.280 --> 00:40:54.479
+things will be 23... oops, sorry, "23"
+
+00:40:54.480 --> 00:40:56.279
+as a string.
+
+00:40:56.280 --> 00:40:58.519
+Lpeg also has some coercions.
+
+00:40:58.520 --> 00:41:01.759
+I usually set these
+
+00:41:01.760 --> 00:41:05.799
+globals to let me write my grammars
+
+00:41:05.800 --> 00:41:09.719
+in a very compact way, so instead
+
+00:41:09.720 --> 00:41:14.759
+of lpeg.B, lpeg.C, etc I use these globals,
+
+00:41:14.760 --> 00:41:18.359
+like uppercase B, uppercase C, and so on...
+
+00:41:18.360 --> 00:41:21.679
+and with these globals I can write
+
+00:41:21.680 --> 00:41:26.759
+things like this: C(1)*"_"...
+
+00:41:26.760 --> 00:41:33.199
+and lpeg knows that lpeg.C...
+
+00:41:33.200 --> 00:41:38.879
+it sort of expands this to lpeg.C,
+
+00:41:38.880 --> 00:41:42.039
+but lpeg.C expects to receive
+
+00:41:42.040 --> 00:41:44.839
+an lpeg pattern, and 1 is not yet an
+
+00:41:44.840 --> 00:41:47.879
+lpeg pattern, so it is coerced into an
+
+00:41:47.880 --> 00:41:51.799
+lpeg pattern by calling lpeg.P,
+
+00:41:51.800 --> 00:41:55.679
+so this short thing here becomes
+
+00:41:55.680 --> 00:42:03.399
+equivalent to lpeg.C(lpeg.P(1)), and the
+
+00:42:03.400 --> 00:42:07.399
+multiplication, when at least one of its
+
+00:42:07.400 --> 00:42:10.759
+arguments is an lpeg pattern... it expects
+
+00:42:10.760 --> 00:42:13.199
+to receive two lpeg patterns, and in
+
+00:42:13.200 --> 00:42:15.239
+this case the one at the right is
+
+00:42:15.240 --> 00:42:18.319
+just a string, so it is coerced to an lpeg
+
+00:42:18.320 --> 00:42:20.079
+pattern by using lpeg.P.
+
+00:42:20.080 --> 00:42:25.599
+With this idea we can sort of
+
+00:42:25.600 --> 00:42:28.439
+understand the comparison here. I mean,
+
+00:42:28.440 --> 00:42:31.719
+let me run it again... this first part is
+
+00:42:31.720 --> 00:42:34.679
+very similar to a regular expression
+
+00:42:34.680 --> 00:42:35.359
+here at the left...
+
+00:42:35.360 --> 00:42:39.759
+and when we apply this... Lua pattern
+
+00:42:39.760 --> 00:42:43.639
+to this subject here the result
+
+00:42:43.640 --> 00:42:47.799
+is this thing here, this thing, this
+
+00:42:47.800 --> 00:42:54.319
+thing and this thing... I'm going to
+
+00:42:54.320 --> 00:42:56.119
+call each one of these results
+
+00:42:56.120 --> 00:42:59.519
+"captures", so each of these things
+
+00:42:59.520 --> 00:43:03.319
+between parentheses "captures" a substring
+
+00:43:03.320 --> 00:43:06.039
+of the original string and these
+
+00:43:06.040 --> 00:43:08.559
+captured substrings are returned in a
+
+00:43:08.560 --> 00:43:11.839
+certain order. Here is how to express the
+
+00:43:11.840 --> 00:43:12.759
+same thing in lpeg...
+
+00:43:12.760 --> 00:43:15.919
+it's very cryptic but it's a
+
+00:43:15.920 --> 00:43:20.719
+good way to understand the some basic
+
+00:43:20.720 --> 00:43:23.879
+operators of lpeg, I mean we can look at
+
+00:43:23.880 --> 00:43:26.479
+the manual and understand and
+
+00:43:26.480 --> 00:43:30.519
+what C, S and R do, and also
+
+00:43:30.520 --> 00:43:37.959
+exponentiation... and this strange thing
+
+00:43:37.960 --> 00:43:41.319
+here receives this string here, runs
+
+00:43:41.320 --> 00:43:43.279
+a function that I have defined, that
+
+00:43:43.280 --> 00:43:46.039
+converts it to an object of a certain
+
+00:43:46.040 --> 00:43:47.759
+class, and that class
+
+00:43:47.760 --> 00:43:52.399
+represents Re patterns, so this thing
+
+00:43:52.400 --> 00:43:54.479
+is treated as a pattern for re.lua,
+
+00:43:54.480 --> 00:43:56.479
+and it is matched against the string,
+
+00:43:56.480 --> 00:43:59.439
+and it returns the same thing as the
+
+00:43:59.440 --> 00:44:02.559
+other one.
+
+00:44:02.560 --> 00:44:05.519
+Also, this thing here also has a
+
+00:44:05.520 --> 00:44:08.479
+comparison with lpegrex, but these
+
+00:44:08.480 --> 00:44:11.559
+patterns are very trivial, they
+
+00:44:11.560 --> 00:44:13.359
+don't do anything very strange...
+
+00:44:13.360 --> 00:44:15.759
+so let's go back and see what
+
+00:44:15.760 --> 00:44:18.239
+kinds of very strange things there are.
+
+00:44:18.240 --> 00:44:26.559
+Here is the page of lpegrex at github,
+
+00:44:26.560 --> 00:44:29.719
+here's the documentation...
+
+00:44:29.720 --> 00:44:32.439
+it's relatively brief,
+
+00:44:32.440 --> 00:44:35.239
+it explains lpegrex as being an
+
+00:44:35.240 --> 00:44:39.719
+extension of Re.lua, so it explains
+
+00:44:39.720 --> 00:44:42.879
+mainly the additional features... here is a
+
+00:44:42.880 --> 00:44:45.119
+quick reference that explains only the
+
+00:44:45.120 --> 00:44:46.359
+additional features...
+
+00:44:46.360 --> 00:44:49.639
+some of the these things
+
+00:44:49.640 --> 00:44:50.919
+I was able to understand
+
+00:44:50.920 --> 00:44:57.559
+by struggling a lot, and some I wasn't
+
+00:44:57.560 --> 00:45:02.439
+able to even by spending several evenings
+
+00:45:02.440 --> 00:45:04.319
+try to to build examples...
+
+00:45:04.320 --> 00:45:12.879
+and this is something very nice. Lpegrex
+
+00:45:12.880 --> 00:45:15.879
+comes with some example parsers... and
+
+00:45:15.880 --> 00:45:18.679
+here is a parser that parses the Lua
+
+00:45:18.680 --> 00:45:22.479
+grammar - I mean, this is the the grammar
+
+00:45:22.480 --> 00:45:25.959
+for Lua 5.4 at the end of the
+
+00:45:25.960 --> 00:45:31.199
+reference manual... it's just this... this
+
+00:45:31.200 --> 00:45:34.799
+is in a kind of BNF, and this is the BNF
+
+00:45:34.800 --> 00:45:35.599
+translated
+
+00:45:35.600 --> 00:45:39.919
+to the language of lpegrex, so this
+
+00:45:39.920 --> 00:45:43.039
+thing uses many constructions that are
+
+00:45:43.040 --> 00:45:47.999
+in re.lua and some extra constructions that
+
+00:45:48.000 --> 00:45:50.959
+are described here... and with these
+
+00:45:50.960 --> 00:45:54.239
+examples I was able to to understand
+
+00:45:54.240 --> 00:45:55.159
+some of the...
+
+00:45:55.160 --> 00:45:58.079
+of these things here that are
+
+00:45:58.080 --> 00:46:00.239
+described here in the quick
+
+00:46:00.240 --> 00:46:04.719
+reference - but not all.
+
+00:46:04.720 --> 00:46:11.279
+So, I wasn't able to use lpegrex
+
+00:46:11.280 --> 00:46:14.279
+by itself, because some things didn't
+
+00:46:14.280 --> 00:46:16.199
+make much sense, and I decided to
+
+00:46:16.200 --> 00:46:18.759
+reimplement it in my own style,
+
+00:46:18.760 --> 00:46:23.679
+because that would be a way to map...
+
+00:46:23.680 --> 00:46:26.839
+to at the very least map what I had
+
+00:46:26.840 --> 00:46:29.559
+understood and what I didn't, learn
+
+00:46:29.560 --> 00:46:32.999
+one feature at a time, do comparisons, and
+
+00:46:33.000 --> 00:46:35.319
+so on.
+
+00:46:35.320 --> 00:46:38.799
+Here I pointed to two features of lpeg...
+
+00:46:38.800 --> 00:46:41.679
+in one I said "Oh, great! This thing can
+
+00:46:41.680 --> 00:46:44.319
+be used to to define grammars, even
+
+00:46:44.320 --> 00:46:45.959
+recursive grammars", and so on...
+
+00:46:45.960 --> 00:46:49.759
+and this is an "Oh, no!" feature - one
+
+00:46:49.760 --> 00:46:51.759
+thing that didn't make any sense at all...
+
+00:46:51.760 --> 00:46:56.439
+group captures. One thing that I did to
+
+00:46:56.440 --> 00:46:59.039
+understand group captures was to
+
+00:46:59.040 --> 00:47:02.319
+represent them as diagrams. Of course in
+
+00:47:02.320 --> 00:47:05.359
+the beginning I was drawing these
+
+00:47:05.360 --> 00:47:08.919
+diagrams by hand, but then I realized
+
+00:47:08.920 --> 00:47:11.559
+that I could use the bits of lpeg
+
+00:47:11.560 --> 00:47:14.759
+that I already knew to build a grammar
+
+00:47:14.760 --> 00:47:17.479
+that would parse a little language and
+
+00:47:17.480 --> 00:47:20.999
+generate these diagrams in LaTeX, and I was
+
+00:47:21.000 --> 00:47:21.919
+able to make this.
+
+00:47:21.920 --> 00:47:25.279
+In this diagram here
+
+00:47:25.280 --> 00:47:30.719
+this thing above the arrow is Lua code...
+
+00:47:30.720 --> 00:47:33.759
+a piece of Lua code that
+
+00:47:33.760 --> 00:47:37.119
+specifies an lpeg pattern... this
+
+00:47:37.120 --> 00:47:39.559
+thing here at the top is the string that
+
+00:47:39.560 --> 00:47:43.039
+is being matched, and the things below
+
+00:47:43.040 --> 00:47:46.599
+the underbraces are the captures that
+
+00:47:46.600 --> 00:47:50.639
+each thing... sorry, that each thing
+
+00:47:50.640 --> 00:47:51.319
+captures.
+
+00:47:51.320 --> 00:47:58.479
+For example, this underbrace here
+
+00:47:58.480 --> 00:48:00.279
+corresponds to this pattern here,
+
+00:48:00.280 --> 00:48:02.879
+that parses a single character but
+
+00:48:02.880 --> 00:48:05.559
+doesn't return any captures, this thing
+
+00:48:05.560 --> 00:48:08.119
+here parses a single "b" and doesn't
+
+00:48:08.120 --> 00:48:11.239
+return any captures, this thing here
+
+00:48:11.240 --> 00:48:14.399
+parses a single character and captures
+
+00:48:14.400 --> 00:48:16.879
+it, and this thing here parses the
+
+00:48:16.880 --> 00:48:21.319
+character "d" and captures it... and this
+
+00:48:21.320 --> 00:48:24.439
+other thing here transforms this
+
+00:48:24.440 --> 00:48:27.279
+pattern into another pattern...
+
+00:48:27.280 --> 00:48:33.119
+returns first a capture with all
+
+00:48:33.120 --> 00:48:35.079
+the string that was parsed by this
+
+00:48:35.080 --> 00:48:37.399
+pattern here, and then all the captures
+
+00:48:37.400 --> 00:48:41.079
+returned by this thing here before
+
+00:48:41.080 --> 00:48:42.959
+the ":".
+
+00:48:42.960 --> 00:48:45.479
+So, this was a way to build
+
+00:48:45.480 --> 00:48:48.599
+concrete examples for things that the
+
+00:48:48.600 --> 00:48:52.159
+lpag manual was explaining in a very terse
+
+00:48:52.160 --> 00:48:55.799
+way, and it worked for me - some things
+
+00:48:55.800 --> 00:48:56.999
+that were very
+
+00:48:57.000 --> 00:48:59.839
+mysterious started to make sense, and I
+
+00:48:59.840 --> 00:49:03.199
+started to have intelligent questions
+
+00:49:03.200 --> 00:49:06.079
+to ask in the mailing list.
+
+00:49:06.080 --> 00:49:10.959
+And with that I was able to
+
+00:49:10.960 --> 00:49:12.959
+understand what are group captures,
+
+00:49:12.960 --> 00:49:17.879
+and group captures that receive a name...
+
+00:49:17.880 --> 00:49:22.719
+Well, let me explain what this does.
+
+00:49:22.720 --> 00:49:27.119
+This thing here captures... sorry, parses
+
+00:49:27.120 --> 00:49:29.359
+the empty string and returns this as a
+
+00:49:29.360 --> 00:49:32.959
+constant... so, this is something that
+
+00:49:32.960 --> 00:49:35.799
+doesn't exist in regular expressions...
+
+00:49:35.800 --> 00:49:38.639
+it parses nothing and
+
+00:49:38.640 --> 00:49:41.839
+returns this as a capture... then this
+
+00:49:41.840 --> 00:49:44.599
+thing here returns these two
+
+00:49:44.600 --> 00:49:47.159
+constants here, and parses the empty
+
+00:49:47.160 --> 00:49:51.279
+string, and this thing here converts
+
+00:49:51.280 --> 00:49:54.159
+the results of this thing here into a
+
+00:49:54.160 --> 00:49:57.639
+group capture, and stores it in the label
+
+00:49:57.640 --> 00:50:03.279
+"d"... and then here's another constant
+
+00:50:03.280 --> 00:50:03.719
+capture.
+
+NOTE Building lists
+
+00:50:03.720 --> 00:50:05.679
+And I realized that these things
+
+00:50:05.680 --> 00:50:08.599
+here were similar to how Lua
+
+00:50:08.600 --> 00:50:09.839
+specifies building lists...
+
+00:50:09.840 --> 00:50:16.239
+when we build... sorry, tables. When
+
+00:50:16.240 --> 00:50:18.759
+we build a table, and we say that the
+
+00:50:18.760 --> 00:50:21.879
+first element of the table is here, this
+
+00:50:21.880 --> 00:50:23.559
+element is put at the end of the table...
+
+00:50:23.560 --> 00:50:29.399
+when after the that would say d=42...
+
+00:50:29.400 --> 00:50:31.199
+we are putting the 42
+
+00:50:31.200 --> 00:50:34.559
+in the the slot whose key is "d".
+
+00:50:34.560 --> 00:50:38.999
+This was happening with lpeg captures,
+
+00:50:39.000 --> 00:50:43.359
+but there was something very strange...
+
+00:50:43.360 --> 00:50:46.199
+these group captures could hold
+
+00:50:46.200 --> 00:50:49.199
+more than one capture - more than one
+
+00:50:49.200 --> 00:50:51.759
+value... so there was something between
+
+00:50:51.760 --> 00:50:58.039
+lists and tables. I started to use this
+
+00:50:58.040 --> 00:51:00.479
+notation to...
+
+00:51:00.480 --> 00:51:04.959
+explain in my notation what they
+
+00:51:04.960 --> 00:51:08.159
+were doing... many things started
+
+00:51:08.160 --> 00:51:10.239
+to make sense, many mysterious
+
+00:51:10.240 --> 00:51:12.879
+sentences in the manual started to
+
+00:51:12.880 --> 00:51:14.439
+make sense... but some didn't...
+
+00:51:14.440 --> 00:51:19.679
+but at least I was able to send
+
+00:51:19.680 --> 00:51:22.319
+some intelligent questions to the
+
+00:51:22.320 --> 00:51:25.199
+mailing lis,t and the author of Lua and
+
+00:51:25.200 --> 00:51:27.359
+lpeg answered some of them...
+
+00:51:27.360 --> 00:51:31.519
+he was not very happy about my
+
+00:51:31.520 --> 00:51:34.959
+questions - he... told me that those
+
+00:51:34.960 --> 00:51:37.679
+diagrams were a waste of time, the
+
+00:51:37.680 --> 00:51:40.559
+manual was perfectly clear, and so on...
+
+00:51:40.560 --> 00:51:44.919
+whatever - but I was able to...
+
+00:51:44.920 --> 00:51:48.879
+so, it was weird, but I was able to
+
+00:51:48.880 --> 00:51:51.799
+understand lots of things from his
+
+00:51:51.800 --> 00:51:56.519
+answers. This is a copy of one of
+
+00:51:56.520 --> 00:51:58.239
+my messages, then there's another one,
+
+00:51:58.240 --> 00:52:01.239
+another one, some of them had diagrams...
+
+00:52:01.240 --> 00:52:04.359
+then he complained about these diagrams,
+
+00:52:04.360 --> 00:52:08.439
+he said that these things here, that look
+
+00:52:08.440 --> 00:52:11.119
+like table constructors, "do not exist"...
+
+00:52:11.120 --> 00:52:17.199
+whatever... anyway, once I understood
+
+00:52:17.200 --> 00:52:20.679
+group captures many features
+
+00:52:20.680 --> 00:52:23.359
+were very easy to understand
+
+00:52:23.360 --> 00:52:26.039
+and I started to be able to use lpeg to
+
+00:52:26.040 --> 00:52:28.159
+to build some very interesting things...
+
+00:52:28.160 --> 00:52:33.039
+I was able to reproduce some
+
+00:52:33.040 --> 00:52:36.359
+of the features that I saw in lpegrex -
+
+00:52:36.360 --> 00:52:41.079
+remember that this... where is that?
+
+00:52:41.080 --> 00:52:46.119
+this is the syntax of Lua... here -
+
+00:52:46.120 --> 00:52:48.959
+I was able to understand
+
+00:52:48.960 --> 00:52:52.479
+how these things here were translated to
+
+00:52:52.480 --> 00:52:55.359
+lpeg code... to lpeg patterns
+
+00:52:55.360 --> 00:52:58.239
+by using group captures in a certain
+
+00:52:58.240 --> 00:53:03.039
+way... I was able to implement them
+
+00:53:03.040 --> 00:53:04.759
+in ELpeg1.lua...
+
+00:53:04.760 --> 00:53:08.719
+and after some time I was able to use
+
+00:53:08.720 --> 00:53:12.879
+ELpeg1.lua to build grammars that
+
+00:53:12.880 --> 00:53:14.159
+were able to parse
+
+00:53:14.160 --> 00:53:18.679
+arithmetical expressions with the
+
+00:53:18.680 --> 00:53:20.959
+right precedence... and here's an example
+
+00:53:20.960 --> 00:53:23.319
+in which I built the grammar step by step...
+
+00:53:23.320 --> 00:53:29.239
+and I test the current grammar, and I
+
+00:53:29.240 --> 00:53:35.079
+replace a bit, and then I test the new
+
+00:53:35.080 --> 00:53:36.599
+grammar and so on...
+
+00:53:36.600 --> 00:53:39.079
+and you can see that the result is
+
+00:53:39.080 --> 00:53:43.359
+always a tree that is drawn in a
+
+00:53:43.360 --> 00:53:44.239
+nice two dimensional way...
+
+00:53:44.240 --> 00:53:48.919
+At this point these powers here
+
+00:53:48.920 --> 00:53:50.559
+are returned as a list,
+
+00:53:50.560 --> 00:53:53.119
+as an operation "pow"
+
+00:53:53.120 --> 00:53:57.559
+with several arguments, here... and then
+
+00:53:57.560 --> 00:54:00.519
+I apply a kind of parsing combinator,
+
+00:54:00.520 --> 00:54:03.719
+here... that transforms these trees into
+
+00:54:03.720 --> 00:54:08.199
+other trees and with these combinators
+
+00:54:08.200 --> 00:54:12.199
+here I can specify that the "^" is
+
+00:54:12.200 --> 00:54:14.639
+associative in a certain direction...
+
+00:54:14.640 --> 00:54:17.519
+that the "/" is associative in
+
+00:54:17.520 --> 00:54:20.119
+another direction... the "-" uses
+
+00:54:20.120 --> 00:54:23.079
+the same direction as a the "/",
+
+00:54:23.080 --> 00:54:26.079
+and so on... and they have the
+
+00:54:26.080 --> 00:54:29.679
+right precedences.
+
+00:54:29.680 --> 00:54:34.559
+So, here are the tests...
+
+00:54:34.560 --> 00:54:38.119
+here is my file ELpeg1.lua... it has
+
+00:54:38.120 --> 00:54:41.719
+several classes, each class has tests
+
+00:54:41.720 --> 00:54:42.279
+after it...
+
+00:54:42.280 --> 00:54:46.239
+I was able to implement something
+
+00:54:46.240 --> 00:54:50.519
+that lpegrex has, that is called
+
+00:54:50.520 --> 00:54:53.519
+"keywords", that is very useful for parsing
+
+00:54:53.520 --> 00:54:56.479
+programs in programming languages...
+
+00:54:56.480 --> 00:54:59.439
+I was able to implement something
+
+00:54:59.440 --> 00:55:02.639
+similar to the debugger... to the
+
+00:55:02.640 --> 00:55:07.999
+lpeg debugger lpeg uses... I was
+
+00:55:08.000 --> 00:55:11.399
+frustrated by some limitations of
+
+00:55:11.400 --> 00:55:16.839
+the lpeg debugger, and I implemented
+
+00:55:16.840 --> 00:55:23.439
+my own that is, uh... much better!...
+
+00:55:23.440 --> 00:55:24.759
+Let me show something else... I was
+
+00:55:24.760 --> 00:55:27.119
+able to translate a good part of the
+
+00:55:27.120 --> 00:55:33.039
+Lua parser, here, to ELpeg1.lua... I haven't
+
+00:55:33.040 --> 00:55:38.399
+finished yet, but I have most of the
+
+00:55:38.400 --> 00:55:39.719
+the translation here...
+
+00:55:39.720 --> 00:55:47.279
+and after having all that I was able to
+
+00:55:47.280 --> 00:55:50.319
+build other grammars very quickly...
+
+00:55:50.320 --> 00:55:55.239
+writing new parsers finally became fun.
+
+00:55:55.240 --> 00:55:58.719
+And here's one example that I showed in the
+
+00:55:58.720 --> 00:56:00.639
+beginning.
+
+00:56:00.640 --> 00:56:05.799
+If I remember correctly...
+
+00:56:05.800 --> 00:56:10.639
+I took a figure from the Wikipedia...
+
+00:56:10.640 --> 00:56:12.439
+I don't have its link now...
+
+00:56:12.440 --> 00:56:17.079
+but I specified a grammar that parses
+
+00:56:17.080 --> 00:56:20.119
+exactly the example that appears
+
+00:56:20.120 --> 00:56:20.839
+in the Wikipedia...
+
+00:56:20.840 --> 00:56:24.679
+so, with my grammar, considering that
+
+00:56:24.680 --> 00:56:28.719
+the top level entry is "Stmt", when I
+
+00:56:28.720 --> 00:56:30.679
+parse this string here
+
+00:56:30.680 --> 00:56:36.599
+the result is this tree...
+
+00:56:36.600 --> 00:56:41.119
+and I can do some operations on that,
+
+00:56:41.120 --> 00:56:44.039
+I can define how this thing is to be
+
+00:56:44.040 --> 00:56:45.639
+converted into LaTeX,
+
+00:56:45.640 --> 00:56:49.399
+I can define other operations
+
+00:56:49.400 --> 00:56:52.999
+that convert trees into other trees, and
+
+00:56:53.000 --> 00:56:54.879
+here are some tests of these operations...
+
+00:56:54.880 --> 00:57:00.359
+This is what I showed in the beginning...
+
+00:57:00.360 --> 00:57:02.759
+I'm not going to explain all the details
+
+00:57:02.760 --> 00:57:03.999
+of this thing now...
+
+00:57:04.000 --> 00:57:09.199
+this :show() converts this thing
+
+00:57:09.200 --> 00:57:11.919
+into LaTeX in the way specified by these
+
+00:57:11.920 --> 00:57:16.159
+instructions here, that says that...
+
+00:57:16.160 --> 00:57:25.239
+well, whatever...
+
+00:57:25.240 --> 00:57:32.959
+and here's the result - the LaTeXed result...
+
+00:57:32.960 --> 00:57:41.759
+and these diagrams here are generated by
+
+00:57:41.760 --> 00:57:46.719
+this file here, that defines a simple
+
+00:57:46.720 --> 00:57:48.479
+grammar that parses this thing here,
+
+00:57:48.480 --> 00:57:51.999
+and then LaTeXes it in a certain way, and
+
+00:57:52.000 --> 00:57:56.399
+and also tests to check if this code here...
+
+00:57:56.400 --> 00:58:01.999
+this Lua code that generates an lpeg grammar...
+
+00:58:02.000 --> 00:58:05.799
+parses this subject here and
+
+00:58:05.800 --> 00:58:08.599
+returns the expected result...
+
+00:58:08.600 --> 00:58:12.239
+So: this is the code that I
+
+00:58:12.240 --> 00:58:16.719
+wanted to show. I wanted to show many
+
+00:58:16.720 --> 00:58:19.919
+more things but I wasn't able to prepare
+
+00:58:19.920 --> 00:58:23.919
+them before the conference... and I hope
+
+00:58:23.920 --> 00:58:27.519
+that soon - for some value of "soon" -
+
+00:58:27.520 --> 00:58:30.399
+I'll be able to create REPL-based
+
+00:58:30.400 --> 00:58:33.919
+tutorials for lpeg, Re, and ELpeg1.lua...
+
+00:58:33.920 --> 00:58:36.319
+where lpeg is something very famous,
+
+00:58:36.320 --> 00:58:39.199
+Re is a module of lpeg...
+
+00:58:39.200 --> 00:58:42.399
+I could also do something like this
+
+00:58:42.400 --> 00:58:47.799
+for lpegrex... and ELpeg1.lua is
+
+00:58:47.800 --> 00:58:51.159
+the thing that I wrote, the one that
+
+00:58:51.160 --> 00:58:56.799
+has test in comments, and the tests
+
+00:58:56.800 --> 00:58:59.519
+usually generate trees, and sometimes
+
+00:58:59.520 --> 00:59:00.879
+they generate TeX code.
+
+00:59:00.880 --> 00:59:04.959
+Yeah, so that's it! I wanted to
+
+00:59:04.960 --> 00:59:07.159
+present much more but I wasn't able to
+
+00:59:07.160 --> 00:59:10.480
+prepare it... so: sorry, thanks, bye! =)