2012-09-22 12 views
5

Tôi đang cố gắng khôi phục dự án cũ (1999 hoặc cũ hơn) được viết trong Đề án (PLT-Scheme, sử dụng công cụ dòng lệnh thông dịch mzscheme)? Để làm cho vấn đề tồi tệ hơn, tôi không biết Đề án, hoặc Lisp (trên thực tế, tôi muốn tìm hiểu, nhưng đó là một câu chuyện khác).Phục hồi dự án PLT-Đề án cũ (trước 1999)

Tôi có mã nguồn của dự án tại địa chỉ:

github.com/akavel/sherman

Bây giờ, khi chạy đoạn code, nó bails ra với một thông báo lỗi như dưới đây:

Sherman runtime version 0.5 
Hosted on MzScheme version 52, Copyright (c) 1995-98 PLT (Matthew Flatt) 
reference to undefined identifier: list->block 

(Tôi đã thử các phiên bản PLT-Scheme 52, 53, 103, 103p1. Các phiên bản trước đó không cho phép tùy chọn mzscheme -L, đó là ref bị ràng buộc trong tập lệnh sherman.bat được sử dụng trong dự án. Các phiên bản sau cũng có một số vấn đề nghiêm trọng hơn với mã hoặc tùy chọn)

Khó khăn là, từ những gì tôi thấy, list->block thực định nghĩa - xem:. collects/sherman/BLOCK.SS line 48. Vì vậy, những gì là sai?

Để chạy mã, tôi thực hiện các bước sau:.

  1. Tải PLT-Đề án v 103p1 (từ the old versions download page - lần đầu tiên đóng "Đề án PLT hiện vợt" banner) - dành cho Windows, sử dụng: mz-103p1-bin-i386-win32.zip.
  2. Giải nén (ví dụ: đến thư mục c:\PLT).
  3. Sao chép c:\sherman\collects\sherman thư mục có nội dung tới: c:\PLT\collects\sherman (trong đó c:\sherman chứa nội dung của github repository).
  4. Chạy cmd.exe, sau đó cd c:\sherman.
  5. set PATH=c:\PLT;%PATH%
  6. sherman.bat run trivial.s
    • lệnh này là trong thực tế, từ những gì tôi hiểu, tương đương với:
 
(require-library "runtime.ss" "sherman") 
(parameterize ((current-namespace sherman-namespace)) (load "trivial.s")) 
(current-namespace sherman-namespace) 
  • Sau đó, tôi nhận được lỗi như mô tả ở trên (phiên bản MzScheme sẽ được báo cáo là 103p1 hoặc bất kỳ điều gì).

Bạn có thể giúp tôi giải quyết sự cố không?

CHỈNH SỬA 2: GIẢI PHÁP!

Đối với người mà nó có thể quan tâm, tôi đã thêm một giải pháp hoàn chỉnh soegaard's help.

Nói tóm lại:

copy trivial.s trivial.rs 
rem (the above is workaround for problems with 'r2s.exe <trivial.r> trivial.rs') 
sherman.bat compile trivial.rs 
sherman.bat run trivial.zo 
rem (or: sherman.bat run trivial.ss) 
+1

Có thể, sẽ dễ dàng hơn khi chuyển mã có liên quan sang Racket, sử dụng '#lang mzscheme' ở đầu mỗi tệp. –

+0

@ SamTobin-Hochstadt: Tôi sẽ không gặp khó khăn khi chuyển các cuộc gọi khác nhau đến các thư viện cũ? Từ những gì tôi đã thử, ví dụ: dạng '(require-library)' (được sử dụng rộng rãi trong dự án này) thậm chí không thể tìm thấy trong tài liệu Racket trực tuyến? – akavel

+1

Biểu mẫu 'require-library' là một phiên bản cũ của' require'. Bạn có thể muốn đọc [hướng dẫn porting] (http://docs.racket-lang.org/release/index.html) trong tài liệu (ví dụ: đề cập đến 'require-library'). –

Trả lời

5

Không phải là câu trả lời, nhưng một vài lưu ý quá lớn cho một nhận xét.

1. Sanity Check 

Thông báo lỗi cho biết list->block không xác định. Đảm bảo rằng mã trong block.ss được chạy, bằng cách chèn (display "block.ss is loaded!") vào block.ss chỉ để đảm bảo, mã được chạy.


2. Random Thoughts 

File blocks.ss bắt đầu bằng:

(require-library "functios.ss") 
(require-library "synrule.ss") 
(require-library "stream.ss" "sherman") 

Các tập tin "sherman/stream.ss" là trong kho, nhưng mà là "synrule.ss" và "functios. ss "?

Ah ... Mã này cũ! Dưới đây là mô tả về cách hoạt động của require-library. Danh sách này liệt kê functios.sssynrule.ss như một phần của MzLib.

http://www.informatik.uni-kiel.de/~scheme/doc/mzscheme/node158.htm

Hãy kiểm tra ra cách require-library làm việc:

Khi yêu cầu thư viện được sử dụng để tải một tập tin, tên thư viện và các giá trị kết quả (s) đang recored trong một bảng liên quan với không gian tên hiện tại. Nếu yêu cầu-thư viện được đánh giá cho một thư viện là đã được đăng ký trong bảng tải không gian tên hiện tại, thì thư viện không được tải lại; kết quả được ghi lại trong bảng tải được trả về, thay vào đó.

Vì vậy, khi mã trong block.ss được chạy, tên được lưu trữ trong không gian tên. Nếu không gian tên hiện tại là sai, khi mã trong block.ss được đánh giá, nó sẽ giải thích cho bạn thông báo lỗi của list->block là không xác định.

+0

Cảm ơn rất nhiều! Tôi đã có một định nghĩa nhìn về 'sherman-namespace' trong' runtime.ss', nhưng nó trông không đủ khả nghi (đặc biệt là có một số loại '#% list-> block') tương tự, và bây giờ cảm ơn bạn, điều này trở nên đáng ngờ hơn :) Vì vậy, tình hình đã tốt hơn, nhưng ... vẫn không chính xác nơi tôi hy vọng kết thúc ... vì vậy tôi đã cập nhật câu hỏi, và sẽ rất biết ơn nếu bạn thích đủ để gợi ý cho tôi nhiều hơn nữa ... – akavel

+1

Bạn đã cố gắng chạy mã trong 'trivial.s' như thế nào? Tôi tin rằng 'trivial.s' là đầu ra của lexer, vì vậy đầu tiên phải biên dịch nó và sau đó chạy nó. Điều backquote là một cách để tránh viết lexer trong Scheme (xem chú thích của Joe trong readme). – soegaard

+0

AHH! Ok, bình luận của bạn cùng với việc xem xét 'extension's + một số thử nghiệm cuối cùng đã làm nó cho tôi:' copy trivial.s trivial.rs && sherman.bat biên dịch trivial.rs && sherman.bat run trivial.zo'. CẢM ƠN NHIỀU! (Và bản vá cuối cùng với 'list-> block' cần được hoàn nguyên trước) – akavel