How to deal with arrays or lists. Lua - if.else statement - An if statement can be followed by an optional else statement, which executes when the Boolean expression is false.
Lua Print In Lua Copy
![Lua Lua](https://i.gyazo.com/76f5a19c0bc807e263bcdf56489be250.png)
This first edition was written for Lua 5.0. While still largely relevant for later versions, there are some differences.
The fourth edition targets Lua 5.3 and is available at Amazon and other bookstores.
By buying the book, you also help to support the Lua project.
The fourth edition targets Lua 5.3 and is available at Amazon and other bookstores.
By buying the book, you also help to support the Lua project.
Programming in Lua |
Part IV. The C APIChapter 24. An Overview of the C API |
24.2.3 – Other Stack Operations
Besides the above functions,which interchange values between C and the stack,the API offers also the following operations for generic stack manipulation:The
lua_gettop
function returns the number of elements in the stack,which is also the index of the top element.Notice that a negative index -x
is equivalent tothe positive index gettop - x + 1
.lua_settop
sets the top(that is, the number of elements in the stack) to a specific value.If the previous top was higher than the new one,the top values are discarded.Otherwise, the function pushes nils on the stack to get thegiven size.As a particular case, lua_settop(L, 0)
empties the stack.You can also use negative indices with lua_settop
;that will set the top element to the given index.Using this facility, the API offers the following macro,which pops n
elements from the stack:The
lua_pushvalue
function pusheson the top of the stack a copy of the element at the given index;lua_remove
removes the element at the given index,shifting down all elements on top of that position to fill in the gap;lua_insert
moves the top element into the given position,shifting up all elements on top of that position to open space;finally, lua_replace
pops a value from the top andsets it as the value of the given index,without moving anything.Notice that the following operations have no effect onthe stack:![Lua Print In Lua C Lua Print In Lua C](https://cdn.educba.com/academy/wp-content/uploads/2021/02/Lua-print.jpg)
To illustrate the use of those functions,here is a useful helper function that dumpsthe entire content of the stack:This function traverses the stack from bottom to top,printing each element according to its type.It prints strings between quotes; for numbers it uses a `
%g
´ format;for other values (tables, functions, etc.) it prints only their types(lua_typename
converts a type code to a type name).The following program uses
stackDump
to furtherillustrate the manipulation of the API stack:Copyright © 2003–2004 Roberto Ierusalimschy. All rights reserved. |
Lua has a very simple C API. You can run Lua code and access lua objects from C. Similarly, you can access C functions and libraries from Lua. In this post, we’ll primarily look at how to expose C functions to lua.
Install Lua
Let’s start off with the installation of lua. You can install lua using system package managers as
Mac:
Ubuntu:
You can also build lua from source. However, you have to build lua as a shared library and this can be a bit tricky.
Lua Stack
Communication between lua and C is held through stacks with each element in stack representing lua value (nil, number, string, etc.).
For example, a C wrapped function
c_swap
is called in lua as:In C, you will receive arguments in a stack as
You will then read the arguments from the stack as (indexing for this stack starts with 1 like in lua):
This is actually unsafe because these calls will fail if value in the stack at the specified index is not a number. Following code uses auxiliary library
lauxlib.h
and is safer; it will raise errors instead of segfaulting.Then, you will process the arguments and push the results to stack.
Stack will now look like
Since you need to communicate the number of return value to lua, you will
return 2
. Lua will then know that top 2 values in the stack are the returned values.The stack we’ve described is not global. Each function has its own stack.
Code
Let’s put all this together into
main.c
. main()
function illustrates how to run lua code from C.And build and execute as If you have installed lua with apt-get, build using
gcc main.c -o swap -llua5.2 -I/usr/include/lua5.2/
which should print
Library
In the above code, you’ve not really used lua interpretor; you’ve run the lua code in C itself.You might rather want to create a module which you can load into a lua interpretor using
To do this, you’ll have to register your functions by creating a array of
luaL_Reg
and a function luaopen_mylib
.Lua Print In Lua Color
Let’s do this right away by editing
main.c
. We will also add additional mysin
function.Facetune 2 contact number. This code works only for lua 5.2. For lua 5.1, please use
luaL_register(L, 'mylib', mylib);
instead of luaL_newlib(L, mylib);
Create a loadable
.so
file with If you have installed lua with apt-get, build using
gcc main.c -shared -o mylib.so -fPIC -llua5.2 -I/usr/include/lua5.2/
You can now load this module in lua.
Lua Print In Console
Now, you should be able to wrap any C library by writing a lua wrapper.We still have some caveats:
- We will have to write a wrapping function for each of the functions in your C library to ‘parse’ the arguments(
luaL_checknumber
etc.). This is repetitive and can be a potential source for bugs. - C doesn’t have classes. What if your library is in C++? You cannot easily wrap classes like above. You will have to mess with metatables and so on.
Lua Print In Lua Cricut
A solution to both of these is to use Swig. Swig allows you to wrap C/C++ classes/functions into many languages like python, lua, java quite easily. In a later post, we will see how to use swig and wrap a simple library.