Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
# «.debian-packages» (to "debian-packages") # «.quick-presentation» (to "quick-presentation") # «.qp-libraryfuns» (to "qp-libraryfuns") # «.qp-metatables» (to "qp-metatables") # «.install-5.0.2» (to "install-5.0.2") # «.compile-5.0.2» (to "compile-5.0.2") # «.manual2-5.0.2» (to "manual2-5.0.2") # «.eeluaw» (to "eeluaw") # «.lua-gdb-1» (to "lua-gdb-1") # «.luaL_openlib» (to "luaL_openlib") # «.closures-C» (to "closures-C") # «.luagtk» (to "luagtk") (find-es "lua5") (find-es "04lua") (find-eevex "") ##### # # The debian packages for Lua # 2004oct19 # ##### # «debian-packages» (to ".debian-packages") #* apt-get install \ liblua50 liblua50-dev liblualib50 liblualib50-dev lua50 lua50-doc #* liblua50 liblua50-dev liblualib50 liblualib50-dev lua50 lua50-doc # (find-sh "dpkg -l") # (find-vldifile "liblua50.list") # (find-vldifile "liblua50-dev.list") # (find-vldifile "liblualib50.list") # (find-vldifile "liblualib50-dev.list") # (find-status "lua50") # (find-vldifile "lua50.list") # (find-udfile "lua50/") # (find-status "lua50-doc") # (find-vldifile "lua50-doc.list") # (find-udfile "lua50-doc/") ##### # # Quick presentation # 2005oct05 # ##### # «quick-presentation» (to ".quick-presentation") # Also at: (find-es "lua-intro" "quick-presentation") #* # Basic datatypes # (find-pilw3m "2.html" "eight basic types") # (find-luamanualw3m "#2.2" "eight basic types") # (find-luamanualw3m "#pdf-type") lua50 -e ' print(1, type(1)) --> 1 number print(1.0, type(1.0)) --> 1 number print("abc", type("abc")) --> abc string print(nil, type(nil)) --> nil nil print(true, type(true)) --> true boolean print(false, type(false)) --> false boolean print(print, type(print)) --> function: 0x804d218 function print({2,3,5}, type({})) --> table: 0x8053ab0 table ' #* # (find-luamanualw3m "#2.5.9" "f = function () body end") # (find-pilw3m "6.html") # Functions are values lua50 -e ' function square(a) return a*a end square = function (a) return a*a end print(square, square(2)) ' #* # Functions and expressions can return several values # (find-pilw3m "5.1.html" "Multiple Results") # (find-luamanualw3m "#2.4.3" "Assignment") # (find-luamanualw3m "#2.5" "Expressions") lua50 -e ' function foo() return 1, 2, 3 end print(1, 2, 3) --> 1 2 3 print(foo()) --> 1 2 3 print(99, foo()) --> 99 1 2 3 print(99, foo(), 200) --> 99 1 200 print(99, (foo())) --> 99 1 zero, one, two, three, four = 0, foo() print(zero, one, two, three, four) --> 0 1 2 3 nil ' #* # Coercion # (find-luamanualw3m "#2.2.1" "Coercion") # (find-pilw3m "2.4.html" "coercions") lua50 -e ' print(1+"2") --> 3 print("<".. 11 .. 22 ..">") --> <1122> ' #* # String literals # (find-luamanualw3m "#2.1" "Literal strings") # (find-luamanualw3m "#2.1" "Literal strings can also be defined") #* # Syntax for comments # (find-luamanualw3m+ "lexical" "comments") # (find-luamanualw3m+ "lexical" "long comment") #* # PP # (find-luamanualw3m+ "print") # (find-luamanualw3m+ "tostring") # (find-luamanualw3m+ "lua-sa") # (find-angg ".zshrc" "LUA_INIT") # (find-angg "LUA/lua50init.lua" "PP") # (find-angg "LUA/lua50init.lua" "mytostring") echo $LUA_INIT lua50 -e ' print(22, "abc", print) --> 22 abc function: 0x804d218 PP (22, "abc", print) --> 22 "abc" <function: 0x804d218> ' #* # Tables and PP # (find-luamanualw3m+ "TypesSec" "references") lua50 -e ' a = {10, 20, 30} b = {10, 20, 30} print(a); PP(a) --> table: 0x8051c38; {1=10, 2=20, 3=30} print(b); PP(b) --> table: 0x8052ef0; {1=10, 2=20, 3=30} a[2] = 40 print(a); PP(a) --> table: 0x8051c38; {1=10, 2=40, 3=30} print(b); PP(b) --> table: 0x8052ef0; {1=10, 2=20, 3=30} ' #* # Tables and PP # (find-luamanualw3m+ "TypesSec" "heterogeneous") lua50 -e ' a = {10, 20, 30} print(200, "some string", a) --> 200 some string table: 0x8051c38 PP (200, "some string", a) --> 200 "some string" {1=10, 2=20, 3=30} b = {11, a, "foo", print} PP(b) --> {1=11, 2={1=10, 2=20, 3=30}, 3="foo", 4=<function: 0x804d218>} ' #* # Tables (2) # (find-luamanualw3m+ "tableconstructor") # (find-luamanualw3m+ "TypesSec" "except nil") # (find-luamanualw3m+ "next" "value nil") lua50 -e ' c = {11, 22, 33}; PP(c) --> {1=11, 2=22, 3=33} c[2] = c[2]+c[3]; PP(c) --> {1=11, 2=55, 3=33} c[5] = 55 ; PP(c) --> {1=11, 2=55, 3=33, 5=55} c["foo"] = "FOO"; PP(c) --> {1=11, 2=55, 3=33, 5=55, "foo"="FOO"} c[3] = nil ; PP(c) --> {1=11, 2=55, 5=55, "foo"="FOO"} d = {11, 22, 33, [5]=555, ["bar"]="BAR", [c]="!"}; PP(d) --> {1=11, 2=22, 3=33, 5=555, "bar"="BAR", {1=11, 2=55, 5=55, "foo"="FOO"}="!"} d[2] = nil ; PP(d) --> {1=11, 3=33, 5=555, "bar"="BAR", {1=11, 2=55, 5=55, "foo"="FOO"}="!"} d[c] = nil ; PP(d) --> {1=11, 3=33, 5=555, "bar"="BAR"} ' #* # Global variables # (find-luamanualw3m+ "_G") # (find-luamanualw3m+ "TypesSec" "a.name") # (find-sh "lua50 -e 'for key,val in _G do print(key, val) end'") lua50 -e ' print(print) --> function: 0x804d218 print(_G["print"]) --> function: 0x804d218 print(_G.print) --> function: 0x804d218 print(_G) --> table: 0x804c678 print(_G._G) --> table: 0x804c678 ' #* # Local variables # (find-luamanualw3m+ "visibility") lua50 -e ' a = 22 do print(a) --> 22 local a = 33 print(a) --> 33 end print(a) --> 22 ' #* # Capture of local variables # (find-luamanualw3m+ "func-def" "closure") # (find-es "lua5" "captured-variables") lua50 -e ' foo = function () local storage return function () return storage end, function (x) storage = x; return x end end get1, set1 = foo() get2, set2 = foo() print(set1(22), get1()) --> 22 22 print(set2(33), get1(), get2()) --> 33 22 33 ' #* # loadstring # (find-luamanualw3m+ "loadstring") lua50 -e ' print(loadstring([[ print("hi") ]])) print(loadstring([[ print("hi") ]])()) -- execute print(loadstring([[ print("hi"); return "foo", "bar" ]])()) -- execute print(loadstring([[ print("hi ]])) print(loadstring([[ print("hi ]], "name of the block")) ' #* # assert # (find-luamanualw3m+ "assert") lua50 -e ' print( "foo" ) print(assert("foo")) print(assert("foo", nil)) print(assert("foo", "ignored")) print(assert( nil, "errmsg")) ' #* ##### # # quick presentation: library functions # 2005nov06 # ##### # «qp-libraryfuns» (to ".qp-libraryfuns") #* # (find-luamanualw3m+ "string.gsub") # (find-luamanualw3m+ "pm") lua50 -e ' print(string.gsub("Hello world", "l", "<>")) print(string.gsub("Hello world", "l+", "<>")) print(string.gsub("Hello world", "([A-Z]+)([a-z]+)", "<%1,%2>")) print(string.gsub("Hello world", "([A-Z]+)()([a-z]+)", "<%1,%2,%3>")) ' #* ##### # # quick presentation: metatables # 2005oct18 # ##### # «qp-metatables» (to ".qp-metatables") #* # Metatables # (find-luamanualw3m+ "metatable") # (find-luamanualw3m+ "setmetatable") lua50 -e ' a = {} mt = {} setmetatable(a, mt) mtset = function (mtfield) mt[mtfield] = function (...) P(mtfield, unpack(arg)) end end mtset("__add"); b = a + 1 mtset("__sub"); b = a - 2 mtset("__mul"); b = a * 3 mtset("__div"); b = a / 4 mtset("__pow"); b = a ^ 5 mtset("__unm"); b = - a mtset("__concat"); b = a .. 6 -- mtset("__eq"); b = a == a -- mtset("__lt"); b = a < 9 -- mtset("__le"); b = a <= 10 ' #* # Default metatables: files are not primitive types # (find-angg "LUA/lua50init.lua" "readfile") echo foo > ~/o; cd lua50 -e ' readfile = function (fname) local f = assert(io.open(fname, "r")) local bigstr = f:read("*a") f:close() return bigstr end print(readfile("o")) f = io.open("o", "r") mt = getmetatable(f) print(f) for key,val in mt do print(key, val) end print(f:__tostring()) ' #* lua50 -e ' a = {} mt = {__tostring = function () return "foo!" end} setmetatable(a, mt) print(a) PP(a) -- hmm, broken ' #* # (find-luamanualw3m+ "pdf-getmetatable") # (find-luamanualw3m+ "tostring") PP(getmetatable({})) f = io.open("~/tmp/o", "w") P(getmetatable(f)) ##### # # Recompiling from source with -g # 2004oct19 # ##### # «install-5.0.2» (to ".install-5.0.2") # (find-es "lua5" "install-5.0.2") # (code-c-d "lua5" "~/usrc/lua-5.0.2/") # (find-lua5file "") #* # (find-fline "$S/http/www.lua.org/ftp/lua-5.0.2.tar.gz") psne http://www.lua.org/ftp/lua-5.0.2.tar.gz #* # «compile-5.0.2» (to ".compile-5.0.2") mkdir ~/usrc/ rm -Rv ~/usrc/lua-5.0.2/ mkdir ~/usrc/lua-5.0.2/ tar -xvzf $S/http/www.lua.org/ftp/lua-5.0.2.tar.gz -C ~/usrc/ cd ~/usrc/lua-5.0.2/ find * -name '*.[ch]' | sort > .files.ch etags $(<.files.ch) # (find-lua5file "INSTALL") # (find-lua5file "config") # (find-lua5file "etc/README") # (find-lua5file "src/lib/loadlib.c") cat >> config <<'%%%' # --- Edrx's changes # (find-lua5file "config" "dynamic loading on Unix systems") LOADLIB= -DUSE_DLOPEN=1 DLLIB= -ldl MYLDFLAGS= -Wl,-E MYCFLAGS=-g # # (find-lua5file "config" "\n#USERCONF=") USERCONF=-DLUA_USERCONFIG='"$(LUA)/etc/saconfig.c"' -DUSE_READLINE EXTRA_LIBS= -lm -lreadline -ldl INSTALL_EXEC= cp -v INSTALL_DATA= cp -v STRIP=echo NOT stripping: INSTALL_BIN=$(HOME)/bin INSTALL_INC=$(HOME)/include/lua5 INSTALL_LIB=$(HOME)/ulocal/lib INSTALL_MAN=$(HOME)/ulocal/man/man1 %%% make test 2>&1 | tee omt ldd bin/lua 2>&1 | tee ol make so 2>&1 | tee oms mkdir -p ~/bin/ ~/lib/ mkdir -p ~/include/lua5/ mkdir -p ~/ulocal/lib/ ~/ulocal/man/man1/ make install 2>&1 | tee omi make soinstall 2>&1 | tee omsi # (find-lua5file "om") # (find-lua5file "omi") # (find-lua5file "omsi") #* # «manual2-5.0.2» (to ".manual2-5.0.2") # (find-angg ".emacs" "luamanual") # (find-luash "grep '<p><h3><code>' doc/manual.html") # (find-luash "grep 'name=' doc/manual.html") # (find-luash "grep 'name=' doc/manual2.html") # (find-luash "cat doc/manual2.html | lua50 -e 'string.gsub(io.read(\"*a\"), \"<p><a name=\\\"([A-Za-z0-9_.:]+)\\\">\", print)'") # (eev "cd ~/usrc/lua-5.0.2/doc/; tkdiff manual.html manual2.html") cd ~/usrc/lua-5.0.2/doc/ cat manual.html \ | lua50 -e 'print((string.gsub(io.read("*a"), "<p><h3><code>(([A-Za-z0-9_.:]+).-)</code></h3>", "<p><a name=\"%2\"><h3><code>%1</code></h3></a>")))' \ > manual2.html #* # A fossil? mkdir -p ~/bin ~/lib cd ~/usrc/lua-5.0.2/ cp -v bin/lua ~/bin/lua50 cp -v bin/luac ~/bin/luac50 cp -v lib/liblua.so.5.0 ~/lib/liblua.so.5.0 cp -v lib/liblualib.so.5.0 ~/lib/liblualib.so.5.0 #* # (find-luafile "src/lib/lmathlib.c") # (find-efunction 'eegdb) # (find-efunction 'ee-gdb-start) # (find-efunction 'eeb-gdb-start) # (eeb-gdb-start t ee-luadir "bin/lua") br luaopen_math run #* ##### # # eeluaw # 2004oct19 # ##### # «eeluaw» (to ".eeluaw") # (find-eev "eev-langs.el" "eeb-luaw") # (eeluaw "for i=1,20 do print(i) end") --* -- (ee-once (eeb-luaw)) for i=1,20 do print(i) end --* ##### # # lua and gdb (1) # 2005oct16 # ##### #* # «lua-gdb-1» (to ".lua-gdb-1") cd /tmp/ export LUA50SRC=$HOME/usrc/lua-5.0.2 cat > so.c <<'%%%' #include <lauxlib.h> #include <stdio.h> static int my_foo(lua_State* L) { int n = lua_gettop(L); int isnum = lua_isnumber(L, 1); int m = lua_tonumber(L, 1); printf("Hi hi!\n"); printf("%d %d %d!\n", n, isnum, m); return 0; } LUALIB_API int my_init(lua_State *L) { lua_register(L, "foo", my_foo); return 0; } %%% gcc -g -Wall -shared -I$LUA50SRC/include -o so.so so.c # (find-lua50ref "Defining C Functions" "lua_register") cat > loadso.lua <<'%%%' assert(loadlib("/tmp/so.so", "my_init"))() foo(22) %%% $LUA50SRC/bin/lua /tmp/loadso.lua #* # (ee-once (eeb-luagdb-start "bin/lua")) set args /tmp/loadso.lua # br main br loadlib run n n n br my_foo cont #* ##### # # Lua no GDB, parte 2: PP # 2005out05 # ##### # «gdb-PP» (to ".gdb-PP") # (find-es "lua5" "luastackPP") #* export LUA50SRC=$HOME/usrc/lua-5.0.2 rm -Rv ~/tmp/luastackPP/ mkdir -p ~/tmp/luastackPP/ cd ~/tmp/luastackPP/ cat > luastackPP.c <<'%%%' #include <stdio.h> #include <stdlib.h> #include <lua.h> #include <lauxlib.h> void PP(lua_State *L, int index) { lua_pushstring(L, "PP"); lua_gettable(L, LUA_GLOBALSINDEX); lua_pushvalue(L, index<0?index-1:index); lua_call(L, 1, 0); } LUALIB_API int luastackPP_init(lua_State *L) { /* nothing to do on the Lua side; we're only adding a C function */ return 0; } %%% gcc -g -Wall -shared -I$LUA50SRC/include -o luastackPP.so luastackPP.c mkdir -p ~/lib/lua5 cp -v ~/tmp/luastackPP/luastackPP.so \ ~/lib/lua5/luastackPP.so #* cat > /tmp/testPP.lua <<'%%%' LIBDIR = os.getenv("HOME").."/lib/lua5" assert(loadlib(LIBDIR.."/luastackPP.so", "luastackPP_init"))() math.sin(0) -- print(1, 2+"3", string.sub) print("aa", "bb", "cc", "dd", "ee") %%% cat /tmp/testPP.lua > /tmp/testPP.lst luac -p -l /tmp/testPP.lua >> /tmp/testPP.lst lua50 /tmp/testPP.lua #* # (ee-once (eeb-luagdb-start nil "bin/lua")) # (find-fline "/tmp/testPP.lst") # (find-node "(gdb)Calling") # (find-node "(gdb)Define") define depth p lua_gettop(L) end define PP call PP(L, $arg0) end set args /tmp/testPP.lua # br main br math_sin run #* ##### # # luaL_openlib - for registering an array of functions # 2004jan06 # ##### # «luaL_openlib» (to ".luaL_openlib") # (find-lua50file "src/lib/loadlib.c") # (find-lua50file "include/") # (find-fline "/tmp/luabit/lbitlib.c") #* rm -Rv ~/usrc/lual-openlib/ mkdir ~/usrc/lual-openlib/ cd ~/usrc/lual-openlib/ cat > foo.c <<'%%%' #include "lauxlib.h" #include <stdio.h> /* * (find-luamanualw3m+ "API") * (find-luamanualw3m+ "pushing") */ static int my_foo(lua_State* L) { lua_pushnumber(L, 33); lua_pushnumber(L, 333); return 2; } /* * (find-luamanualw3m+ "LuacallC") * (find-luamanualw3m+ "LuacallC" "#define lua_register(L,n,f)") * (find-lua50file "src/lib/lbaselib.c" "luaL_reg base_funcs[] =") * (find-lua50file "src/lib/lbaselib.c" "luaL_openlib(L, NULL, base_funcs, 0)") * (find-lua50file "include/lauxlib.h" "luaL_openlib") * (find-lua50tag "luaL_openlib") */ static const struct luaL_reg bitlib[] = { {"foo", my_foo}, {NULL, NULL} }; LUALIB_API int my_init(lua_State *L) { lua_pushvalue(L, LUA_GLOBALSINDEX); luaL_openlib(L, NULL, bitlib, 0); return 0; } %%% # (find-luamanualw3m+ "loadlib") export LUA50SRC=$HOME/usrc/lua-5.0.2 gcc -g -Wall -shared -I$LUA50SRC/include -o foo.so foo.c cat > testlib.lua <<'%%%' assert(os.getenv("HOME").."/usrc/lual-openlib/foo.so", "my_init"))() print(foo(44)) print("ok") %%% lua50 ~/usrc/lual-openlib/testlib.lua #* ##### # # understanding closures (from the C side) # 2005nov14 # ##### # «closures-C» (to ".closures-C") ;;* ;; (ee-once (eeeval-bounded)) ;; (find-eev "eev-langs.el" "eelua") (defun eelual (s &optional e) (interactive "r") (ee-write-with-nl s e "" "" ee-file-lua) (find-sh (format "awk '{print NR\": \"$0}' %s; luac50 -l %s" ee-file-lua ee-file-lua))) (eeb-define 'eelual-bounded 'eelual "\n--*\n" nil t t) ;;* --* -- (ee-once (eelua-bounded)) -- (ee-once (eelual-bounded)) function foo (a, b, c) return function () return a, b, c end end load_PP(); math.sin(0) f = foo(10, 20, 30) --* #* # (ee-once (eeb-lua50gdb-start "bin/lua")) source ~/.lua50/PP.gdb set args $EEVTMPDIR/ee.lua br math_sin run #* # (find-angg ".lua50/PP.c") # (find-lua50file "src/lvm.c" "case OP_RETURN:") # (find-lua50file "src/lopcodes.c" "/* OP_RETURN */") # (find-luamanualw3m+ "API") # (find-luamanualw3m+ "c-closure") # (find-luamanualw3m+ "debugI") ##### # # luagtk # 2005sep10 # ##### # «luagtk» (to ".luagtk") # http://luaforge.net/projects/lua-gtk/ # http://luaforge.net/frs/download.php/989/lua-gtk2-0.3.tar.gz #* rm -Rv ~/usrc/lua-gtk2-0.3/ mkdir ~/usrc/lua-gtk2-0.3/ tar -C ~/usrc/ -xvzf \ $S/http/luaforge.net/frs/download.php/989/lua-gtk2-0.3.tar.gz cd ~/usrc/lua-gtk2-0.3/ ./configure 2>&1 | tee oc make 2>&1 | tee om mkdir ~/.lua50/ cp -v build-linux/libluagtk2.so ~/.lua50/ #* cd ~/usrc/lua-gtk2-0.3/; lua50 examples/button.lua cd ~/usrc/lua-gtk2-0.3/; lua50 examples/calculator.lua cd ~/usrc/lua-gtk2-0.3/; lua50 examples/loadlib.lua cd ~/usrc/lua-gtk2-0.3/; lua50 examples/memory.lua cd ~/usrc/lua-gtk2-0.3/; lua50 examples/notebook.lua cd ~/usrc/lua-gtk2-0.3/; lua50 examples/pixmap.lua #* # (code-c-d "luagtk" "~/usrc/lua-gtk2-0.3/") # (find-luagtkfile "") # (find-luagtkfile "doc/") # (find-luagtkfile "doc/README") # (find-luagtkfile "gtk2.lua") # (find-luagtkfile "examples/") # (find-luagtkfile "examples/") # (find-luagtkfile "data/gtkdata.funcs" "gdk_draw_rectangle") # (find-luagtkfile "doc/README" "Perl script") # (find-luagtkfile "script/gen-list.pl") # Local Variables: # coding: raw-text-unix # modes: (fundamental-mode sh-mode emacs-lisp-mode) # ee-delimiter-hash: "\n#*\n" # ee-anchor-format: "«%s»" # End: