2010-05-31 26 views
5

Tôi sẽ thừa nhận ngay lên phía trước rằng sau đây là một mô tả khá khủng khiếp về những gì tôi muốn làm. Xin lỗi trước. Vui lòng đặt câu hỏi để giúp tôi giải thích. ETLs :-)Hệ thống điều kiện Lisp thông thường để chuyển quyền kiểm soát

Tôi đã viết (Extract, Transform, Load) bằng các ngôn ngữ khác mà bao gồm các hoạt động cá nhân giống như thế:

// in class CountOperation 
IEnumerable<Row> Execute(IEnumerable<Row> rows) { 
    var count = 0; 
    foreach (var row in rows) { 
     row["record number"] = count++; 
     yield return row; 
    } 
} 

Sau đó, bạn chuỗi một số các hoạt động này với nhau, và gọi cho Dispatcher, người chịu trách nhiệm gọi cho Operations và đẩy dữ liệu giữa chúng.

Tôi đang cố gắng làm một cái gì đó tương tự trong Common Lisp, và tôi muốn sử dụng cùng cấu trúc cơ bản, tức là mỗi thao tác được định nghĩa như một hàm bình thường đưa vào danh sách và xuất ra danh sách.

tôi có thể define-condition một điều kiện (have-value) để sử dụng cho yield -like hành vi, và tôi có thể chạy nó trong một vòng lặp duy nhất, và nó hoạt động tuyệt vời. Tôi đang xác định các hoạt động theo cùng một cách, lặp qua các đầu vào:

(defun count-records (rows) 
    (loop for count from 0 
     for row in rows 
     do (signal 'have-value :value `(:count ,count @,row)))) 

Sự cố là nếu tôi muốn kết hợp nhiều thao tác và chạy chúng. Nỗ lực đầu tiên của tôi khi viết một điều phối viên cho những nội dung này có dạng như sau:

(let ((next-op ...)) ;; pick an op from the set of all ops 
    (loop 
    (handler-bind 
     ((have-value (...))) ;; records output from operation 
    (setq next-op ...) ;; pick a new next-op 
    (call next-op))) 

Nhưng khởi động lại chỉ có mức động: mỗi thao tác sẽ có cùng tên khởi động lại. Khởi động lại không phải là đối tượng Lisp mà tôi có thể lưu trữ, để lưu trữ trạng thái của hàm: đó là thứ bạn gọi theo tên (ký hiệu) bên trong khối xử lý, không phải là phần tiếp theo bạn có thể lưu trữ để sử dụng sau này.

Có thể làm điều gì đó như tôi muốn ở đây không? Hoặc tôi tốt hơn hết chỉ làm cho mỗi chức năng hoạt động một cách rõ ràng nhìn vào hàng đợi đầu vào của nó, và rõ ràng đặt các giá trị trên hàng đợi đầu ra?

Trả lời

0

Tôi không nghĩ rằng hệ thống điều kiện là điều phù hợp để sử dụng ở đây. Sẽ tốt hơn nếu tiếp tục. Ngoài ra, trình biên dịch C# biến phương thức bạn trình bày thành một đối tượng giống như tiếp tục.

Trong Lisp thông thường, bạn có thể tiếp tục với thư viện cl-cont.

3

Lisp thông thường không hỗ trợ coroutines hoặc tiếp tục đi xuống. Bạn không thể nhảy ra khỏi một số tính toán và sau đó nhảy trở lại. Có các thư viện (ví dụ: cl-cont) để cung cấp hỗ trợ 'một số' cho việc tiếp tục.

Tôi sẽ sử dụng tóm tắt (xem SICP) trừu tượng (sử dụng FORCE và DELAY) hoặc một cái gì đó như SERIES (thực hiện cơ sở tính toán lười biếng hiệu quả).

Các vấn đề liên quan