3-BẢNG MÃ LỖI CỦA CÁC HÃNG ĐIỀU HÒA .pdf - ĐIỆN LẠNH BÁCH KHOA HÀ NỘI
Lý Thuyết Và Bài Tập Thực Hành Golden Common Lisp - ĐH Bách Khoa TP.HCM
1. BK
TP.HCM
BK
TP.HCM
ĐẠI HỌC BÁCH KHOA TPHCM
KHOA CÔNG NGHỆ THÔNG TIN
LÝ THUYẾT VÀ BÀI TẬP THỰC HÀNH
GOLDEN COMMON LISP
TPHCM, Tháng 10 – 2004
MÔN HỌC : NGÔN NGỮ LẬP TRÌNH
2. LÝ THUYẾT VÀ BÀI TẬP THỰC HÀNH
GOLDEN COMMON LISP
3. Mục lục
LÝ THUYẾT VÀ BÀI TẬP THỰC HÀNH GOLDEN COMMON LISP....................................................1
LÝ THUYẾT VÀ BÀI TẬP THỰC HÀNH GOLDEN COMMON LISP....................................................2
Mục lục.................................................................................................................................................3
Lý thuyết LISP......................................................................................................................................1
I. Giới thiệu............................................................................................................................................ 1
II. Cài đặt và sử dụng gcLisp...............................................................................................................1
III. Đặc điểm của gcLisp.......................................................................................................................3
IV. Lập trình với gcLisp........................................................................................................................5
V. Nâng cao.........................................................................................................................................17
VI. Tổng kết.........................................................................................................................................20
4. Lý thuyết LISP
I. Giới thiệu
- LISP – ngôn ngữ lập trình có tên lấy từ List Processing.
- Vào mùa hè năm 1956, Allen Newell, J.C. Shaw, và Herbert Simon đã phát triển xử lý
Lisp (Lisp processing) và tạo nên ngôn ngữ xử lý thông tin IPL (Information
Processing Language) – ngôn ngữ trừu tượng thao tác trên symbols và danh sách.
- Khi FORTRAN được xây dựng, McCarthy thiết kế một ngôn ngữ mới – LISP (Lisp
Processor), lấy từ ý tưởng của IPL, FORTRAN và FLPL chạy trên IBM704
- Vào thập niên 70, Guy Steele và Gerald Sussman định ra Scheme, kết hợp Algol và
Lisp
- Vào đầu thập niên 80, có khoảng 12 hệ Lisp khác nhau. Các hệ Lisp này không tương
thích nhau. Do đó, một dự án nhằm định ra một ngôn ngữ Lisp chung nhất đã hình
thành – dự án này sẽ kết hợp những đặc tính tốt nhất của các hệ Lisp thời đó vào một
thể thống nhất
- Phiên bản đầu tiên của Common Lisp chuẩn ra đời năm 1984 – kết hợp nhiều ý tưởng
của ngôn ngữ lập trình như thông dịch và biên dịch hàm, dọn rác (garbage collection),
gọi hàm đệ quy, theo vết và dò lỗi (tracing and debugging) và trình soạn thảo theo cú
pháp.
II. Cài đặt và sử dụng gcLisp
II.1 Cài đặt
- Chép tập tin GC LISP.rar vào và giải nén ra thư mục GC LISP
- Vào thư mục GC LISP, chạy tập tin caidat.bat để cài gcLisp vào đĩa cứng
- Vào thư mụcC:Gclisp, chạy tập tin Gclisp.exe để bắt đầu.
II.2 Môi trường Gclisp
Chúng ta sẽ thấy cửa sổ gclisp như sau:
Trang 1
5. II.3 Phím nóng
- <Alt>-H to get help
- <Alt>-E to enter the LISP Explorer
- <Ctrl>-E to enter the editor
- <F1> to exit editor into Lisp Environment
- <F8> to load a file into the editor
- <F9> to save a file
- <F10> to save a file as another name
II.4 Dòng lệnh
Đánh các dòng lệnh theo sau ký hiệu *
II.5 Lệnh tiền tố (Prefix command)
- Mọi lệnh đều nằm giữa dấu ngoặc đơn ( )
- Lisp sẽ đánh giá khi chúng ta đánh dấu ) cuối cùng
Trang 2
(function <parameter>)
6. - Lệnh có dạng tiền tố:
II.6 Load file vào gclisp
- Ví dụ: load first.lsp
III. Đặc điểm của gcLisp
III.1 Các đặc tính của ngôn ngữ
- Từ khi được John McCarthy (MIT) nghĩ ra năm 1958, LISP được tinh chế dần đến
version 1.5 và được sử sụng lâu dài về sau
- Lisp là ngôn ngữ hướng chức năng (functional language hay applicative), dùng lối ký
hiệu tiền tố (prefix) và dấu ngoặc đơn:
f(x,y, z) được ký hiệu là (f x y z)
Cũng như vậy x+y ký hiệu là (+ x y)
Bt.
+
2
3
sin
π
x viết trong Lisp như thế nào ?
( ) ( )
( )
( )
2
/
3
*
sin pi
x
+
- Lisp là ngôn ngữ thông dịch (interpreted language)
Trang 3
Ngôn ngữ biên dịch
câu lệnh (instructions)
biên dịch
chương trình thực thi
thực thi
kết quả
Ngôn ngữ thông dịch
Biểu thức
đánh giá
trả lời
Kết quả
* (load ‘first)
7. Ví dụ:
*(+ 3 4)
7
*(+ (* 3 4)(- 5 2))
15
*4
4
III.2 Kiểu dữ liệu
Lisp là ngôn ngữ đặc trưng cho việc xử lý danh sách
Chương trình được biểu diễn bằng các danh sách và có thể thao tác trên đó như dữ liệu
(+ (* 3 4) (- 5 2))
chương trình: hàm + áp dụng vào hai đối số
dữ liệu: danh sách gồm ba thành phần
Ở top-level, khi đóng vai trò là đối số của một hàm, một danh sách luôn được xem như
là sự áp dụng một hàm
Lisp thao tác trên các loại dữ liệu:
Biểu thức expression::= atom | list
Danh sách list::= (expression1...expressionn)
Danh sách là một chuỗi các biểu thức ngăn cách nhau bởi khoảng trắng, tất cả đặt
trong dấu ngoặc đơn
Atoms
atom::= số | chuỗi ký tự | symbols
Symbol (~ identifier): từ tạo bởi các ký tự bất kỳ, ngoại trừ ( ) ‘ ` “ ; và
khoảng trắng
Boolean: Lisp không có kiểu boolean. Trong Lisp, nil mang giá trị logic sai và tất cả
các biểu thức khác có giá trị đúng. Ký hiệu t dùng để chỉ trị logic đúng theo mặc
định.
Các kiểu dữ liệu được xếp theo cấp bậc như sau:
Trang 4
expression
list atom
symbol
real
nil
list
...
number
... ...
interger
8. Biến trong Lisp không có kiểu dữ liệu , cùng một biến có thể có nhiều kiểu dữ liệu khác
nhau
Ví dụ:
*(setq a ‘(1 2 3))
(1 2 3)
*a
(1 2 3)
*(setq a 2)
2
*a
2
Kiểu được gán cho dữ liệu chứ không phải cho biến. Ta có thể biết kiểu dữ liệu của biến
nhờ vào các vị từ (prédicat)
(numberp E) ;; trả về đúng nếu E là một số
(stringp E) ;; trả về đúng nếu E là một chuỗi ký tự
(listp E) ;; trả về đúng nếu E là một danh sách
(null E) ;; trả về đúng nếu E là danh sách rỗng
(atom E) ;; trả về đúng nếu E là atom
III.3 Vị từ (Prédicats)
Vị từ kiểu (xem phía trên)
Vị từ so sánh số: < > >= <= <>
*(< 4 5)
T
*(> 4 5)
NIL
IV. Lập trình với gcLisp
IV.1 Các hàm xử lý trên danh sách
IV.1.1 FIRST và REST – CAR và CDR
FIRST trả về phần tử đầu tiên của danh sách
REST trả về danh sách theo sau phần tử đầu tiên
Cho đến gần đây, phần lớn lập trình viên LISP vẫn dùng CAR và CDR thay cho FIRST
và REST. Ngoài chức năng tương tự, CAR và CDR có thể kết hợp với nhau.thành dạng
phức hợp CxxR, CxxxR hay CxxxxR. Mỗi x tượng trưng cho A – CAR hay D – CDR.
Trang 5
9. Quy ước:
*(car nil)
NIL
*(cdr nil)
NIL
Bài tập:
1. Lấy phần tử thứ ba của danh sách
(car (cdr (cdr l)))
có thể viết:
(caddr l)
CAR và CDR có thể kết hợp với nhau đến mức độ 4
Ví dụ:
(caadr l) = (car (car (cdr l)))
(cadar l) = (car (cdr (car l)))
2. Làm thế nào trích ra chuỗi example trong danh sách:
L=((this) is (an (example)) more complex)
L=((this) is (an (example)) more complex)
(cdr l) = (is (an (example)) more complex)
(cdr (cdr l)) = ((an (example)) more complex)
(car (cdr (cdr l))) = (an (example))
(cdr (car (cdr (cdr l)))) = ((example))
(car (cdr (car (cdr (cdr l))))) = (example)
(car (car (cdr (car (cdr (cdr l)))))) = example
IV.1.2 CONS, APPEND, LIST
LIST trả về danh sách các đối số
*(list ‘a (+ 3 1) ‘c)
(a 4 c)
*(list ‘(a b) ‘(c d))
((a b) (c d))
*(list ‘a nil)
(a nil)
CONS thêm một phần tử vào đầu danh sách
(cons ‘a ‘(2 3))
(a 2 3)
(cons `(a b) ‘(c d))
((ab) c d)
(list `a nil)
(a)
(CAR (CONS a l)) = a
(CDR (CONS a l)) = l
Trang 6
10. Bt. Cho biết giá trị của các biểu thức sau:
1. (cons ‘a (cons ‘b (cons ‘c nil)))
(cons ‘a (cons ‘b (cons ‘c nil)))
= (cons ‘a (cons ‘b ‘(c)))
= (cons ‘a ‘(b c))
= (a b c)
2. (list (car ‘(car ((1) (2)))) (cdr (cdr ‘((1) (2)))))
(list (car ‘(car ((1) (2))))
(cdr (cdr ‘((1) (2)))))
= (list ‘car
(cdr (cdr ‘((1) (2)))))
= (list ‘car
(cdr ((2))))
= (list ‘car nil)
= (list ‘car nil)
= (car nil)
APPEND kết hợp các phần tử của mọi danh sách đã cho
(setq l1 ‘(a b)
l2 ‘(x y))
= (x y)
(append l1 l2)
= (a b x y)
(append l1 ‘() l2 ‘())
= (a b x y)
IV.1.3 NTHCDR, BUTLAST và LAST
NTHCDR cắt n phần tử đầu danh sách, với thông số đầu chỉ số phần tử cần cắt
*(setq l ‘(a b c d e))
(a b c d e)
*(nthcdr 2 l)
(c d e)
BUTLAST cắt n phần tử cuối danh sách, với thông số đầu là danh sách, thông số
thứ hai chỉ số phần tử cần cắt
*(setq l ‘(a b c d e))
(a b c d e)
*(butlast l 2)
(a b c)
*(butlast l 10)
NIL
LAST trả về danh sách tất cả phần tử trừ phần tử cuối cùng đã bị loại ra
*(setq l ‘(a b c d e)
l1 ‘((a b) (c d)))
((a b) (c d))
Trang 7
Tải bản FULL (23 trang): https://bit.ly/3zfvuqZ
Dự phòng: fb.com/TaiHo123doc.net
11. *(last l)
(e)
*(last l1)
((c d))
IV.1.4 LENGTH và REVERSE
LENGTH trả về chiều dài của chuỗi
*(setq l ‘(a b c d e))
(a b c d e)
*(length l)
5
REVERSE trả về chuỗi nghịch đảo
*(setq l ‘(a b c d e))
(a b c d e)
*(reverse l)
(e d c b a)
IV.1.5 ASSOC
ASSOC gắn với một danh sách – association list hay còn gọi a-list
(setfl sarah ‘((height .54) (weight 4.4)))
height và weight là khóa trong danh sách được gán cho SARAH; .54 và 4.4 là các
giá trị biểu thị bằng met và kilograms.
Có thể lấy các thành phần từ một danh sách dùng ASSOC, một khóa, và danh sách
liên kết:
(ASSOC <key> <asociation list>)
Ví dụ:
(assoc ‘weight sarah)
(WEIGHT 4.4)
Lưu ý ASSOC luôn trả về toàn bộ danh sách con tương ứng với khóa. Trong trường
hợp có nhiều danh sách con cùng khóa, danh sách đầu tiên sẽ được trả về.
IV.1.6 LISP cung cấp các thao tác trên Integer, Ratio, Floating-Point
Numbers, ...
*(/ 1.234321 1.111)
1.111
*(/ 27 9)
3
Trang 8
Key Key
Value Value
3136967