2016-12-01 29 views
8

Perl 6 Tài liệu thuần tuý (có thể là tài liệu mới lạ) có một số tính năng cho phép nó xây dựng tài liệu cho những gì nó thấy và tài liệu hiển thị trong biến số $=pod khi chạy.Các chương trình Perl 6 có phải biên dịch để đọc tài liệu nhúng không?

Tuy nhiên, tôi đã rất ngạc nhiên khi tôi không đọc được tài liệu khi tôi mắc lỗi trong văn bản chương trình. Ở đây tôi đã rời ra một tách tuyên bố giữa hai câu lệnh:

use v6; 

BEGIN { put "BEGIN" } 
INIT { put "INIT" } 
CHECK { put "CHECK" } 

"foo" "bar"; 

DOC INIT { put "DOC INIT" } 
DOC BEGIN { put "DOC BEGIN" } 
DOC CHECK { put "DOC CHECK" } 

=begin pod 

=head1 This is a title 

This is a bit of pod 

=end pod 

Khi tôi chạy nó với --doc switch, các vấn đề cú pháp chương trình (và BEGIN chạy):

$ perl6 --doc doc.p6 
BEGIN 
===SORRY!=== Error while compiling ... 
Two terms in a row 
------>  "foo"⏏ "bar"; 
    expecting any of: 
     infix 
     infix stopper 
     statement end 
     statement modifier 
     statement modifier loop 

Khi tôi sửa chữa nó , Tôi nhận được một số cảnh báo (vì vậy, perl6 đang biên dịch) và các trình biên dịch thời gian chạy phasers:

BEGIN 
DOC BEGIN 
DOC CHECK 
CHECK 
WARNINGS for /Users/brian/Desktop/doc.p6: 
Useless use of constant string "bar" in sink context (line 9) 
Useless use of constant string "foo" in sink context (line 9) 
INIT 
DOC INIT 
This is a title 

This is a bit of pod 

Chúng tôi đã biết điều này có một chút nguy hiểm trong Perl 5. A perl -c và khối BEGIN có thể chạy mã. Xem How to check if a Perl script doesn't have any compilation errors?. Tôi không nghĩ điều này nguy hiểm hơn những gì chúng ta đã biết, nhưng bây giờ nó xảy ra vào thời điểm tôi không yêu cầu một cách rõ ràng để yêu cầu một cái gì đó để biên dịch các câu lệnh của chương trình.

Tôi chưa nghiên cứu chi tiết về Perl 6 pod và tại sao điều này có thể cần thiết bên ngoài khối khai báo và .WHY (tính năng thú vị), nhưng dường như điều này có thể dẫn đến sự cố. Có lẽ một chương trình bên ngoài có thể trích xuất Pod? Hoặc một cách để làm mà không có người khai báo trừ khi chương trình sẽ chạy?

Trả lời

1

Có, toàn bộ tệp phải được phân tích cú pháp, do đó yêu cầu chạy các câu lệnh BEGINuse và như vậy.

Ngôn ngữ Perl 6 được thiết kế để phân tích cú pháp một lần từ trên xuống dưới, sao cho tại bất kỳ điểm nào, trình phân tích cú pháp hiểu phân tích cú pháp là gì dựa trên những gì nó đã phân tích cú pháp cho đến nay.

xem xét mã như sau:

say " 

=begin pod 

Not POD, just a string! 

"; 

Nếu bạn muốn chỉ grep tập tin cho báo cáo POD mà không cần phân tích tất cả của nó, nó sẽ hiểu sai đoạn mã này.

I.e. bạn không thể phân tích cú pháp chỉ các phần POD mà không phân tích cú pháp các phần mã Perl 6 bình thường, bởi vì không phân tích cú pháp tất cả từ trên xuống dưới, bạn không thể biết được cái nào.


PS: Về lý thuyết, các nhà thiết kế Perl 6 có thể cung cấp chỗ ở POD chỉ phân tích, bằng cách làm cho nó bất hợp pháp cho bình thường Perl 6 mã để chứa đường mà hình như họ bắt đầu một khối POD. Trong trường hợp này, đoạn mã trên sẽ là lỗi cú pháp khi toàn bộ tệp được phân tích cú pháp, vì bắt đầu một dòng bên trong một chuỗi ký tự bằng =begin pod sẽ không được phép, do đó, chuyển đổi --pod có thể dựa trên tất cả các dòng bắt đầu bằng =begin foo thực sự bắt đầu Khối POD.

như một hạn chế có lẽ sẽ không phải là một gánh nặng lớn đối với bình thường Perl 6 đang (sau khi tất cả, người nhu cầu viết =begin pod vào lúc bắt đầu của một dòng trong một chuỗi đa dòng đen), nhưng lưu ý rằng một trong những lý do cho kiến ​​trúc phân tích cú pháp từ đầu đến cuối là tạo điều kiện cho khả năng mở rộng ngôn ngữ thông qua tiếng lóng.
Ví dụ: Các mô-đun CPAN có thể thêm hỗ trợ cho người dùng viết một chương trình con đơn (hoặc phạm vi từ vựng khác) bằng một ngôn ngữ hoặc DSL khác. (Việc thực hiện các mô-đun như vậy là không thực sự có thể được nêu ra mà không có hack vào nội bộ Rakudo thông qua NQP, nhưng một khi thiết kế macro/tiếng lóng hoàn thành, nó sẽ được).
Gánh nặng cho việc không cho phép các dòng trông giống như họ bắt đầu một khối POD, sau đó sẽ được chuyển cho tất cả các trình phân tích cú pháp lóng đó.

Bạn luôn có thể gửi yêu cầu tính năng cho Larry và các nhà thiết kế Perl 6 khác để xem xét điều này.

+0

Tôi không đưa ra yêu cầu tính năng. Tôi chỉ giải thích những gì tồn tại. –

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