2010-10-19 41 views
27

Khi làm việc trong các tài liệu ocaml hoặc ghci Tôi thường xây dựng một "ngữ cảnh" quan trọng cho muốn có từ, giá trị ràng buộc, hàm, mô-đun được tải, v.v. Có cách nào để cứu tất cả điều đó và tải lại sau để tôi có thể tiếp tục chính xác nơi tôi đã rời đi không? Hoặc tốt hơn, hãy loại bỏ toàn bộ lô dưới dạng tệp văn bản có thể được tải lại hoặc được sửa đổi nhỏ thành mã mà tôi có thể biên dịch thành tệp thực thi (ví dụ: bằng cách thêm một Chính)?Tiết kiệm thời gian chạy của tôi cho sau

+1

Thời gian tôi muốn cho điều này. Thiết lập "bối cảnh" một lần nữa và một lần nữa có lúc tôi khiến tôi phát điên. – Daniel

+1

Lưu ý: tiền thưởng của tôi là câu trả lời hay nhất liên quan đến Haskell, cho dù ghci hay ôm. –

+0

@A. Rex: Xin lỗi vì đã đến trễ, tôi mới thấy giải thưởng hôm nay. Cảm ơn nhiều!!! – fuz

Trả lời

11

Người dùng của HOL light đã có nhu cầu tương tự và họ sử dụng chương trình điểm kiểm tra để lưu ảnh chụp nhanh của biểu mẫu. Xem this message trên danh sách gửi thư caml hoặc trang 8 của this HOL tutorial.

Nói chung, tốt hơn là giữ các định nghĩa dưới dạng mã nguồn chứ không phải là ảnh chụp nhanh nhị phân. Nhiều công cụ cho phép tải nhanh một tệp .ml vào trong màn hình để thử nghiệm dễ dàng (chế độ emacs, v.v.). Xem cảnh báo trong hướng dẫn HOL:

Khi phát triển các bằng chứng lớn trong HOL, bạn nên luôn giữ tập lệnh chứng minh là tệp OCaml sẵn sàng tải lại, thay vì dựa vào ckpt. Điều này sẽ cho phép các bằng chứng được sửa đổi sau này, được sử dụng bởi người khác vv Tuy nhiên, có thể rất thuận tiện để tạo các ảnh chụp nhanh trung gian để bạn không phải tải các tệp lớn để làm việc thêm. Điều này tương tự với tình huống thông thường trong lập trình: bạn nên luôn giữ mã nguồn hoàn chỉnh của mình, nhưng không muốn biên dịch lại tất cả các nguồn mỗi khi bạn sử dụng mã .

10

Ít nhất trong OCaml không có hỗ trợ tích hợp cho điều đó. Giải pháp là sử dụng rlwrap hoặc bất kỳ trình bao bọc dòng dõi nào khác để ghi lại lịch sử nhập của bạn vào một tệp. Ví dụ:

> rlwrap -H mysession.ml ocaml 

Hạn chế là điều này cũng sẽ ghi lại đầu vào có lỗi cú pháp để bạn phải xóa sạch lỗi đó. Lưu ý rằng theo mặc định rlwrap sẽ tự động lưu đầu vào của bạn trong ~/.ocaml_history nếu bạn gọi nó mà không có tùy chọn -H.

+0

Tôi đã có một bí danh được xác định trong vỏ của tôi, oc = 'rlwrap ocaml' vì vậy đó là dễ dàng để làm và sẽ đưa tôi trở lại nơi tôi đã với #use ... Tôi đoán những gì tôi muốn là tương đương với lệnh "env" của trình bao kết xuất tất cả các biến môi trường. – Gaius

9

Trong Haskell, chỉ cần sử dụng :e file. Thao tác này sẽ mở trình chỉnh sửa chuẩn và cho phép bạn chỉnh sửa một số tệp. Sau đó, sử dụng :r để tải lại. Nó sẽ được tự động biên dịch lại.

Xin lưu ý rằng tất cả các chức năng được xác định của bạn "ad-hoc" sẽ bị mất sau này. Tham khảo tài liệu để biết thêm thông tin.

+1

Một cách khác để làm việc trong chế độ haskell trong Emacs, chỉnh sửa một tệp và C-c C-l để gửi nó đến quy trình kém hơn. Nếu đó là hai chiều, nó sẽ là hoàn hảo. – Gaius

+1

Chạy ghci trong Emacs, sau đó là ': e' từ đó? Không hoàn toàn nghiêm túc ... –

7

ghci sử dụng haskeline cho lịch sử nhập dòng lệnh, vì vậy bạn có thể cuộn lên để lặp lại/chỉnh sửa đầu vào. lịch sử đầu vào của bạn thường được ghi lại trong một tập tin, bạn có thể tìm như ghci_history trong thư mục do

System.Directory.getAppUserDataDirectory "ghc" 

Có lệnh khác nhau để khám phá những 'bối cảnh' (: hiển thị bindings,: hiển thị mô-đun,: def, ..) nhưng đầu ra của họ sẽ không đủ để tái tạo phiên của bạn (mặc dù nó là giá trị hiểu biết về họ anyway). Nói chung, lời khuyên để kết hợp phiên ghci của bạn với cửa sổ trình chỉnh sửa mở là âm thanh: nếu nó nhiều hơn định nghĩa throwaway, ngay cả khi chỉ nhằm mục đích gỡ lỗi, hãy đưa nó vào mô-đun được tải vào ghci, tốt hơn để bạn có thể tái sử dụng nó.

Ồ, và nếu theo 'ngữ cảnh', bạn có nghĩa là một số cài đặt hoặc mô-đun mặc định bạn muốn tải, trên cơ sở từng dự án, cũng có configuration file của ghci. Cũng hữu ích để xác định các lệnh ghci của riêng bạn.

7

Trong ocaml, bạn có thể xây dựng cấp cao nhất của riêng mình. Nó giải quyết vấn đề với các mô-đun nạp ít nhất.

http://caml.inria.fr/pub/docs/manual-ocaml/toplevel.html#sec278

Lệnh ocamlmktop xây dựng toplevels OCaml có chứa mã người dùng cài đặt sẵn lúc khởi động.

Lệnh ocamlmktop lấy làm đối số tập hợp các tệp .cmo và .cma, và liên kết chúng với các tệp đối tượng triển khai OCaml toplevel. Việc sử dụng điển hình là:

ocamlmktop -o mytoplevel foo.cmo bar.cmo gee.cmo 

Điều này tạo ra các tập tin bytecode mytoplevel, chứa hệ thống mục cấp đầu OCaml , cộng với mã từ ba file .cmo. mục cấp đầu này là trực tiếp thực thi và được bắt đầu bởi:

./mytoplevel 

này đi vào một vòng lặp mục cấp đầu thường xuyên, ngoại trừ các mã từ foo.cmo, bar.cmo và gee.cmo đã được nạp vào bộ nhớ, cũng giống như nếu bạn đã gõ:

#load "foo.cmo";; 
    #load "bar.cmo";; 
    #load "gee.cmo";; 

trên lối vào mục cấp đầu. Tuy nhiên, các mô-đun Foo, Bar và Gee không được mở là ; bạn vẫn phải làm

open Foo;; 

chính mình, nếu đây là điều bạn muốn.

+0

Tôi sử dụng kỹ thuật đó, tôi thấy một bài đăng trên blog của Jane Street về việc xây dựng "viết kịch bản" với nhiều điều hữu ích nhất/có liên quan. Nhưng trường hợp sử dụng tôi đang nghĩ đến là dọc theo các dòng công việc khám phá/thử nghiệm, rằng tôi muốn có thể giữ để bảo vệ chống lại việc khởi động lại hoặc chuyển sang máy khác và tiếp tục từ nơi tôi đã dừng lại. – Gaius

+0

Liên kết đã chết. Vui lòng trích dẫn nội dung có liên quan trong lần tiếp theo. –

4

Điều này luôn làm phiền tôi, vì vậy tôi đã viết một con trăn nhanh/mong đợi script để phát lại ghci_history vào đầu mỗi phiên ghci.

Nó không phải là rất đánh bóng. Ví dụ, nó luôn luôn replay toàn bộ lịch sử và có thể chậm.

+0

Luôn có nguy cơ xảy ra trong phiên mà bạn đã thực hiện:! bạn không muốn lặp lại ... – Gaius

+1

Có thể là: ___ lệnh nên được lọc. Và tất nhiên bạn không thể bảo vệ chống lại mọi thứ. –

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