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
 qdraw
git
lean4
agda
forth
squeak
icon
tcl
tikz
fvwm
debian
irc
contact

Two ways of creating ".so"s for Lua, one very fast, both using Emacs and eev - 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.
The screenshots below are not from the video - they're from here.


00:00 Hi! My name is Eduardo Ochs, I'm the
00:02 author of an Emacs package called eev,
00:04 and the title of this video is:
00:07 Two ways of creating ".so"s
00:10 for Lua, one of them very fast, both
00:13 using Emacs and eev.

00:15 And remember that a ".so"
00:18 is one thing that you can produce
00:21 from a C file - for example you can start
00:23 with a C file like this one, and then
00:26 compile it to a shared object and then it
00:30 can be dynamically loaded by other
00:32 programs - for example from Lua...

00:34 Let me start by the "very fast way"
00:38 way of producing a ".so", in which all the
00:42 details are hidden.

00:44 Suppose that I want to create a ".so"
00:46 that defines a Lua function called
00:47 "minusdiv", and the body of the Lua
00:53 function is this thing here, these three
00:55 lines here. We can run this eepitch block
00:59 here... eepitch is explained in this page,
01:03 by the way...

01:06 we run it by typing f8 on each line...
01:16 this thing here created a C file
01:20 with lots of things besides the body
01:23 of this function, and then compiled it
01:26 using GCC, and then listed the...
01:30 sorry, the file is in the directory
01:35 /tmp/ - this one... and the ".so" is here.
01:40 And it also loaded this file... so now the
01:43 function minusdiv is available... and if
01:46 we type f8 on this line here it says
01:49 that the result of of running minusdiv
01:51 with the arguments 20 and 2 is
01:55 18 and 10.

02:00 The details here are a bit boring...
02:03 they are all in a file called CLua1.lua,
02:07 that has an introduction... and then some
02:10 templates, and then the programs that use
02:13 those templates... and it also has some
02:16 demos in test blocks...

02:19 but it's better to start by this
02:22 other way here - the way 1, in which
02:24 everything is very explicit.

02:25 Suppose that I want to
02:28 create this file here... no, let
02:32 me start from the point in which the
02:35 the file is already created. let me open
02:37 this file here...

02:39 this is its code in C, this is the
02:44 body - these three lines here -
02:46 and somehow I created the rest of
02:50 the C code... and this thing here is
02:53 a test block - is something that I
02:56 can execute with f8s, and that will
02:59 compile the the ".c", the file in
03:04 which I am, generate a ".so", and test this
03:08 ".so".

03:10 Let's run it here... note that
03:13 here we have two different blocks that
03:15 define environment variables, this one
03:18 and this one... if we execute them in order
03:22 then the second block will override the
03:24 definitions from the first one. I'm on a
03:27 Debian system, so that's what I want... but I
03:29 have a friend who is testing this on Mac,
03:32 and what he has to do is to run these three
03:35 three lines here and skip these other lines...

03:38 anyway, I want to run these
03:41 lines here,
03:43 then this thing here...
03:45 now I have my file ".c", my file
03:49 ".so", and now I can run Lua and ask Lua
03:54 to load the ".so" and to run this
03:59 function here here
04:00 to install
04:03 the Lua functions that are defined
04:06 in C in that file...

04:08 and now the function minusdiv is
04:11 available, and I can run it.

04:13 Note that this thing
04:17 loads... this thing tells loadlib to
04:21 run a function with this name, and the
04:24 function with this name is
04:28 defined here...
04:33 and that function
04:39 runs this line to install all the
04:43 libraries listed in this table here, and
04:46 one of these lines
04:49 is an entry for a Lua function
04:52 called minusdiv... the C function
04:56 that corresponds to it is
04:59 this one, and it is defined here.

05:02 So it's a bit boring to write a C
05:05 file like this one - unless you do that
05:08 all the time and you remember all the
05:09 details. I don't... I don't use these
05:12 things often, so for me it was much
05:14 better to create some functions based
05:17 on templates that would generate
05:20 the files for me.

05:22 Let me show how these functions work.

05:26 If I run this function here
05:29 it creates a temporary buffer that will
05:33 generate a file with this name here,
05:36 that defines a function like this...
05:39 in the first moment the function will
05:41 be just a stub... we will have to replace
05:43 its body by something else.

05:46 Let me start by running this. This is my
05:50 temporary buffer, if I run this line
05:53 Emacs switches to C mode, so everything is
05:57 much easier to understand because
06:00 of colors...

06:03 and this line here will copy the rest
06:06 of the file to the kill ring
06:08 and will open this file here.

06:13 Usually this file here is empty...
06:16 let me delete this file...
06:21 so now I'm in the in the typical
06:24 situation, in which this file is empty...

06:28 and if I run this thing here
06:31 then this function, ee-copy-rest, copies
06:34 the rest of this file to the kill ring
06:37 and now I can go to this buffer here
06:39 type C-y, and I get a copy of this thing.

06:43 Now I need to
06:47 replace this body here by something else...
06:51 let me delete it, first let me go back...
06:54 I'm going to use a copy of these lines...

07:03 and I also want to adjust my test...
07:07 the test is this one, the test will be
07:15 this one... and now let's test this thing.

07:20 I need to execute this thing to compile
07:23 the C file and to generate a ".so"...
07:27 here it is, everything works...

07:29 and now I can run this Lua block
07:33 here... it loads the ".so" and tests this
07:38 function... so that's it.

07:42 Let me go back to the "very fast way".

07:45 All these things are
07:48 explained in one of the...
07:52 well, sorry... most of the
07:55 documentation of eev is in sandboxed
07:59 tutorials... the main one is this one here,
08:02 and note that you can write
08:06 anything here, and do tests here...

08:09 and this thing is in a
08:14 temporary buffer - it's not saved in any
08:16 file, so you can do any mess that you
08:18 want here... and we have an intro
08:22 called lua-tutorial. It's in a very
08:25 preliminary stage, and at this moment it
08:28 has... most of its sections are
08:32 about creating ".so" files...

08:36 and it has one section for using CLua1.lua
08:40 "from the inside", in the sense that...
08:49 in a sense that... oh, I'm without
08:52 internet here, so I can't run that demo
08:56 now... but the idea is that we
08:59 download three files in a subdirectory
09:01 of /tmp, and we adjust two environment
09:05 variables - one that tells Lua
09:09 which file to use as an init file, and
09:13 another one that says to Lua to add
09:16 that directory to the PATH...

09:18 and then the instructions will
09:25 explain how to use this thing here from
09:27 its test blocks...

09:29 for example, this block here
09:31 defines my main class, CLua, and if we
09:35 run this test block here...

09:40 I will need this smaller font
09:42 for a few minutes...

09:44 it loads the current file...

09:47 in this block here I have to choose
09:51 if I will compile on a Mac or on Debian...
09:54 I will choose Debian...

09:58 and now we have several tests that
10:01 explain... that show how the data
10:04 structures work, how the things work in
10:08 either in the lower-level functions
10:10 or in the higher-level functions...

10:13 and here we have some basic tests...
10:19 and here we have a higher-level function
10:25 that uses fewer arguments, and that
10:32 defines another way of creating a C file...
10:35 and now we can run this...

10:38 and in this block here we can check that
10:41 we can run buildandload twice
10:44 to define the function foo twice,

10:46 and in the first time the function foo
10:47 will have this definition,
10:49 in which it returns this string, "orig",
10:51 and in the second time we will redefine
10:55 that function...

11:00 so the function foo will be redefined
11:03 to be another function defined in C,
11:06 whose body is this, and that returns
11:09 the string "redefined"...

11:11 So we can use these blocks to test
11:14 several definitions of a Lua function
11:19 defined in C, and we can have a sequence
11:22 of blocks like that one...

11:25 and it's very easy to compare the
11:27 results of running, for example, this,
11:32 and running this...

11:36 and these lines here at the end just show
11:38 the templates corresponding to
11:43 the last execution of buildandload,
11:45 so we can see
11:46 what is the command for loadlib,
11:51 what would be the commands for require,
11:53 that I'm not not using now at
11:56 this moment, I'm using the lower-level
11:59 way of loading a C function...

12:03 and what are the commands for
12:06 compiling the ".c" into a ".so"...
12:10 and what is the code in C, that
12:14 is just this...

12:18 so, let me go back... this section of the
12:22 tutorial explains how to use CLua1.lua...
12:26 I mean, it explains how to
12:31 download CLua1 in a subdirectory of
12:35 /tmp/, and how to run the tests in CLua1...

12:40 and this other block here
12:44 explains how to use
12:46 the faster way "from anywhere".

12:51 Once we have CLua1 installed in /tmp/ -
12:54 I'm putting things in /tmp/ because
12:57 I think that most people are just
12:59 going to try this for 5 minutes, very few
13:02 people will make this more permanent, so
13:05 it's better to put everything in /tmp/...

13:08 and this second block here can be run
13:13 from anywhere... I'm not in /tmp now,
13:19 and I can run this and
13:25 create two definitions of the
13:28 function minusdiv - the first one with
13:31 this C body here, and the second one with
13:35 this C body here, and each one has
13:39 some tests...

13:44 and that's it. I didn't explain
13:48 everything in a lot of detail here
13:50 because I guess that most people are
13:52 going to prefer to read
13:53 the textual instructions in
13:57 this page...
14:00 and I'm going to to start working on
14:04 that now. So this video is an
14:07 introduction... and the precise
14:09 instructions will be here.
14:12 So, that's it!
14:15 Thanks! =)

14:16