Quick
index
main
eev
eepitch
maths
angg
blogme
dednat6
littlelangs
PURO
(C2,C3,C4,
 λ,ES,
 GA,MD,
 Caepro,
 textos,
 Chapa 1)

emacs
lua
(la)tex
maxima
git
agda
forth
squeak
icon
tcl
tikz
fvwm
debian
irc
contact

REPLs in strange places: updates, a demo, and how to try it - subtitles

The main page about this video is here.
Its subtitles in Lua are here.
The rest of this page contains a conversion of the subtitles in Lua
to a slightly more readable format.


00:00 Hi! My name is Eduardo Ochs, I'm the author of
00:03 an Emacs package called eev, and a few weeks
00:06 ago I gave a very bad presentation at
00:09 the EmacsConf 2023 about an application of eev.

00:12 The title of my presentation was: REPLs
00:16 in strange places: Lua, LaTeX, Lpeg, LPegRex,
00:19 and TikZ, and the idea is that the
00:23 presentation should have a way to let
00:26 people try what I was showing, because
00:30 the central idea of eev is that
00:32 everything should be easy to try...
00:35 well, let me explain that in a better way.

00:41 Let me start with a
00:44 question: why should people learn eev?
00:48 Most people say that it looks like a
00:50 kind of Org mode, but uglier and less
00:54 powerful, and let's look at these ideas here.

00:58 Scripts made with
01:02 Org mode and code blocks look
01:05 very professional - they can be
01:08 exported to HTML and PDF easily, you can
01:10 show to other people what you're doing,
01:12 you can make blog posts... all the
01:16 fortification happens in the right
01:19 way, you have colors and so on...

01:21 and scripts made with eev - and eepitch,
01:25 which is one of the best starting points
01:28 for eev, they look very barebones...
01:31 they have some ideas that are
01:35 the opposite of "this must look
01:38 professional", and they have some strange
01:40 influences in their aesthetics... for
01:42 example, they are influenced by ideas by
01:45 the ideas of Peter Brook -
01:48 about rough theater, about using
01:53 the least scenery possible, and so on...
01:56 whatever. So people have very good
02:00 reasons for spending 10 years trying to
02:02 learn Org, and they have very good
02:04 reasons for spending just a few minutes
02:06 trying to learn eev... but the
02:09 tutorials of eev are full of "try it"s,
02:12 and one of the filters of eev is that
02:15 some people who try the "try it"s like eev,
02:18 but some people refuse to try the "try it"s -
02:21 they just want to see explanations
02:24 and a professional description of what
02:26 this can do for them, how this can
02:29 solve their problems, how this can
02:31 earn them money and so on... and they
02:34 don't find that, they refuse to try
02:37 the "try it"s, and they hate eev.

02:42 Anyway, what I want to show in this short
02:44 video is the "try it"s for my presentation
02:48 on REPLs in strange places. These "try it"s
02:51 only became ready several weeks after the
02:53 presentation... and now I'm going to show
02:56 rather quickly how to run them.

03:02 This is the list of intros of eev...
03:06 let me switch to a smaller font here...
03:12 the one that we are going to see
03:15 is here, in the section of advanced
03:19 features that require extra setup... and
03:21 the name of this intro is find-show2-intro.

03:24 Let me go straight to that intro...
03:27 it's here... here we have an
03:30 introduction that explains
03:32 very roughly what these things are...
03:35 the main idea is that at some point the
03:38 the main attraction of this thing will
03:41 be a tutorial on how to use Lpeg, that is
03:44 a tool for generating parsers...

03:47 but this tutorial does not exist yet...
03:51 anyway, the focus here is on how
03:54 to try this
03:55 thing. You need to start here...
04:01 this is not a very basic "try it", it
04:04 has some prerequisites... it expects
04:07 that people will understand most of
04:09 these expressions here... and one of
04:14 the most basic things is that when you
04:16 type f8 on a line that starts with
04:19 two red stars the f8 treats that line
04:22 as a comment and shows the content of
04:25 that line in the echo area.

04:29 When yoy type f8 on a line that has only one
04:32 red star the rest of the line is treated as
04:34 Lisp... so these lines here,
04:37 that take a few seconds to run...
04:40 they will assure that we have access to
04:44 melpa and that the package system is
04:48 installed...
04:51 oops, oh no, I need to fix something here...
04:54 whatever - I'll do that later...

04:57 and then these other two sexps here
05:01 will guarantee that
05:04 we have pdf-tools installed, and this
05:07 last one here, that is a comment... if we
05:10 execute it with M-e... then it
05:14 will show the description of the
05:16 package pdf-tools, in my case it
05:19 will show that is installed... and so on.

05:23 Then, to try the demo people have to
05:27 install some system-wide dependencies...
05:30 I mean, this first block was for an
05:34 Emacs-wide dependency, that is pdf-tools...

05:37 In my case I need to run this
05:40 block here, because I'm running Debian...
05:42 so I need to run this... in this
05:47 case if I send these lines to a shell
05:49 with f8s it's going to show that
05:51 all these packages are already
05:54 installed... and then I have to give
05:56 more f8s here, just to define links to
06:00 some manuals... for example, now this
06:05 link here... if I execute it with M-e it
06:07 will open the manual of lpeg... a local
06:09 copy of the manual of lpeg.

06:19 Then we have to run this part here
06:21 that installs some things in
06:25 /tmp, and this first block here clears
06:28 the directory in which I'm going to put
06:30 most of the things, and it clones my
06:34 programs - the ones that I showed in my
06:37 presentation in a very incomplete form...

06:41 then this other block here
06:45 clones other two repositories of
06:47 something very specific about Lua - some
06:50 extensions of Lpeg... and they compile one
06:54 of these extensions, that needs to be
06:56 compiled with gcc...

06:57 and then we have to run this
07:00 other block here, that defines links to
07:02 some manuals... for example...
07:07 oops, well, whatever... and then I have
07:11 to run this block here because the
07:14 communication with some of the external
07:16 programs that will be run from Emacs will
07:19 be done using environment variables...

07:24 then this block here is
07:27 just a technical comment...

07:30 then here we have the first
07:31 non-trivial test.
07:34 These three lines here will
07:37 create
07:38 a target buffer running Lua here...
07:43 and then it will check with if my
07:47 pretty-printer works...
07:49 it does, it's able to print
07:53 associative tables in this format...

07:56 and then I'm going to do some other things
07:58 here... I'm going to inspect the path and
08:02 then load an extension of my pretty-printer
08:05 and ask it to tell me the contents of the
08:11 table of methods of my pretty-printer...
08:15 so, for example, it prints the method
08:19 getsortedkvs as this, and this thing
08:24 is something that I can run in Emacs...
08:26 and it shows the source code
08:28 here in the window at the right. let me
08:31 close this and go back...

08:34 This is a test that we need
08:38 to run just to check if lpegrex is
08:40 working... it's not very important, lpegrex
08:44 is only going to be used in a
08:47 very few tests, and just to compare
08:50 lpegrex with my hacker-friendly version
08:52 of its main functions...

08:56 so here is a test... it adds some
09:01 paths to the to the LUA_PATH...
09:05 and then we just need to check that
09:08 these things here run without errors...
09:11 but the output is boring, as I've said.

09:13 This is another test, that just
09:17 checks if lpegrex can be loaded in
09:20 another way... it's also boring it only
09:22 shows that some the functions are defined...

09:25 and this is the non-trivial part,
09:28 that shows the things that I've explained in
09:34 my presentation... the first thing is that
09:38 most of my tools use one of the
09:41 windows to display a PDF,
09:43 but the PDF must be regenerated
09:46 by Lua and we need to tell Lua where to
09:48 put that PDF and this is done by setting
09:52 some environment variables, and the
09:54 function that does that is called
09:56 show2-use, that tells Show2
10:00 which directory to use, and it works in a
10:03 very non-trivial way... but usually we run
10:08 show2-use before a block like this one...
10:10 and remember that some parts of
10:14 blocks like these are things
10:15 that are not important... for example, if I
10:17 run this then it shows in the window at
10:21 the right the current... sorry, this
10:25 example. If I run just this it shows
10:28 in the window at the right a target
10:31 buffer that may not be important, then in
10:34 the second line here it kills the
10:36 current target buffer and then in this
10:38 other line here it recreates the target
10:40 buffer so that I got a new target buffer
10:43 running Lua.

10:45 This line here, whose
10:49 logic is very non-trivial... it also uses
10:52 the window at the right, but it uses the
10:53 window at right to explain what it is
10:55 doing. So if I run this it shows in the
10:59 window at the right how its argument
11:02 is going to be interpreted, how it's
11:03 going to be processed to set some
11:08 environment variables, and explains lots
11:10 of things, including how it's going to
11:13 define these functions here, that set up
11:16 a 3-window setting like this.

11:19 But let me go back to this
11:22 part of the demo here... if I run
11:26 all these lines with f8, each one of the
11:29 lines will show a buffer like this,
11:32 with the information about what show2-use
11:36 does with each of these
11:39 arguments... so I can just type several
11:42 f8s here and compare how things change.

11:45 So this is just a way
11:49 to let people understand how this
11:52 function works... and it uses a nice trick
11:55 that I only invented a few weeks ago,
11:57 that is using the window at the right for
12:00 explaining the logic...

12:02 and now here is a basic
12:07 example of using show2-use...
12:11 and using Show2...
12:15 and this line
12:17 here, with the show... it takes a few
12:20 seconds to run... it creates a
12:22 PDF, and this line here creates the
12:26 3-window setting with the script
12:29 being edited here - the "e", the target
12:33 buffer here - the "t", and the viewing
12:37 buffer here - the "v"... so this works,
12:40 but it's very basic... there are some
12:43 explanations here...

12:46 this is an example that is
12:51 slightly less
12:53 trival... we can first execute it like
12:56 this... note that
12:59 here we have these two lines, that look
13:01 redundant... in the first we define the
13:03 global variable "body" in a certain way,
13:06 and in the second we we redefine "body" in
13:08 another way...

13:09 let me run this again... :show00 and :show0
13:15 are just debugging functions
13:17 that show what is going to be saved
13:20 in the .tex file... and this last line here,
13:23 with just ":show" without any "0"s,
13:25 saves the .tex file and
13:28 produces the PDF... and it takes a few
13:30 seconds to run... we need to wait
13:33 until it finishes, and we need to to
13:36 check if its output says either success
13:40 or error... and if we got a success then we
13:44 can run this, the "(etv)"...
13:45 and note that this option
13:50 here has told show to include some
13:53 things here that would scale the output...
13:56 it includes this \scalebox{4} here...

14:01 and then this part of the
14:05 tutorial explains that we can run
14:09 these lines here in any order, and we can...
14:13 remember that in the first time
14:17 this first line was ignored because the
14:20 second one redefined "body"...
14:22 but now we can run this first
14:26 line here and now this value is going to
14:29 override the other one...
14:31 then we skip this "HELLO" without
14:34 the backslash here... we run these lines
14:37 again... and now the show is going to say
14:41 that we didn't get a success, we get
14:44 an error... so now the "(etv)" would not
14:49 work, it's going to show something spurious...

14:52 and we can show the log of the
14:55 compilation... we're going to see what went
14:58 wrong...
15:00 and we can also run this to to examine
15:04 what was saved in the .tex file.

15:07 So this was just a basic demo to
15:11 explain how Show2 works, and how "(etv)"
15:14 works, and how we can use these several
15:17 variants of :show to inspect what is
15:19 being saved and compiled...

15:21 and now we have a few
15:24 less trival tests, in the
15:27 sense that these tests are going to
15:30 show something in the PDF that is not so
15:34 trivial... here we get one test that is in
15:36 a test block in this file...

15:38 the file is called ParseTree2.lua,
15:42 and this line here goes to
15:49 this test block... and if we run this
15:53 block here, in the test block...
15:55 it uses a parser that is defined in
15:59 this file, it parses this string
16:04 here, it displays this, the abstract
16:08 syntax tree generated by parsing this
16:11 string... and then we have some
16:17 other lines here that process the tree
16:20 in several ways...
16:23 that I do not want to explain... but the
16:26 important is that at this point here at
16:29 this line I take this object here,
16:31 produced by underbracifying o9, and I
16:37 run the show method on it. It takes a
16:40 few seconds, it says success, so now this
16:44 is going to work...
16:45 and it displays this parse tree here.

16:50 So this was one of the non-trivial
16:55 tests... here is another one...
16:59 that... the output looks trivial, but
17:03 the logic is not...
17:07 the test is this one, it produces
17:11 this .tex here, that loads
17:15 several .tex files and the
17:18 style file... they are all included
17:21 this directory here...

17:27 here you can see that is,
17:30 /tmp/show2-elpeg1/LATEX/,
17:33 so it's a temporary thing... but it has
17:37 lots of Lua files and some .tex files.
17:42 and this thing here is processed by
17:46 one of the things that I use to
17:48 to generate diagrams in LaTeX, it's a
17:51 package called Dednat6...

17:53 and if I run this it generates a PDF and
18:00 the PDF is this.. so this thing is a
18:03 variant of verbatim mode...
18:07 and this is something that will be very
18:14 interesting at some point, but at this
18:16 point is not really interesting...
18:18 this is my hacker-friendly
18:22 version of lpegrex, and here
18:26 are some examples of how it works...
18:30 I tested either all or most of its
18:35 test blocks and they are working... for
18:38 example, this one is a test block that
18:41 defines a grammar that starts very
18:43 basic... and then it's changed a bit at a
18:50 time... and then we change the grammar and
18:53 we ask this function here to use the
18:57 current grammar to parse this thing
18:59 here considering that this symbol
19:02 here is the top level symbol of the
19:04 grammar. So... it shows how we can parse
19:08 arithmetical expressions with the right
19:16 precedence, and... that's it.

19:18 At some point this thing is going to become
19:20 a tutorial of lpeg but at at this moment
19:23 it is not. Anyway...
19:25 So, here we have lots of Lua files,
19:31 and most of these Lua files have...
19:34 let me see... let me see if I have
19:38 something interesting here...

19:40 Most of these Lua files
19:43 have test blocks that that you can run
19:45 in your installation, in which
19:48 everything is in the /tmp/ directory...
19:51 for example this one... no, let me try the
19:55 last test block in this file...
20:02 it does some weird things here, but
20:06 then it has a :show()... the :show()
20:10 saves a .tex file and compiles it into a PDF,
20:12 and then this thing here shows the result,
20:15 that is something three-dimensional here,
20:17 and some other things here.

20:19 So, yeah, that's it! I hope that
20:22 everything is... will be easy to
20:27 run... I have only tested this thing on
20:31 Debian and I have one friend that is
20:33 testing that on Mac OS and another
20:36 friend who's testing that on Arch Linux...
20:39 and if you can test that on
20:41 your system then please get in touch!
20:43 Please tell me if things are working,
20:45 please help me to debug these things...
20:48 and yeah! That's it. That's it for the
20:50 moment. Thanks! Bye! =)

20:52