Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 35 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
35
Dung lượng
1,47 MB
Nội dung
LUAINTRODUCTION
1.Giới thiệu Lua. Lệnh gán
Một trong những lí do mà phần lớn ''dân'' kĩ thuật ngại lập trình là vì những ngôn ngữ mới (C#, Java) dựa trên một hệ thống (framework) thư
viện rất đồ sộ. Thật vậy, bạn có thể xây dựng những chương trình có giao diện rất đẹp, với hệ thống cơ sở dữ liệu hiện đại, hay dựa trên các
công nghệ web mới nhất Nhưng đó chỉ là những phần thưởng riêng cho ''dân'' ngành IT, những người mà số dòng mã lệnh viết trong một năm
cũng nhiều như số dòng trong bản báo cáo thuyết minh nộp cho đối tác vậy. Rõ ràng, việc trang bị cho mình một cặp kính cận > 5 đi-ốp và một
quyển sổ tay lập trình ngôn ngữ X. luôn kè kè trên bàn máy tính là rất không khả thi !
Với người dân kĩ thuật (thủy lợi, xây dựng, giao thông ), tính linh động là quan trọng. Nhiều bài toán kĩ thuật trong thực tế cần được tính toán
sơ bộ một cách nhanh nhất, hiệu quả nhất. Lập trình? Tất nhiên là cần thiết rồi. Nhưng lập trình như thế nào cho hiệu quả nhất khi ta phải bắt
đầu từ một dòng mã lệnh đầu tiên ? Lua là một giải pháp hứa hẹn.
Ngôn ngữ lập trình Lua (đọc là Lu-a) ra đời năm 1993 tại Đại học PUC-Rio, Rio de Janeiro, Brazil. Hiện nay (chương trình) Lua cũng là một
phần mềm tự do: người dùng có quyền tự do download, gửi cho bạn bè, viết phần mềm từ Lua phục vụ cho mục đích bất kì: học tập, nghiên
cứu, thương mại, kể cả viết các trò chơi (một trong những thế mạnh của ngôn ngữ này). Lua được đánh giá là một ngôn ngữ thông dịch có tốc
độ vào loại nhanh nhất. Một số kết quả so sánh với ngôn ngữ Perl (thuộc vào dạng thông dịch nhanh) có thể được xem tại :
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all=lua&lang2=perl
Bạn có thể hình dung mức độ nhỏ gọn của Lua khi download phiên bản chạy trên Windows từ
http://luaforge.net/frs/download.php/3134/lua5_1_3_Win32_bin.zip
Một file nén < 600 KB chứa các file exe để chạy chương trình. Không cần phải cài đặt, điều này rất tiện. Chẳng hạn khi ta muốn chạy chương
trình viết từ ở nhà, trên một máy tính khác mà ta không được quyền admin.
Trong chớp mắt, bạn đã download được file Lua (lua5_1_3_Win32_bin.zip). Giải nén vào một thư mục như C:\Lua. Click vào file lua5.1.exe.
Dấu nhắc lệnh, với hình một kí hiệu lớn hơn, sẽ hiện ra:
CODE
Lua 5.0.3 Copyright (C) 1994-2006 Tecgraf, PUC-Rio
>
Bây giờ hãy thử một số lệnh nhé. Lệnh cơ bản nhất là lệnh gán, nó giống như trong (Visual)BASIC
CODE
> x = 5
>
Như vậy câu lệnh đúng, máy không báo lỗi và giá trị 5 được lưu vào trong biến x.
Khoan đã, hình như ta thiếu một bước gì đó? Khai báo biến, sao lại không khai báo biến x là số nguyên?
Câu trả lời: ngay khi Lua gặp lệnh gán thì nó sẽ căn cứ vào giá trị (ở đây là 5) mà quyết định rằng biến x có kiểu số chứ không phải kiểu chữ.
Đặc điểm này tỏ ra rất có lợi: ta sẽ tiết kiệm được công gõ lệnh mà không sợ nhầm lẫn gì, vì trong kĩ thuật ta vẫn quy định mỗi biến có kiểu
riêng của nó, không thay đổi được.
Một số lệnh gán tiếp theo tỏ ra rất bình thường:
CODE
> y = 1.4 ^ 2
> z = x + y
1. Điều gì sẽ xảy ra nếu ta không viết vế trái của lệnh gán? Riêng trong trường hợp ta đang chạy trên dấu nhắc lệnh ( > ) thì máy sẽ
không báo lỗi. Thay vì vậy, nó sẽ hiểu rằng kết quả tính được ở vế phải không lưu vào biến nào cả mà sẽ in ra màn hình.
CODE
> = z
6.96
Điểm đặc biệt thứ hai là: một loạt các giá trị bạn có thể được gán bằng một lệnh gán duy nhất. Kết quả là các biến vế trái (phân cách bởi dấu
phảy) được gán với giá trị lần lượt ở vế phải:
CODE
> m, n = 8, 6
> = m
8
> = n
6
Luyện tập 1. Lệnh gán sau đây có lỗi không? Kết quả chứng tỏ máy thực hiện như thế nào?
CODE
> a, b, c = 1, 2, 3, 4
Luyện tập 2. Tựa như các lệnh ở trên ta đã viết, liệu ta có thể viết một lệnh gói gọn như sau không? Tại sao?
CODE
> xx, yy, zz = 5 , 1.4^2 , xx + yy
Bạn tự thực hiện các phép tính trên dấu nhắc lệnh Lua. Cuối cùng hãy thử làm Qu!z sau đây:
Qu!z 1. Để tính lưu lượng trong sông các kĩ sư vẫn thường dùng công thức
Tự chọn một giá trị độ nhám từ 0.02 đến 0.04, độ sâu (bán kính thủy lực) từ 2 đến 3, độ dốc từ 0.0001 đến 0.0003. Tính ra Q. Hãy reply lại quá
trình bạn đã làm trên Lua (câu lệnh + kết quả) !
Trang chủ của Lua: www.lua.org.
Hướng dẫn người mới học http://lua-users.org/wiki/TutorialDirectory
Sổ tay Lua (Tiếng Anh): http://www.lua.org/manual/5.1/.
Bài Viết Về Các Kiểu Trong Lua
Đây là phần giới thiệu về 8 kiểu giá trị cơ bản trong Lua: number, string, boolean, table, function, nil, userdata, thread. Mỗi phần giới thiệu 1
kiểu khác nhau.
Chúng ta sẽ sử dụng hàm print() để xuất ra các giá trị hoặc các tính toán trên các giá trị đó. Dấu ngoặc () quanh các trị số rất quan trọng, nếu
thiếu sẽ gây ra lỗi.
> print(2) xuất ra số 2.
2
> print("hello") xuất ra chuỗi hello.
hello
Các số (numbers)
Lua cho phép các phép tính đơn giản trên các số thông qua việc sử dụng các toán tử thông dụng để cộng, trừ, nhân và chia.
> print(2+2)
4
>print(2-7)
-5
> print(7*8)
56
> print(7/8)
0.875
Chú ý rằng các số không được làm tròn thành số nguyên, đó là các số thực. Chúng ta có thể gán các giá trị cho các biến nhờ dùng toán tử =.
> x = 7
> print(x)
7
Biến x được tạo khi được gán số 7. Dùng hàm print() để xuất giá trị của x. Giờ chúng ta có thể sử dụng giá trị trong x cho các tính toán khác.
> x = x * 9
> print(x)
63
> print(x*2) –- sẽ không thay đổi giá trị của x
126
> print(x)
63
Chú ý cách mà print(x*2) không thay đổi giá trị của x vì x không được gán qua toán tử = trong khi x = x * 9 là nhân giá trị hiện tại của x (là 7)
cho 9 và lưu giá trị mới vào x 1 lần nữa.
Các chuỗi (Strings)
Lua cũng sử dụng các kiểu chuỗi (ví dụ text):
> print("hello")
hello
Chúng ta có thể gán các chuỗi cho các biến giống như cách làm với các số:
> who = "Lua user"
> print(who)
Lua user
Chúng ta có thề nối các chuỗi lại với nhau qua toán tử giữa 2 chuỗi.
> print("hello ")
hello
> print("hello " who) – biến “who” được gán ở trên
hello
Lua user
> print(who)
Lua user
Chú ý rằng toán tử không thay đổi giá trị của mẩu tin nếu không sử dụng toán tử = (cũng như các số).
> message = "hello " who
> print(message)
hello Lua user
Không như 1 số ngôn ngữ khác, bạn không thể sử dụng toán tử cộng để nối các chuỗi. Ví dụ như lỗi trong dòng lệnh dưới đây:
> message = "hello " + who
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
stdin:1: in main chunk [C]: ?
Luận lý (Boolean)
Các giá trị luận lý có 1 trong 2 giá trị là true hoặc false. Nếu 1 giá trị không phải là true thì nó sẽ phải là false và ngược lại. Toán tử not có thể
được đặt trước 1 giá trị luận lý để phủ định (hay đảo ngược) nó. Ví dụ not true đồng nghĩa với false.
> x = true
> print(x)
true
> print(not x)
false
> print(notfalse)
true
Các giá trị luận lý được sử dụng để thể hiện kết quả các kiểm tra logic. Các toán tử bằng == và không bằng ~= sẽ trả lại các giá trị luận lý phụ
thuộc vào các giá trị được cấp.
> print(1 == 0) –- kiểm tra 2 số có bằng nhau không
false
> print(1 == 1)
true
> print(1 ~= 0) –- kiểm tra 2 số không bằng nhau hay không
true
> print(true ~= false) –- true không bằng false?
true
Để biết thêm thông tin về kiểu luận lý trong Lua, hãy đón xem các bài viết sau.
Các bảng (Tables)
Lua có 1 kiểu dữ liệu tổng thể đa dụng (general-purpose aggregate) gọi là 1 Table. Các kiểu dữ liệu tổng thể được sử dụng cho việc lưu trữ các
tập hợp (như các danh sách, các mảng, các thiết đặt, các mảng liên kết). Lua là một ngôn ngữ đơn trong đó các bảng được sử dụng để thể hiện
hầu hết các kiểu tổng thể khác.
Các bảng được tạo sử dụng cặp ngoặc nhọn { } . Chúng ta hãy tạo 1 bảng rỗng:
> x = {}
> print(x)
table: 0035C910
(sẽ là bình thường nếu bảng của bạn không có cùng định danh như trong ví dụ trên.)
Khi chúng ta thể hiện giá trị bảng dùng cách built trong hàm print, Lua chỉ biều diễn đó là 1 bảng và định danh cho bảng đó (ví dụ địa chỉ của
nó trong bộ nhớ). Chúng ta có thể xuất ra nội dung của bảng nhưng sẽ tìm hiểu trong các bài sắp tới.
Chúng ta có thể xây dựng bảng chứa các đối tượng khác, chẳng hạn như các số và các chuỗi được mô tả trong ví dụ dưới đây
> x = { value = 123, text = "hello" }
> print(x.value)
123
> print(x.text)
hello
Chúng ta có thể xuất các giá trị thông qua cú pháp: table.item. Chúng ta cũng có thể đặt các bảng trong các bảng khác.
> y = { const={ name="Pi", value=3.1415927 }, const2={ name="light speed", value=3e8 } }
> print(y.const.name)
Pi
> print(y.const2.value)
300000000
Để biết thêm thông tin về kiểu bảng trong Lua, hãy đón xem các bài viết sau
Các hàm (Functions)
Trong lua, các hàm được gán vào các biến, giống như số và chuỗi. Các hàm được tạo thông qua từ khóa function. Ở đây chúng ta tạo 1 hàm
đơn giản để xuất ra 1 lời chào.
> function foo() print("hello") end –- khai báo hàm
> foo() –- Gọi hàm
hello
> print(foo) –- nhận giá trị của biến "foo"
function: 0035D6E8
Chú ý rằng chúng ta có thể xuất giá trị của biến foo và nó biểu diễn (như các bảng) giá trị là 1 hàm, và có định dạng cho hàm đó. Vậy, là 1 giá
trị như mọi giá trị khác, chúng ta có thể gán các hàm cho các biến.
> x = function() print("hello") end
> x()
hello
> print(x)
function: 0035EA20
Khả năng để làm điều này là vì Lua có các giá trị lớp đầu tiên (first class values). Điều này có nghĩa là tất cả các giá trị được xử lý cùng cách.
Đây chính là 1 đặc điểm rất hữu dụng và mạnh của Lua.
Để thêm thông tin về kiểu hàm trong Lua, hãy đón xem các bài viết sau.
Các giá trị rỗng (nil values)
nil là 1 giá trị đặc biệt chỉ ra “không giá trị” (no value). Nếu 1 biến có giá trị rỗng là nó không có giá trị gán vào, vì thế sẽ không còn tồn tại
(hoặc chưa tồn tại). Bằng việc đặt 1 biến thành rỗng, bạn có thể delete biến. Ví dụ:
> x = 2.5
> print(x)
2.5
> x = nil
> print(x)
nil
Bạn cũng có thể kiểm tra 1 biến có tồn tại hay không thông qua việc kiểm tra giá trị của nó có phải nil hay không.
print(x == nil)
true
> x = 7
> print(x == nil)
false
> print(x)
7
Dữ liệu tự tạo (Userdata)
Các giá trị dữ liệu tự tạo là các đối tượng bên ngoài Lua, như các đối tượng được thực hiện trong C. Xảy ra khi một đối tượng trong 1 thư viện
C được đặt vào Lua. 1 ví dụ của 1 giá trị userdata là 1 xử lý file (file handle). 1 userdata thường được xem như 1 bảng, và bạn có thể loại bỏ
phần lớn sự khác biệt nếu trừ phi đang sử dụng. Muốn tham khảo thêm phần này, đón xem các bài viết sau.
Xâu chuỗi (Thread)
1 giá trị xâu chuỗi thể hiện 1 xâu chuỗi độc lập với việc thực thi. Sẽ bàn sâu hơn trong bài sau.
Dynamic typing
Bạn có thể chú ý khi chúng ta tạo các biến trong các ví dụ trên, chúng ta đã không chỉ ra kiểu biến đang tạo. Ví dụ :
a = 1
b = "hello"
c = { item1="abc" }
Trong các ngôn ngữ khác, như C, chúng ta phải chỉ ra kiểu của 1 biến khi tạo ra nó. Trong Lua, chúng ta có thể gán nhiều kiểu giá trị khác nhau
cho cùng 1 biến, ví dụ
a = 1
a = "hello"
a = { item1="abc" }
Đây được gọi là dynamic typing. Có nghĩa là bạn không phải chỉ ra biến đang thuộc kiểu nào. Biến nhận dạng được kiểu thông qua giá trị, hoặc
đối tượng được gán vào.
Truy vấn kiểu (Querying type)
Vì Lua là 1 ngôn ngữ nội suy, chúng ta có thể dùng hàm type() để lấy ra kiểu của 1 đối tượng cụ thể.
> x = "123" 1 chuỗi
> print(x, type(x)) –- cho ra giá trị của x và kiểu của nó
123 string
> x = x + 7 cộng 1 số vào chuỗi 1 các cưỡng bức
> print(x, type(x)) –- lại cho ra giá trị và kiểu
130 number
Dòng lệnhlua(Lua command line)
Nếu chúng ta chạy thi hành Lua không có các thông số, chúng ta sẽ nhận được mẩu tin và 1 dấu nhắc lệnh >
Lua 5.0 Copyright (C) 1994-2003 Tecgraf, PUC-Rio
>
Tất cả các ví dụ trong bài được đánh tại dấu nhắc lệnh > và được copy paste vào bài.
> print("hello Lua user")
hello Lua user
> print(10*10)
100
Nếu 1 dòng bắt đầu với dấu =, Lua sẽ hiểu dòng đó là 1 diễn đạt. Đây là 1 cách thay thế cho hàm print().
> = "hello Lua user"
hello Lua user
> = 10*10
100
Mục đa dòng (Multiline entry)
Chúng ta có thể gõ các dòng lệnh trên nhiều dòng. Lua sẽ thử ước chừng những gì bạn gõ trên 1 dòng và xác định xem lệnh đó có hoàn tất
chưa. Nếu chưa, một dấu nhắc đôi xuất hiện >> và bạn có thể tiếp tục gõ. Ví dụ:
> print(
>> "Hello lua user"
>> )
Hello lua user
Trong ví dụ trên, print( chưa hoàn tất vì thiếu dấu ngoặc đóng ). Dòng lệnhLua giả thiết bạn phải gõ thêm nữa nên dấu >> được hiển thị. Điều
này tiếp tục cho đến khi hoàn tất statement. Nếu bạn làm 1 lỗi, kết quả sẽ sai. Như dưới đây:
> = 10 *
>> 10 +
>> 5
105
Các Chú thích (Comments)
Chỗ nào bạn thấy " ", theo sau là text, đây là các comment (bình luận, chú thích). Mọi thứ theo sau sẽ bị bỏ qua khi chạy chương trình.
> = 1+1 cái này bỏ qua
> = 1+1 no comment
stdin:1: <eof> expected near `no'
Chú thích: Dòng báo lỗi trên, bạn không được gõ comment vào! Các comment chủ yếu làm cho chương trình rõ ràng hơn.
Gán Giá Trị
Gán các giá trị (Assigning values)
Việc đặt giá trị của 1 biến được gọi là gán giá trị: (assignment):
> x = 1
> y = "hello"
> print(x,y)
1 hello
Đa Gán, Gán bội (Multiple assignment)
Trong Lua, chúng ta có thể tiến hành gán nhiều giá trị trong 1 phát biểu (statement). Ví dụ
> x, y = 2, "there"
> print(x,y)
2 there
Danh sách các giá trị bên phải được gán cho danh sách các biến bên trái dấu =. Chúng ta có thể gán bao nhiêu giá trị tùy thích và chúng không
nhất thiết phải cùng kiểu, ví dụ:
> a,b,c,d,e,f = 1,"two",3,3.14159,"foo",{ this="a table" }
> print(a,b,c,d,e,f)
1 two 3 3.14159 foo table: 0035BED8
Các giá trị bên phải của dấu = có thể là những biểu thức như i+1, nhưng những giá trị bên trái thì không thể.
Đa gán có 1 số hình thức sau:
Tính toán trước khi gán (Evaluation occurs before assignment)
Mọi biểu thức được tính toán trước, sau đó mới được gán.
> i = 7
> i, x = i+1, i
> print(i, x)
8 7
Khi Lua chạy đến dòng thứ 2, nó tính toán biểu thức i + 1 và i trước những cái khác. Sau khi tính toán, dòng thứ 2 sẽ thành i, x = 8, 7. Sau đó
nó tiến hành gán giá trị từ phải qua trái. (xem phía dưới về thứ tự gán)
Hoán chuyển các giá trị (Swapping values)
Vì các giá trị được gán gần như đồng thời, nên bạn có thể sử dụng đa gán để hoán đổi các giá trị biến với nhau.
> a,b = 1,2 đặt giá trị ban đầu
> print(a,b)
1 2
> a,b = b,a hoán đổi lẫn nhau
> print(a,b)
2 1
> a,b = b,a và làm lần nữa
> print(a,b)
1 2
Chú ý rằng không cần đến 1 biến tạm thời (như là bold = b; b =a; a = bold như trong ngôn ngữ C.
Thứ tự gán (Assignment order)
Thứ tự trong đa gán là không xác định. Có nghĩa là bạn không nên cho rằng các phép gán được tiến hành từ trái qua phải; nếu cùng biến hoặc
bảng tham chiếu xuất hiện 2 lần trong danh sách gán, bạn có thể sẽ ngạc nhiên về kết quả.
> a, a = 1, 2
> print(a)
1
Trong ví dụ trên, Lua đã gán từ phải qua trái, a = 2 và sau đó a =1, nhưng chúng ta không nên phụ thuộc vào dạng này trong các phiên bản tiếp
theo của Lua. Nếu thứ tự gán là quan trọng thì bạn nên sử dụng các phát biểu gán riêng biệt.
Trường hợp đặc biệt, xem các phát biểu sau. Nếu i == j, 2 phát biểu này có thể làm khác nhau:
> table[i], table[j] = table[j], table[k]
> table[j], table[i] = table[k], table[j]
Nên viết thành 2 phát biểu riêng. Điều này luôn hoán chuyển 2 giá trị, qua:
> table[i], table[j] = table[j], table[i]
Kích thước danh sách không trùng khớp (Mismatched list sizes)
Nếu 1 danh sách giá trị dài hơn danh sách biến thì những giá trị dư sẽ bị bỏ qua.
> a,b,c = 1,2,3,4,5,6
> print(a,b,c)
1 2 3
Nếu 1 danh sách giá trị ngắn hơn danh sách biến, Lua sẽ gán giá trị rỗng (nil) cho các biến không có giá trị.
> a,b,c,d = 1,2
> print(a,b,c,d)
1 2 nil nil
Bài viết về các số
Giới thiệu
Một số ngôn ngữ hỗ trợ 1 hoặc nhiều các kiểu số mặc định sau:
Số nguyên (Integer )
Số nguyên chính xác vô hạn (Unlimited precision integer )
Chấm động có độ chính xác đơn (Single precision floating point)
Chấm động có độ chính xác đôi (Double precision floating point)
Các số phức (Complex numbers)
Để đơn giản, Lua chỉ hỗ trợ chỉ 1 kiểu số đó là các số chấm động (floating point numbers). Mặc định là các số chấm động có độ chính xác đôi
(Double precision floating point numbers – Double) nhưng Lua có thể dễ dàng biên dịch lại để hỗ trợ các số chấm động có độ chính xác đơn
(single precision floating point numbers – Single) như bạn mong muốn. Nếu bạn xa lạ với các số chấm động, tui xin giải thích sơ như thế này:
Các số thực là các số có chứa phần thập phân, giữa phần thập phân và phần nguyên ngăn cách bởi dấu chấm (decimal point – US).Thuật ngữ
dấu chấm động bắt nguồn từ thực tế là không có số con số cố định trước hoặc sau dấu chấm phân cách thập phân, nên dấu chấm có thể động.
(do người Mỹ dùng dấu chấm phân cách thập phân nên mới gọi chấm động, người VN chắc sẽ dùng phẩy động). Nó khác với số nguyên là các
số chấm cố định (fixed point numbers) do số chữ số sau dấu chấm luôn = 0.
Còn Single và Double? Khi biểu diễn các số chấm động người ta dùng số lượng bit để giữ phần thập phân, càng nhìu bit dc sử dụng thì kết quả
biểu diễn càng chính xác. Double là sử dụng số bit gấp đôi so với single vì thế nên phạm vi biểu diễn rộng hơn và độ chính xác cao hơn single.
Muốn coi kỹ hơn về cái này các bạn có thể tham khảo thêm ở : http://www.webopedia.com/TERM/p/precision.html
Lỡ nói nói luôn, số phức (complex numbers) là phần mở rộng của số thực thu được qua việc nối một đơn vị ảo (imaginary unit) ký hiệu là i và
thỏa mãn : i^2 = -1. Mọi số phức được biểu diễn dưới dạng a + bi trong đó a, b là các số thực được gọi là phần thực và i là phần ảo.
Số nguyên (Integer) thì chắc ai cũng bit rùi, là tập hợp các số tự nhiên bao gồm số 0 và phần âm của chúng. Số nguyên khi viết sẽ không có
phần thập phân.
Sử dụng các số
Chúng ta có thể sử dụng dòng lệnhLua để tính toán thông qua các biểu thức ví dụ
Lua 5.1 Copyright (C) 1994-2006 Lua.org, PUC-Rio
> = 1
1
> = 1 + 2
3
> = 3.1415927
3.1415927
> = 5 / 6
0.83333333333333
Chúng ta có thể nhập số và thực hiện các phép tính đơn giản. Lua cũng có thể hiểu các kiểu số mũ trong các số biểu diễn dưới dạng <giá trị> *
10^ <số mũ>
> = 1.2345e6
1234500
> = 543.21E8
54321000000
> = 2.56e-4
0.000256
Chúng ta có thể gán các số cho các biến và thực hiện phép tính:
> width = 7.5
> height = 12.7
> = width * height
95.25
> depth = 2.8
> area = width * height
> volume = area * depth
> print(area, volume)
95.25 266.7
Thư viện toán học (The math library)
Lua được trang bị 1 thư viện Toán học với các hàm được cung cấp như sau:
math.abs
Trả về giá trị tuyệt đối hoặc giá trị không âm của giá trị nhận vào.
> = math.abs(-100)
100
> = math.abs(25.67)
25.67
> = math.abs(0)
0
math.acos , math.asin
Trả về nghịch đảo cos và sin của giá trị đưa vào.
> = math.acos(1)
0
> = math.acos(0)
1.5707963267949
> = math.asin(0)
0
> = math.asin(1)
1.5707963267949
math.atan , math.atan2
Trả về nghịch đảo tang. Chúng ta có thể được bằng cách cung cấp y/x sử dụng math.atan hoặc có thể truyền y và x vào math.atan2
> c, s = math.cos(0.8), math.sin(0.8)
> = math.atan(s/c)
0.8
> = math.atan2(s,c)
0.8
math.atan2 được ưa chuộng hơn, đặc biệt khi chuyển tọa độ vuông góc sang tọa độ có cực. math.atan2 sử dụng dấu của cả hai tham số để đặt
kết quả vào đúng góc phần tư và cũng tạo ra các giá trị đúng khi 1 trong 2 tham số là 0 hoặc rât gần 0.
> = math.atan2(1, 0), math.atan2(-1, 0), math.atan2(0, 1), math.atan2(0, -1)
1.5707963267949 -1.5707963267949 0 3.1415926535898
math.ceil , math.floor
Trả về số nguyên lớn hơn hoặc nhỏ hơn gần nhất giá trị đưa vào.
> = math.floor(0.5)
0
> = math.ceil(0.5)
1
math.cos , math.sin , math.tan
Trả về giá trị cos, sin và tang của giá trị đưa vào dưới dạng radian.
> = math.cos(math.pi / 4)
0.70710678118655
> = math.sin(0.123)
0.12269009002432
> = math.tan(5/4)
3.0095696738628
> = math.tan(.77)
0.96966832796149
math.cosh , math.sinh , math.tanh
Trả về giá trị cos, sin và tang hyperbolic từ giá trị đưa vào.
> = math.sinh(1)
1.1752011936438
math.deg , math.rad
Chuyển từ radian sang độ và ngược lại.
> = math.deg(math.pi)
180
> = math.deg(math.pi / 2)
90
> = math.rad(180)
3.1415926535898
> = math.rad(1)
0.017453292519943
math.exp , math.log
math.exp() trả về giá trị của e mũ giá trị nhập.
math.log() trả về giá trị logarithm cơ số e của giá trị nhập vào.
> = math.exp(0)
1
> = math.exp(1)
2.718281828459
> = math.exp(27)
532048240601.8
> = math.log(532048240601)
26.999999999998
> = math.log(3)
1.0986122886681
math.log10
Trả về logarithm bậc 10 của 1 số. Số nhập vào phải dương.
> = math.log10(100)
2
> = math.log10(256)
2.4082399653118
> = math.log10(-1)
-1.#IND
math.pow , x^y
math.pow() trả về giá trị của x mũ y, tương tự với toán tử ^. math.pow(x,y) == x^y.
> = math.pow(100,0)
1
> = math.pow(7,2)
49
> = math.pow(2,8)
256
> = math.pow(3,2.7)
19.419023519771
> = 5 ^ 2
25
> = 2^8
256
math.min , math.max
Trả về giá trị nhỏ nhất hay lớn nhất từ các tham số truyền vào.
> = math.min(1,2)
1
> = math.min(1.2, 7, 3)
1.2
> = math.min(1.2, -7, 3)
-7
> = math.max(1.2, -7, 3)
3
> = math.max(1.2, 7, 3)
7
math.modf
Trả về phần nguyên và phần thập phân của số nhập vào.
> = math.modf(5)
5 0
> = math.modf(5.3)
5 0.3
> = math.modf(-5.3)
-5 -0.3
math.sqrt
Trả về giá trị căn bậc 2 của số nhập vào. Chỉ cho phép số không âm.
> = math.sqrt(100)
10
> = math.sqrt(1234)
35.128336140501
> = math.sqrt(-7)
-1.#IND
math.random , math.randomseed
math.random() tạo ra những số ngẫu nhiên. Những tham số truyền vào sẽ thay đổi giá trị xuất:
math.random() không có tham số sẽ tạo ra 1 số thực nằm trong khoảng 0 và 1.
math.random(upper) tạo ra các số nguyên lớn hơn 1.
math.random(lower, upper) tạo ra các số nguyên nằm trong khoảng giữa lower và upper.
= math.random()
0.0012512588885159
> = math.random()
0.56358531449324
> = math.random(100)
20
> = math.random(100)
81
> = math.random(70,80)
76
> = math.random(70,80)
75
upper và lower phải là số nguyên.
Hàm math.randomseed() đặt một seed cho việc tạo số ngẫu nhiên. Các seed bằng nhau sẽ cho các chuỗi số bằng nhau.
> math.randomseed(1234)
> = math.random(), math.random(), math.random()
0.12414929654836 0.0065004425183874 0.3894466994232
> math.randomseed(1234)
> = math.random(), math.random(), math.random()
0.12414929654836 0.0065004425183874 0.3894466994232
Một seed tốt là os.time(), nhưng phải chờ 1 giây trước khi gọi hàm để thu được 1 trình từ khác! Để lấy được số ngẫu nhiên đẹp dùng:
math.randomseed( os.time() )
math.frexp , math.ldexp
Đây là những hàm chuẩn hóa. Hàm math.frexp() được sử dụng để tách giá trị số thành 1 phần nguyên chuẩn và 1 số mũ. 2 giá trị được trả về:
giá trị đầu nằm trong khoảng ½ đến 1 và giá trị thứ 2 là một số mũ. Hàm math.ldexp() lấy 1 giá trị chuẩn và trả về biểu hiện chấm động. đây là
giá trị được nhân cho 2 mũ số mũ.
> = math.frexp(2)
0.5 2
> = math.frexp(3)
0.75 2
> = math.frexp(128)
0.5 8
> = math.frexp(3.1415927)
0.785398175 2
> = math.ldexp(0.785,2)
3.14
> = math.ldexp(0.5,8)
128
math.huge
math.huge là 1 hằng số, biểu diễn +vô cực.
> = math.huge
inf
> = math.huge / 2
inf> = -math.huge
-inf
> = math.huge/math.huge indeterminate
nan
> = math.huge * 0 indeterminate
nan
> = 1/0
inf
> = (math.huge == math.huge)
true
> = (1/0 == math.huge)
true
Chú ý rằng một số toán tử trên math.huge trả về giá trị đặc biệt không phải là 1 số được biểu diễn là nan. Nan là 1 kiểu số, khác các kiểu số
khác:
> = type(math.huge * 0)
number
math.pi
Đây là hằng số PI.
[...]... string.sub("Hello Lua user", 7) từ chữ thứ 7 cho đến hết chuỗi Lua user > = string.sub("Hello Lua user", 7, 9) từ chữ thứ 7 đến chữ thứ 9 Lua > = string.sub("Hello Lua user", -8 ) chữ thứ 8 tính từ cuối đến hết Lua user > = string.sub("Hello Lua user", -8 , 9) chữ thứ 8 tính từ cuối đến chữ thứ 9 tính từ đầu Lua > = string.sub("Hello Lua user", -8 , -6 ) - chữ thứ 8 tính từ cuối đến chữ thứ 6 tính từ cuối Lua. .. chuỗi s, mặc định là 1 >= string.match("foobarfooo","foo(.*)fooo") - trả về các chữ nằm giữa foo và fooo bar string.rep(s, n) s:rep(n) Tạo ra chuỗi từ việc nối n bản sao của chuỗi truyền vào > = string.rep( "Lua ",5) Lua LuaLuaLuaLua > = string.rep( "Lua\ n",3) LuaLuaLua string.reverse(s) s:reverse(s) Đảo ngược chuỗi > = string.reverse( "lua" ) aul string.sub(s, i [, j]) s:sub(i [,j]) Trả về chuỗi con của... "Lua user!") chuỗi và chuỗi được đóng ngoặc Hello "Lua user!" > = string.format("%c%c%c", 76,117,97) ký tự Lua > = string.format("%e, %E", math.pi,math.pi) số mũ 3.141593e+000, 3.141593E+000 > = string.format("%f, %g", math.pi,math.pi) động (float) và động rút gọn (compact float) 3.141593, 3.14159 > = string.format("%d, %i, %u", -1 00 ,-1 00 ,-1 00) số nguyên có dấu, có dấu, không dấu -1 00, -1 00,... thể được gán vào các biến 1 cách dễ dàng, ví dụ, >x=7 > print(x) 7 >=7 7 Các biểu thức toán học (Arithmetic expressions) Lua có các toán tử nhị phân thông dụng > = 2+3, 5-1 2, 2*7, 7/8 5 -7 14 0.875 > = 5*( 2-8 .3)/77.7+99.1 98.694594594595 Phủ định đơn nguyên: > = -( -1 0), -( 10) 10 -1 0 Lũy thừa: > = 7^2, 107^0, 2^8 49 1 256 Các biểu thức tương quan (Relational expressions) Các biểu thức tương quan được... trên chuỗi, init có bắt đầu là 1 và có thể là số âm (sẽ đếm ngược từ cuối chuỗi trở lên) > = string.find("Hello Lua user", "Lua" , 1) bắt đầu từ chữ đầu tiên 79 > = string.find("Hello Lua user", "Lua" , 8) "Lua" không được tìm thấy sau chữ thứ 8 nil > = string.find("Hello Lua user", "e", -5 ) "e" đầu tiên tính từ ký tự thứ 5 từ cuối đếm lên 13 13 Tham số patern cũng có thể cho phép những tìm kiếm... (tên biến) Tìm kiếm trong bảng được thực hiện rất nhanh trong Lua nhưng vẫn không nhanh bằng tìm kiếm đăng ký cục bộ Nếu đoạn code sau được biên dịch, chúng ta có thể xem Lua virtual machine instructions được xuất ra g = "global" local l = "local" print(g,l) Công cụ lệnh luac (Lua compiler) có thể được sử dụng để biên dịch code, cho ra: main (8 instructions, 32 bytes at 0x671420) 0+ params,... language= "Lua" , version="5.1", 8,10,12, web="www .lua. org" } Do tính gượng ép số/chuỗi, hãy cẩn thận khi xuất các khóa Ví dụ: > t = {}; t[1] = "a"; t["1"] = "b" > for k,v in pairs(t) do print(k,v) end 1a 1b Tất nhiên, lệnh type(k) sẽ cho các thông tin khác nhau trong cả hai trường hợp Lưu ý về các khóa (Notes about table keys) Lua lưu trữ tất cả các phần tử trong các bảng theo cặp khóa – giá trị (key-value) Lua. .. ví dụ > = 'hello "Lua user"' hello "Lua user" > = "Its [[content]] hasn't got a substring." Its [[content]] hasn't got a substring > = [[Let's have more "strings" please.]] Let's have more "strings" please Cặp ngoặc vuông cũng có 1 vài tính năng đặc biệt khác, sẽ bàn sau Các trình tự ngắt (Escape sequences) Lua cũng có các trình tự thoát giống như C > = "hello \ "Lua user\"" hello "Lua user" > = 'hello\nNew... -1 00, -1 00, 4294967196 > = string.format("%o, %x, %X", -1 00 ,-1 00 ,-1 00) octal, hex, HEX 37777777634, ffffff9c, FFFFFF9C string.gmatch(s, pat) s:gmatch(pat) Trả về 1 chuỗi thỏa pat thông qua vòng lặp Vòng lặp sẽ tìm hết chuỗi truyền vào theo gợi ý của pat bạn truyền vào > for word in string.gmatch("Hello Lua user", "%a+") do print(word) end HelloLuauser Về các pattern (mẫu) và vòng lặp for sẽ nói cụ... banana", "banana", "Lua user") Hello Lua user 1 > = string.gsub("banana", "a", "A", 2) giới hạn số lần thay là 2 bAnAna 2 Như string.find(), chúng ta có thể sử dung các biểu thức thông thường để tìm trong chuỗi Nếu sử dụng 1 capture có thể tham khảo cách thay chuỗi sử dụng cú pháp %capture_index, ví dụ > = string.gsub("banana", "(an)", "% 1-" ) bắt giữ mọi chữ "an" và thay thế ban-an-a 2 > = string.gsub("banana", . truyền vào.
> = string.rep(" ;Lua ",5)
Lua Lua Lua Lua Lua
> = string.rep(" ;Lua n",3)
LuaLuaLua
string.reverse(s)
s:reverse(s). %u", -1 00 ,-1 00 ,-1 00) số nguyên có dấu, có dấu, không dấu
-1 00, -1 00, 4294967196
> = string.format("%o, %x, %X", -1 00 ,-1 00 ,-1 00) octal,