2017-01-08 20 views
9

Tôi đã chơi xung quanh với một thực hiện Perl 6 của một chương trình dòng lệnh có nhiều công tắc. Chữ ký cho MAIN là khá tham gia và một chút lộn xộn. Tôi tự hỏi nếu có một cách để xác định chữ ký ở một nơi khác và nói với các chương trình con gì để sử dụng:Tôi có thể sử dụng Chữ ký độc lập làm chữ ký trong Perl 6 không?

# possibly big and messy signature 
my $sig; 
BEGIN { $sig = :(Int $n, Int $m) }; 

multi MAIN ($sig) { 
    put "Got $n and $m"; 
    } 

MAIN không thấy các biến trong chữ ký mặc dù chữ ký được thiết lập trước khi MAIN biên dịch:

===SORRY!=== Error while compiling /Users/brian/Desktop/signature.p6 
Variable '$n' is not declared 
at /Users/brian/Desktop/signature.p6:7 

Tôi nhận thấy loại điều này có thể hữu ích để tạo phương thức sau khi biên dịch và chọn chữ ký dựa trên các yếu tố khác nhau.

+0

Dù là trong '(...)' là chữ ký, vì vậy sẽ không bao giờ hoạt động. Cách bạn sẽ làm điều này sẽ là cấp thấp và thực hiện cụ thể. Tôi sẽ cố gắng làm điều này để có chữ ký chung và thay đổi chữ ký sau khi được phân tích cú pháp. Đó là bỏ qua rigamarole để thay đổi điều phối đa. –

+0

Để các biến bên trong hàm không vứt lỗi "biến không khai báo", điều này sẽ phải được thực hiện tại thời gian biên dịch bằng một thứ như macro. Thật không may, chức năng macro/slang đã được lên kế hoạch cho Perl 6, chưa được mô tả. – smls

+0

Trên một lưu ý phụ: Bạn có thể khai báo biến trong phạm vi cấp cao nhất và khởi tạo biến trong thời gian BEGIN trong một tuyên bố, bằng cách sử dụng biểu mẫu chặn ít hơn của công cụ BEGIN phaser: 'BEGIN my $ foo = ...;' – smls

Trả lời

7

Câu trả lời ngắn: No

Câu trả lời dài: Vẫn không. Và nếu bạn có thể, bạn sẽ gặp nhiều rắc rối, bởi vì chỉ có một biến là $n trong ví dụ của bạn. Nếu bạn sử dụng chữ ký nhiều lần (hoặc sử dụng nó một lần, và recurse vào chương trình con mà bạn đính kèm nó), mỗi ràng buộc chữ ký sẽ ghi đè lên giá trị trước đó trong biến đó, gây ra một số hành động ma quái ở khoảng cách xa. Có đơn giản không phải là một cơ chế để nhân bản các biến liên quan đến một chữ ký tự do trôi nổi.

Cách giải quyết như sử dụng chữ ký khớp trong thực tế, và sau đó sử dụng để ràng buộc việc chụp vào chữ ký bị lỗ hổng tương tự này, và do đó IMHO không đáng lo ngại.

Có lẽ trong tương lai xa, một số tính năng Macro rất tiên tiến có thể cho phép bạn ghép chữ ký, nhưng tôi không nghĩ rằng một phần phát triển vĩ mô thậm chí còn trên lộ trình của chúng tôi ngay bây giờ.

Thay vì tái sử dụng chữ ký để trần, bạn nên sử dụng lại thói quen (có thể giấu tên) với chữ ký kèm theo, và cài đặt chúng với tên mà bạn muốn, ví dụ

sub f(Int $n, Int $m) { 
    # do something sensible here with $n and $m 
} 
constant &MAIN = &f; 
# reuse &f for more 
+0

Sau đó, điểm tuyên bố chữ ký độc lập là gì, nếu chúng không thể được sử dụng ở bất kỳ đâu? – jjmerelo

+1

Vấn đề là, tôi nghĩ rằng bạn có thể smartmatch một chữ ký (chữ) có chữ ký với chữ ký của 'Block', ví dụ: 'sub a ($ a) {}; dd & a.signature ~~: ($ b) ' –

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