Việc thực thi các phân số ở bài trước ( xem tại đây) bằng việc thực hiện các toán tử của hai phân số bởi các procedure add-rat, sub-rat,.. trên các điều kiện của ba procedure: make-rat, numer, and denom. Ở khía cạnh đó, chúng ta có thể nhìn nhận các toán tử được định nghĩa trong các điều khoản của các data object – tử, mẫu và phân số – cách hành xử được cụ thể hóa bằng ba procedure sau:.
Nhưng chính xác hơn hết data có ý nghĩa gì? Nó không đủ để khẳng định rằng ” bất kể thứ gì được thực thi bởi hàm khởi tạo và truy xuất dữ liệu là data”. Rõ ràng rằng, không phải mỗi danh sach của ba procedure có thể phục vụ như là một nền tảng cơ bản cho việc thực thi một phân số. Chúng ta cần đảm bảo rằng, nếu chúng ta khởi tạo một phân số x từ cặp số integer n và d, thì việc truy xuất các tử và mẫu của x và chia chúng nên đạt được kết quả tương tự như chia n với d. Mặc khác, make-rat, numer,
và denom phải thõa mãn các điều kiện đó, cho bất kì integer n và các số integer khác 0 của d, nếu x là (make-rat n d) thì,
Đây là điều cần cần thiết cho make-rat, numer, và denom để tạo thành một thứ cơ bản phù hợp cho việc trình bày một phân số. Nhìn chung, data được định nghĩa bởi bộ sưu tập của việc khởi tạo và truy xuất dữ liệu nguyên thủy, cùng với các điều kiện cụ thể để các procedure phải tuân theo và để tạo nên một sự trình bày data hiệu quả.
Với cái nhìn trên, không chỉ giúp định nghĩa các data object ở “level cao” như phân số, mà còn các object ở level thấp hơn. Xem khái niệm về pair, nó được sử dụng để định nghĩa các phân số. Chúng ta không quan tâm pair là gì, ngôn ngữ lập trình Lisp chỉ hỗ trợ các procedure như cons, car và cdr cho các hoạt động trên pair. Nhưng thứ chúng ta biết về ba procedure này là khi chúng ta muốn gắng kết hai object cùng nhau sử dụng cons, chúng ta có thể truy xuất các object bên trong sử dụng car và cdr. Các procedure thõa mãn điều kiện đó, với bất kỳ object x và y, nếu z là (cons x y) thì (car z) là x và (cdr z) là y.
Thật vậy, ba procedure đó đã có trong ngôn ngữ lập trình Lisp. Tuy nhiên với bất kì bộ ba procedure thỏa mãn các điều kiện trên cũng có thể được sử dụng để thực thi các hoạt động của pair. Điểm này là sự minh chứng dễ hiểu nhất rằng chúng ta có thể thực thi cons, car và cdr không cần sử dụng bất kỳ cấu trúc dữ liệu ngoại trừ việc chỉ sử dụng các procedure. Dưới đây là các định nghĩa đó.
(define (cons x y)
(define (dispatch m)
(cond ((= m 0) x)
((= m 1) y)
(else (error "Argument not 0 or 1: CONS" m))))
dispatch)
(define (car z) (z 0))
(define (cdr z) (z 1))
Việc sử dụng các procedure này không giống như các khái niệm trừu tượng của việc data nên là cái gì. Ngoại trừ , tất cả những gì chúng ta cần là chỉ ra một cách ý nghĩa việc trình bày các pair để xác thực các procedure thõa mãng các điều kiện ở trên.
Điểm cần lưu ý là giá trị trả về của (cons x y) là một procedure – tên là dispatch, nó nhận một đối số và trả về giá trị của x hoặc y phụ thuộc giá trị đối số là 0 hoặc 1. Tương tự, (car z), áp dụng z với đối số 0. Vì thế, nếu z là được khởi tạo bởi thủ tục (cons x y) thì z áp dụng đến đối số 0 sẽ trả về x. Chúng ta có thể hiểu như sau (car (cons x y)) trả về x. Tương tự đối với y. Nếu chúng ta truy vấn pair chỉ sử dụng cons, car, và cdr thì chúng ta không thể phân biêt với thực thi của cấu trúc dữ liệu thật trong ngôn ngữ.
Bài viết tiếp theo: Extended Exercise: Interval Arithmetic