Oct 8, 2012

Làm quen với Jython (phần 2 - các lệnh đơn)

Tiếp theo phần 1, phần 2 này chúng ta bắt đầu ngay với việc viết cú pháp 
Đặc điểm cú pháp trong Jython script
  • Line feed (ngắt dòng): bình thường trong các ngôn ngữ lập trình hay gặp thì dấu chấm phảy (semicolon ;) được sử dụng để ngắt dòng logic. Tuy nhiên giống như các ngôn ngữ script như linux shell, Jython không sử dụng ký tự kết thúc dòng, mà mỗi dòng lệnh mặc định kết thúc khi có một ký thự ngắt dòng (carriage return)
  •  Semicolon (chấm phảy): không được sử dụng để ngắt dòng. Chú ý với lệnh print, nó tự chèn thêm xuống dòng.
  • Backslash (\): có thể được sử dụng để nối các dòng dài của một lệnh logic
  • open grouping: việc sử dụng các dấu ngoặc (), [], {} cần chú ý rằng, mọi thứ nằm trong một cặp ngoặc dù trên nhiều dòng, thì đều được coi là một dòng.
  • triple quotes (cặp 3 dấu nháy): cặp ba dấu nháy ''' hay """ cho phép bao đóng một string nhằm bỏ qua các dấu nháy xuất hiện bên trong hoặc các ký tự ngắt dòng bên trong đó.
  • Code block (khối lệnh): Jython không sử dụng cặp ngoặc {} để nhóm một khối các lệnh logic, mà sử dụng căn lề (indention) để phân nhóm cấp độ (level) của từng khối xử lý. Mỗi cấp phân biệt bởi một tab lùi đầu dòng (có thể ứng với 4 dấu cách)
  • Comment: Jython sử dụng dấu # để đánh dấu chuỗi comment



Các lệnh
lệnh đơn
các lệnh đơn trên Jython được viết bởi một mệnh đề đơn, phạm vi trong một dòng logic. Các lệnh này có thể gây nhầm lẫn với các hàm cung cấp sẵn. Các lệnh gồm có các hàm hay các đối tượng đều có giới hạn trong namespace của nó.
assert
Kiểm tra tính đúng sai của biểu thức, nếu sai trả về exception. Nếu có hai biểu thức được sử dụng thì biểu thức thứ hai được sử dụng làm tham số để trả về thông in AssertException. Thiết lập __debug__=0 hoặc option -o ở dòng lệnh sẽ vô hiệu các assert.
Cú pháp:
assert expr [, expr]

Các phép gán
Ngoài phép gán = thì các phép toán được sử dụng cho phép gán gồm có  + =, -=, *=, /=, * * =, %=, < < =, > > =, &=, |=, ^=.
var_name assigment_operator value
Ví dụ
>>> myvar=3

>>> myvar +=5

>>> print myvar
8

>>> 


Lệnh break
Chức năng tương tự như trên các ngôn ngữ khác, nó ngắt luồng thực thi của khối lặp và tiếp tục thực hiện lệnh phía sau khối lặp.
>>> mylist = ['my', 'name','is','cuong','pham']

>>> for index in mylist:                       

...     if index == 'is':                      

...         break

...     print index

... 

my

name

>>> 


lệnh continue
ngắt xử lý ở vòng lặp hiện thời, tiếp tục lặp với phần tử tiếp theo
Sử dụng lại ví dụ ở trên.
>>> for index in mylist:

...     if index == 'cuong':

...         continue

...     print index

... 

my

name

is

pham

>>> 


Lệnh del
lệnh del có tác dụng xóa một biến đã được khai báo, biến này có thể nằm trong namespace hiện thời hoặc là một giá trị cụ thể nào đó của list hoặc dictionary. Có thể sử dụng lệnh này để xóa các khai báo biến tạm.
Ví dụ:
>>> mylist = ['my', 'name','is','cuong','pham']

>>> del mylist[3]

>>> for index in mylist:

...     print index

... 

my

name

is

pham

>>> 


Lệnh exec
lệnh này được dùng để thực thi một đoạn code Jython. Lệnh này đòi hỏi phải có biểu thức đóng vai trò tham số, biểu thức này biểu diễn đoạn code nó cần thực thi. Biểu thức này có thể là một string, một đối tượng file, hay một đối tượng code.
Nếu có hai tham số được cung cấp cho exec() thì tham số thứ hai được coi là global directories mà đoạn code được thực thi. Nếu có ba tham số được truyền thì tham số thứ nhất là từ điển, tham số thứ hai là global namespace mà đoạn code được thực thi.
Ví dụ
>>> exec('''print "my"''')

my

>>>


Lệnh global

lệnh này chỉ dẫn cho bộ parser (phân tích cú pháp) sử dụng các định danh (identifier) được chỉ định với phạm vi global. Nói cách khác việc này tương đương với khai báo một biến toàn cục.
Xét các ví dụ minh họa sau để thấy tác dụng của lệnh global.
>>> global_var = 20

>>> def test():

...     print global_var #that is global variable

... 

>>> test()

20

>>> 

Thêm một tham chiếu tới biến global_var ở trên và kiểm tra kết quả:
>>> global_var = 20

>>> def test():

...     print global_var # this is still global ?

...     global_var = 15

... 

>>> test()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "<stdin>", line 2, in test

UnboundLocalError: local variable 'global_var' referenced before assignment

>>> 

    Trong ví dụ này, global_var được coi là một local variable. Tại sao lại xảy ra hiện tượng này ? Hãy nhớ lại cách thức jython xử lý kiểu và biến, tất cả đều được xử lý lúc runtime (bởi không có quá trình compile). Trong quá trình phương thức test() được gọi thực thi, nó sẽ được xử lý, trong thân của nó, có một phép gán tới biến global_var, do đó global_var trong phạm vi test() sẽ được coi là local variable. Với câu lệnh print, biến global_var lúc đó chưa được định nghĩa, gán giá trị do đó một exception trả về.

    Để giải quyết vấn đề này, ta sẽ sử dụng lệnh global như sau:
>>> def test2():

...     global global_var # indicate that global_var is on global scope

...     print global_var  # global_var is still global

...     global_var = 30   # change it's value

... 

>>> test2()

20

>>> print global_var

30

>>>

Lệnh import
     Lệnh này cho phép xác định các class có sẵn đặt chúng vào scope đang xử lý và sẵn sàng cho việc triệu gọi để sử dụng. Khác biệt so với Java đó là ta có thể đổi tên (dạng như Alias) các class được import thành tên mình muốn.
     Cú pháp:
import module_name
vd: import javax.swing
from module_name import names
vd: from java.utils import Scanner
from javax.swing import JFrame, JLabel
import module_name as new_name
vd: import javax.swing import JFrame as EnhancedFrame

Lệnh pass
    Lệnh này đơn giản như là một placeholder để giữ chỗ, không thực hiện bất cứ một xử lý nào.

Lệnh print
    Lệnh này sẽ ước lượng một biểu thức, chuyển đổi chúng sang dạng string nếu cần, và đẩy kết quả ra sys.stdout hoặc một object nào đó dạng file được chỉ định với toán tử >>
ví dụ:
print expression

print >> myfileobject, expression

Lệnh raise
    Lệnh này sẽ ước lượng các biểu thức được cung cấp vào và đẩy ra một exception
cú pháp: raise [expression [, expression [,traceback]]]

Lệnh return
    Lệnh này sẽ kết thúc việc thực thi của một phương thức hoặc một hàm, ước lượng kết quả của biểu thức được cung cấp và trả về giá trị của biểu thức đó.
cú pháp: return [expression]

 Kết thúc phần 2. Xin mời đón xem Phần 3 - các lệnh phức hợp

No comments:

Post a Comment