Trong bài này sẽ đưa ra một ngôn ngữ đơn giản để vẽ các bức tranh, nó là minh chứng cho năng lực của data abstraction và closure, và cũng phơi bày tính hiệu quả của các higher-order procedure. Ngôn ngữ được thiết kế để làm nó dễ dàng với các mô hình trong hình 2.9, nó được tạo ra từ các thành phần lập lại mà chúng có thể di chuyển và mở rộng. Trong ngôn ngữ của bức tranh, các data object được ví như là các procedure hơn là một cấu trúc danh sach. Ví như procedure cons, chúng thỏa mãn tính bao đóng, cho phép chúng ta dễ dàng xây nên cấu trúc danh sách phức tạp tùy ý, các toán tử trong ngôn ngữ, nó cũng cũng thỏa mãn tính bao đóng, cho phép chúng ta xay nên các mô hình bức tranh phức tạp tùy ý muốn
Ngôn ngữ lập trình của bức tranh
Khig chúng ta bắt đầu tìm hiểu về một ngôn ngữ lập trình, chúng ta cần nhấn mạnh về tầm quan trọng của việc diễn tả một ngôn ngữ bằng các dữ liệu nguyên thủy, ý nghĩa của combination và abstraction. Chúng ta sẽ follow theo ngữ cảnh đó cho ngôn ngữ bức tranh của chúng ta.
Phần chú ý ở đây là chỉ có một loại thành phần được gọi là painter trong ngôn ngữ. Một painter về một bức ảnh, nó di chuyển và mở rộng để phù hợp với kích thước khung hình bức ảnh được chỉ định. Vi dụng, có một loại painter nguyên thủy chúng ta sẽ gọi nó là “wave” tạo ra các đường vẽ thô sơ, như trong hình 2.1. Hình dáng thật sự của đường vẽ phụ thuộc trên frame – tất cả 4 bức ảnh ở hình 2.2 tạo thành từ wave painter tương tự nhau, nhưng kết quả là 4 frame khác nhau. Các painter có thể được cấu thành từ nhiều phần chi tiết hơn: painter nguyên thủy được gọi là các paint rogers, một bức ảnh của nhà sáng lập đại học MIT, William Barton Rogers, như đã đưa ra ở hình 2.11. Bốn bức ảnh trong hình 2.11 được vẽ đên bốn frame như là các ảnh wave trong hình 2.1
Để bao hàm các ảnh, chúng ta sử dụng nhiêu toán tử để khởi tạo các painter mới từ các painter ban đầu. Vi dụ, các toán tử beside cần hai painter và tạo một painter mới, kết hợp painter để vẽ bức ảnh painter đầu tiên ở nữa trái của frame và bức ảnh painter thứ hai ở nữa phải của frame. Tương tự, below cần hai painter và tạo ra một painter kết hợp nó vẽ ảnh painter đầu tiên bên dưới ảnh painter thứ hai. Một vài toán tử dịch chuyển môt painter để tạo một painter mới. Ví dụ, flip-vert procedure cần một painter và tạo ra một painter mới nó vẽ các image upside-down, và flip-horiz procedure tạo ra một painter vẽ ảnh painter gốc from left-to-right ngược.
Hình 2.12 đưa ra một cách để vẽ một painter gọi là wave4 nó tạo ra hai stage từ wave:
(define wave2 (beside wave (flip-vert wave)))
(define wave4 (below wave2 wave2))
Để tạo ra các bức ảnh phức tạp hơn, chúng ta cần biết sự thật rằng các painter bao đóng trong ý nghĩa của ngôn ngữa lập trình là một combination của các painter. Beside hoặc below của hai painter chính nó là một painter, chính vì thê, chúng ta có thể sử dụng nó như la một thành phần để tạo ra các painter phức tạp hơn. Giống như tạo ra các cấu trúc list chúng ta sử dụng cons, tính bao đóng của dữ liệu nghĩa rằng combination là cần thiết để tạo ra các cấu trúc dữ liệu phức tạp từ việc sử dụng một vài toán tử đơn giản.
Một khi chúng ta có thể bao gồm nhiều painter lại với nhau, chúng ta cũng có thể trừu tượng háo các mô hình cụ thể của các combination painters. Chúng ta sẽ thực thi các toán tử painter cũng như là đối với các procedure trong Schema. Chúng ta không cần một cơ chế abstraction cụ thể trong ngôn ngữ lập trình picture: Ý nghĩa gốc của combination là các procedure Schema, nó sẽ tự động để làm bất kỳ điều gì với các toán tử painter như chúng ta đã làm với các procedure. Ví dụ, chúng ta có thể abstract mô hình wave4 như sau.
(define (flipped-pairs painter)
(let ((painter2 (beside painter (flip-vert painter))))
(below painter2 painter2)))
và định nghĩa wave4 như là một thực thể của mô hình
(define wave4 (flipped-pairs wave))