2011年9月17日 星期六

[Lua Note] 1 - Getting Started


Chunks

Lua就和一般的Script一樣,沒有所謂的main function,也不需要分號";"'當成一個statement的結束,分號可有可無,不過我還是習慣性的加上去,就像數學運算式的括號,很可能你想的和你寫出來的意思不同,導致錯誤,以下的範例都是一樣的意思
 
    a = 1
    b = a*2
    
    a = 1;
    b = a*2;
    
    a = 1 ; b = a*2
    
    -- "--"是註解的意思
    a = 1   b = a*2    -- 很醜,但還是合法

您可以在提示符號下執行lua,lua [ options ] [ script [ args ] ]
prompt> lua 會進入interactive 模式。
prompt> lua -la -lb會執行a.lua和b.lua,-l相當於require的意思,lua就像一般的computer language一樣,允許您寫自己的library,並且透過require載入。
lua也提供另外dofile這個function,讓您測試您寫的lua檔,dofile和require最大的不同是,require只會載入一次,而dofile可以重覆載入,所以拿來驗證lua檔就非常適合了。



Global Variables

在Lua中,沒有特別宣告local就是Global Variables,用到沒有宣告的變數,其值就是nil
 
function scope1()      -- step 4.
    function scope2()  -- step. 8
        print(A)               -- step. 9 印出A=20
        local A=30         -- step. 10又宣告一個變數A(範圍更小)
        print(A)               -- step. 11 印出該範圍的A, 即30
    end
    print(A)           -- step 5. 印出 10
    local A=20     -- step 6. 新的A=20, Global的A一樣不變
    scope2()        -- step 7.
     print(A)          -- step 12. 印出這個範圍的A = 20
end

print(A)                -- step 1. 印出 nil
A=10                   -- step 2. A=10
scope1()             -- step 3.
print(A)                -- step 13. 印出這個範圍的A = 10
os.exit()



Some Lexical Conventions

和一般的language一樣,會有所謂的key word,以下是lua的key word
while
and break do else elseif
end false for function if
in local nil not or
repeatreturn then true until

lua是case-sensitive就是有分大小寫的。 變數x和變數X是不同的。
在Lua中的註解 --是單行,像C中的//,而--[[ --]]就像C的/* */屬於多行註解。好用的地方是,只要在"--[["前面多一個"-"就等於取消整個註解,超好用。
 
--[[
    print(10)         -- no action (comment)
--]]

---[[
    print(10)         --> 10
--]]


The Stand-Alone Interpreter

lua會將command-line的參數存到陣列arg中,arg[0]存放執行的script,arg[-1]存放script檔名的前一個參數,arg[1]..arg[n]就是依序存放後面的參數。


參考資料:Programming in Lua (first edition)




2011年9月12日 星期一

Lua - Introduction


最近有幸開發新的Web Page,用的是LuCI(Lua Unified Configuration Interface),所以就得先學學Lua嚕,在這裡做些筆記,也和大家分享一下。
Lua是一種embedded language,就像Java Script一樣,通常會依附在host program底下(就像IE和Java script的關係一樣),而host program會執行Lua的程式碼,(就像網頁中參雜Java Script一樣)。不過,在寫LuCI的時候,感覺比較像在寫PHP或者ASP之類的。

Lua主用是用C寫的,原始的Lua非常的小,因為只有提供非常精簡的能力,但是可以透過擴充Library變得更強(更肥),因為精簡,所以適合在Embedded System上使用。

www.lua.org是Lua的官方網站,其中最重要的莫過於裡面的免費書籍,Programming in Lua (first edition),這本是必看的,後面的筆記應該都會是源自這邊,熟悉Lua之後,也可以看看Lua 5.1 Reference Manual
該網站還提供Web版的Lua,讓您沒有Lua也能學Lua。


如果您是在Windows環境底下,您可以安裝luaforwindows來練習,Practice Makes Perfect。


2011年8月6日 星期六

core dump and debug



看ulimit預設的一些參數,注意core file size若是0,就不會產生core文件了。

brook@vista:~$ cat -n foo.c 
     1  #include 
     2
     3  static void sub(void);
     4
     5  int main(void)
     6  {
     7      sub();
     8      return 0;
     9  }
    10
    11  static void sub(void)
    12  {
    13      int *p = NULL;
    14
    15      /* derefernce a null pointer, expect core dump. */
    16      printf("%d", *p);
    17  }
    18
    19
brook@vista:~$ gcc -g -Wall foo.c 
brook@vista:~$ ./a.out 
Segmentation fault
brook@vista:~$ ls core*
ls: cannot access core*: No such file or directory
brook@vista:~$ ulimit -c 1024
brook@vista:~$ ./a.out 
Segmentation fault (core dumped)
brook@vista:~$ ls core*
core
brook@vista:~$ gdb ./a.out core 
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
 Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
...
Reading symbols from /home/brook/a.out...done.
[New Thread 5382]

warning: Can't read pathname for load map: Input/output error.
Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...
Reading symbols from /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.13.so...done.
done.
Loaded symbols for /lib/x86_64-linux-gnu/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...
(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000400518 in sub () at foo.c:16
16          printf("%d", *p);
(gdb) 


    參考資料:
  1. http://blog.csdn.net/borefo/article/details/5029555, 在Linux下产生并调试core文件



熱門文章