TP.HCM Slide 7/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp Ngôn ngữ thông dịch Ngôn ngữ thông dịch Biểu thức đánh giá trả lời Kết quả vòng lặp top-level Biểu diễn chương trình bằng
Trang 1Lập trình hàm với Lisp: GcLisp
Lập trình logic với Prolog: B_Prolog
Lập trình hướng đối tượng với SmallTalk:
Vwin
Trang 2TP.HCM
Slide 3/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Lịch sử phát triển
Nghĩ ra năm 1958 bởi John McCarthy (MIT)
Hai thế hệ đầu tiên ra đời ngay sau đó:
MacLisp và InterLisp
Đầu thập niên 80, có 12 hệ Lisp khác nhau
Common Lisp chuẩn ra đời năm 1984
Franz-Lisp Zeta-Lisp
Education and intelligent support systems
Speech and vision
Trang 3TP.HCM
Slide 5/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Ngôn ngữ hướng chức 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
Ngôn ngữ hướng chức năng (functional
language), dùng ký hiệu tiền tố (prefix):
BK
TP.HCM
Giải đáp bài tập
(sin (+ (* 3 x) (/ pi 2)))
Trang 4TP.HCM
Slide 7/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Ngôn ngữ thông dịch
Ngôn ngữ thông dịch
Biểu thức
đánh giá trả lời
Kết quả vòng lặp top-level
Biểu diễn chương trình bằng các danh
sách và 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
Trang 5TP.HCM
Slide 9/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Để không đánh giá một danh sách, dùng
dấu ‘ đặt trước danh sách
* (+ 3 4) ; danh sách được đánh giá
7
* ‘(+ 3 4)
(+ 3 4)
Trang 6TP.HCM
Slide 11/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Với vai trò là đối số trong hàm, symbol được
xem như tên của một biến
Để không đánh giá một symbol, dùng dấu ‘ đặt
Trang 7TP.HCM
Slide 13/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Trang 8TP.HCM
Slide 15/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Boolean
Lisp không có kiểu dữ liệu Boolean
nil biểu diễn giá trị logic sai, tất cả các biểu thức
khác biểu diễn trị logic đúng
Biểu thức expression::= atom | list
Danh sách list::=(expression 1 expression n )
Atoms atom::= số|chuỗi ký tự|symbols
Boolean T và nil
Trang 9TP.HCM
Slide 17/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Các loại biểu thức trong Lisp
Các loại biểu thức (expression):
Ký hiệu (symbol) Ví dụ: a-symbol
list
number
Trang 10TP.HCM
Slide 19/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Ngôn ngữ động (dynamic type)
Biến không có kiểu dữ liệu định sẵn
(không khai báo)
Cùng một biến có thể có nhiều kiểu dữ
Trang 11TP.HCM
Slide 21/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Trang 12TP.HCM
Slide 23/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Các vị từ trên số
ZEROP kiểm tra zero
PLUSP kiểm tra số dương
MINUSP kiểm tra số âm
ODDP kiểm tra số lẻ
EVENP kiểm tra số chẵn
Trang 13TP.HCM
Slide 25/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
eq hai đối số cùng là một symbol
eql hai đối số cùng là một symbol
hay cùng một số
equal hai đối số có cùng biểu thức
biểu diễn
Trang 14TP.HCM
Slide 27/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Các hàm so sánh (2)
eq kiểm tra cùng địa chỉ bộ nhớ (các symbol
giống nhau thỏa điều này).
eql kiểm tra thỏa eq hay không Nếu không,
kiểm tra là hai số cùng kiểu và cùng giá trị.
equal kiểm tra thỏa eql hay không Nếu
không, xem đối số là hai danh sách và xem
Trang 15TP.HCM
Slide 29/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Trang 16TP.HCM
Slide 31/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Các hàm xử lý trên danh sách (1)
FIRST và REST – CAR và CDR
CONS, APPEND, LIST
Trang 17TP.HCM
Slide 33/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Trang 18TP.HCM
Slide 35/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
ASSOC (2)
Lấy các thành phần từ một danh sách:
Ví dụ:
(ASSOC <key> <asociation list>)
* (setf sarah ‘((height 54) (weight 4.4)))
(ACONS <key><value><asociation list>)
* (setf Andrew ‘((height 74) (weight 6.4)))
((HEIGHT 0.74) (WEIGHT 6.4))
* (acons ‘nick ‘Bobby Andrew)
((NICK BOBBY) (HEIGHT 0.74) (WEIGHT 6.4))
Trang 19TP.HCM
Slide 37/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
(defun fac(n)
(if (= n 0) 1
(* n fac (1- n)) ) )
Trang 20TP.HCM
Slide 39/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
‘Exp là cách viết tắt của (quote Exp)
Trang 21TP.HCM
Slide 41/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Các câu lệnh điều kiện (2.1)
Câu lệnh COND
( cond (Test1 E1 …)
(Test2 E2 …) (Test3 E3 …)
… (Testn En …) ) (if Test1 (progn E1 …)
(if Test2 (progn E2 …)
(if Test3 (progn E3 …)
* (cond ((numberp x) ‘(This is a number))
((symbolp x) ‘(This is a symbol)) ((listp x) ‘(This is a list))
)
(THIS IS A LIST)
Trang 22TP.HCM
Slide 43/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Các câu lệnh điều kiện (3)
(and E 1 E n ) sai nếu ít nhất một E i sai
AND đánh giá từ trái → phải và dừng lại
khi gặp đối số sai
Nếu mọi đối số đều đúng, AND trả về giá
trị của đối số cuối cùng
Trang 23TP.HCM
Slide 45/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Các trường hợp điều kiện (1.2)
Trang 24TP.HCM
Slide 47/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Các trường hợp điều kiện (2.2)
wrong type argument
* (or (symbolp x) (list x))
AND, OR trả về giá trị cuối cùng tính được
NOT đơn giản đổi nonNIL→NIL và NIL→T
Trang 25TP.HCM
Slide 49/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Các dạng đặc biệt (1)
Toán tử PROG1 và PROGN
( prog1 E 1 E n ) đánh giá tuần tự các biểu
thức E 1 , , E n từ trái sang phải và kết quả
trả về là giá trị của biểu thức E 1
( progn E 1 E n ) đánh giá tuần tự các biểu
thức E 1 , , E n từ trái sang phải và kết quả
trả về là giá trị của biểu thức E n
Trang 26TP.HCM
Slide 51/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Biến cục bộ (1)
Toán tử let
( let ((var 1 E 1 ) … (var m E m )) E m+1 … E n )
Ta gán cho mỗi biến giá trị của biểu thức
tương ứng, sau đó đánh giá:
( progn expm+1 … expn)
Trang 27TP.HCM
Slide 53/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
* (bar 4)
5
Các liên kết được thực hiện song song
Trang 28TP.HCM
Slide 55/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Thân vòng lặp <body> được thực hiện n lần,
giá trị của <result form> là kết quả cần tính
(dotimes (<count>
<upper-bound-form>
<result form>)
<body>)
Trang 29TP.HCM
Slide 57/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Ví dụ: Tính lũy thừa m n = m×m× ×m
DOTIMES (2)
(defun power(m n)
(let ((result 1))
(dotimes (count n result)
(setf result (* m result)) )
) )
BK
TP.HCM
DOLIST – Lặp trên danh sách
list form được đánh giá → danh sách a 1 → a n
element được gán từ a 1 → a n (n lần)
Với mỗi giá trị a i , phần thân vòng lặp (body)
được đánh giá.
Không có result form , DOLIST sẽ trả về NIL
(dolist (<element parameter >
<list form> <result form>)
<body>)
Trang 30TP.HCM
Slide 59/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Trang 31TP.HCM
Slide 61/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Startup gclisp
Chạy từ file ‘C:\GcLisp\GcLisp.exe’
BK
TP.HCM
Môi trường GC-LISP
Ta thấy cửa sổ GCLISP như sau:
Trang 32TP.HCM
Slide 63/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
Một số phím tắt
<Alt>-H giúp đỡ
<Alt>-E vào LISP Explorer
<Ctrl>-E vào cửa sổ soạn thảo GMACS
<F1> rời khỏi GMACS và trở về Lisp
<F8> load một file vào GMACS
Trang 33TP.HCM
Slide 65/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
GMAC editor window
Nhấn <Ctrl>-E để vào trình soạn thảo
<F9> để lưu file and <F1> trở lại GcLisp
Trang 34TP.HCM
Slide 67/67 Nguyễn Thị Trúc Viên Ngôn ngữ lập trình Lisp
DEBUG