Tôi đang viết một trình soạn thảo đồ họa cho một "mô hình" (tức là một tập hợp các hộp và các dòng với một số ngữ nghĩa, chẳng hạn như UML, chi tiết không quan trọng ở đây) . Vì vậy, tôi muốn có một cấu trúc dữ liệu đại diện cho mô hình, và một sơ đồ nơi chỉnh sửa biểu đồ gây ra một sự thay đổi tương ứng trong mô hình. Vì vậy, nếu, ví dụ, một phần tử mô hình có một số văn bản trong một thuộc tính, và tôi chỉnh sửa văn bản trong sơ đồ, tôi muốn phần tử mô hình được cập nhật.Cấu trúc dữ liệu Zipper cho trình soạn thảo mô hình đồ họa
Mô hình có thể sẽ được biểu diễn dưới dạng cây, nhưng tôi muốn người biên tập biểu đồ biết rất ít về mô hình đại diện nhất có thể. (Tôi đang sử dụng khung làm việc diagrams, vì vậy việc liên kết thông tin tùy ý với phần tử đồ họa thật dễ dàng). Có thể sẽ có một lớp "mô hình" để mã hóa giao diện, nếu tôi chỉ có thể tìm ra những gì nên được.
Nếu tôi đã làm điều này bằng ngôn ngữ bắt buộc, nó sẽ đơn giản: Tôi chỉ có một tham chiếu từ phần tử đồ họa trong sơ đồ trở lại phần tử mô hình. Về lý thuyết, tôi vẫn có thể làm điều này bằng cách xây dựng mô hình từ một bộ sưu tập lớn các IORef, nhưng đó sẽ là viết một chương trình Java trong Haskell.
Rõ ràng, mỗi phần tử đồ họa sẽ có một số loại cookie được liên kết với nó sẽ cho phép cập nhật mô hình xảy ra. Một câu trả lời đơn giản là cung cấp cho mỗi phần tử mô hình một mã định danh duy nhất và lưu mô hình trong bảng tra cứu Data.Map. Nhưng điều đó yêu cầu sổ sách kế toán đáng kể để đảm bảo rằng không có hai yếu tố mô hình nào nhận được cùng một số nhận dạng. Nó cũng tấn công tôi như một giải pháp "stringly typed"; bạn phải xử lý các trường hợp một đối tượng bị xóa nhưng có một tham chiếu treo lơ lửng ở nơi khác, và khó có thể nói bất cứ điều gì về cấu trúc bên trong của mô hình trong các loại của bạn.
Mặt khác, Oleg's writings về khóa kéo có nhiều lỗ và con trỏ với chia sẻ giao dịch rõ ràng giống như một lựa chọn tốt hơn, nếu chỉ tôi mới có thể hiểu được. Tôi có được ý tưởng cơ bản về danh sách và các khóa kéo của cây và sự khác biệt của một cấu trúc dữ liệu. Nó sẽ có thể cho mọi phần tử trong một sơ đồ để giữ con trỏ vào một dây kéo của mô hình? Vì vậy, nếu một thay đổi được thực hiện thì nó có thể được cam kết với tất cả các con trỏ khác? Bao gồm các hoạt động của cây (chẳng hạn như di chuyển cây con từ nơi này sang nơi khác)? Nó sẽ đặc biệt giúp tôi vào thời điểm này nếu có một số loại hướng dẫn về tiếp tục phân cách, và giải thích về cách chúng làm cho dây kéo đa con trỏ của Oleg hoạt động, hơi dốc hơn so với bài đăng của Oleg?
Có thể blog của Chung-chieh Shan? : http://conway.rutgers.edu/~ccshan/wiki/blog/posts/WalkZip1/. Lưu ý, Blobs (wxHaskell) là một thư viện để viết "biên tập viên mạng" - nó có thể có chút phân đoạn nhưng có thể ít công việc để cập nhật nó hơn là bắt đầu lại với Sơ đồ. –
Cảm ơn. Tôi đã bắt đầu làm việc thông qua nó. Tôi sẽ cho bạn biết nếu nó dẫn đến một câu trả lời. –