DOLIST Hỗ trợ lặp trên danh sách

Một phần của tài liệu thực hành ngôn ngữ lập trình (Trang 62 - 64)

Tương tự như DOTIMES, nhưng các phần tử của danh sách được gán lần lượt cho tham số, có cú pháp chung như sau:

n * (n - 1)!, với n > 0; 1, với n = 0. n! =

(dolist (<element parameter> <list form> <result form>) <body>) (dotimes (<count parameter> <upper-bound form> <result form>) <body>)

Khi thực hiện DOLIST, đầu tiên list form được đánh giá và trả về kết quả là một danh sách các phần tử. Sau đó, các phần tử của danh sách được gán lần lượt cho tham số. Với mỗi giá trị, phần thân vòng lặp (body) được đánh giá. Cuối cùng, tham số này được bỏ đi và kết quảđược đánh giá, trả về giá trị cho DOLIST form.

Nếu DOLIST không có result form, DOLIST sẽ trả về NIL và mục đích của nó bây giờ chỉ là sắp xếp cho mục đích nào đó.

Bây giờ chúng ta sẽ viết phương thức đếm số phần tử trong danh sách ở dưới nhiệt độ đông lạnh hay trên nhiệt độ sôi, tính bằng độ Fahrenheit:

* (count-outlyers ‘(18 75 31 180 270 52)) 3

Cách đơn giản nhất để làm việc này là hiện thực COUNT-OUTLYERS dùng COUNT-IF. Một cách khác nữa là dùng DOLIST như sau:

(setf freezing 32 boiling 212)

(defun count-outlyers(list-of-elements) (let ((result 0))

(dolist (element list-of-elements result) (when (or (> element boiling) (< element freezing))

(setf result (+ result 1)) )

) ) )

)

Trong ví dụ trên, COUNT-OUTLYERS có thông số ‘(18 75 31 180 270 52). Tiếp theo, ELEMENT sẽ nhận giá trị 18. Vì 18 nhỏ hơn 32, result được cộng thêm 1. Trong quá trình đánh giá sau cùng, giá trị của ELEMENT là 52 và giá trị của result không đổi.

Để chấm dứt sự thực hiện DOLIST hay DOTIMES, ta dùng return:

Khi gặp (RETURN (expression)), biểu thức sẽ được đánh giá và trả về giá trị cho DOLIST. Nhờđặc điểm này, chúng ta có thể trả về n outlyers đầu tiên:

(defun first-n-outlyers(n list-of-elements) (let ((result 0) (outlyers nil))

(dolist (element list-of-elements outlyers) (cond

((or (> element boiling) (< element freezing))

(setf result (+ result 1)) (push element outlyers))

((= n result) (return outlyers)) )

) ) )

)

Bt. Viết DOLIST-MEMBER hiện thực MEMBER dùng DOLIST. Viết DOLIST-REVERSE hiện thực REVERSE dùng DOLIST.

Một phần của tài liệu thực hành ngôn ngữ lập trình (Trang 62 - 64)