Có thể cho là có dưới dạng tập con là các loại có thể phụ thuộc vào điều kiện tùy ý. Tuy nhiên, hệ thống kiểu sẽ được phân loại là không xác định là các kiểu bất biến kiểu không được thực thi.
Đặc biệt, loại hạn chế của một biến là chỉ kiểm tra theo sự phân công, vì vậy thay đổi đến một đối tượng mà làm cho nó thả từ một tập hợp con sẽ dẫn đến một biến giữ một đối tượng nó không nên có thể, ví dụ như
subset OrderedList of List where [<=] @$_;
my OrderedList $list = [1, 2, 3];
$list[0] = 42;
say $list ~~ OrderedList;
Bạn có thể sử dụng một số thuật sĩ siêu đối tượng để làm cho hệ thống đối tượng tự động kiểm tra loại sau khi bất kỳ cuộc gọi phương thức nào bằng các đối tượng boxing trong các đối tượng bảo vệ trong suốt.
Một thực hiện ngây thơ có thể trông như thế này:
class GuardHOW {
has $.obj;
has $.guard;
has %!cache =
gist => sub (Mu \this) {
this.DEFINITE
?? $!obj.gist
!! "({ self.name(this) })";
},
UNBOX => sub (Mu $) { $!obj };
method find_method(Mu $, $name) {
%!cache{$name} //= sub (Mu $, |args) {
POST $!obj ~~ $!guard;
$!obj."$name"(|args);
}
}
method name(Mu $) { "Guard[{ $!obj.^name }]" }
method type_check(Mu $, $type) { $!obj ~~ $type }
}
sub guard($obj, $guard) {
use nqp;
PRE $obj ~~ $guard;
nqp::create(nqp::newtype(GuardHOW.new(:$obj, :$guard), 'P6int'));
}
Điều này sẽ làm những điều sau thất bại:
my $guarded-list = guard([1, 2, 3], OrderedList);
$guarded-list[0] = 42;
Vâng, theo nghĩa là perl 6 có "loại tùy thuộc vào giá trị", sau đó có chắc chắn rồi. Theo định nghĩa này, C cũng vậy. Nhưng chỉ có các loại được lập chỉ mục không phải là rất hữu ích trong chính nó. – Ven
FWIW, [Tôi cũng coi các vai trò tham số không xâm nhập] (https://github.com/vendethiel/6meta-experiments/blob/master/church.pl), nhưng chỉ có phiên bản 'đếm' hoạt động (không tuân theo chúng khi chạy) .Vai trò sẽ cần một giai đoạn "instantiation" (như C++ mẫu) để có được một cái gì đó giống như các loại phụ thuộc, nhưng đó không phải trên menu :-). – Ven
@Ven Có vẻ như định nghĩa phụ thuộc có thể chấp nhận được có thể giống như "các biến vị ngữ gõ đầy đủ hữu ích/tổng hợp thời gian biên dịch đầy đủ hữu ích phụ thuộc vào các giá trị" sao cho vào năm 2017, các loại chỉ mục vanilla không được tính vì chúng không được coi là hữu ích hoặc đủ chung nhưng loại kiểm tra mà làm cho việc sử dụng phù hợp của một người giải quyết SMT. Vì vậy, ngay cả khi P6 là như vậy mà một trình biên dịch có thể phân tích mệnh đề 'where' và biến' where Int | Str | IntStr' loại ràng buộc vào một thời gian biên dịch-loại kiểm tra (có thể nó bao giờ làm điều đó?), Nó vẫn sẽ không được phụ thuộc gõ. Điều đó có gần không? – raiph