Raku rebless không hoạt động với các lớp kế thừa nữa


9

Mã được đưa ra trong chuỗi này không hoạt động nữa: Làm thế nào tôi có thể rebless một đối tượng trong Perl 6?

Tôi đã viết đoạn mã này vào năm ngoái, và nó đã hoạt động sau đó. Bây giờ nó không:

class Person { ; }
class Woman is Person { ; }
my $tom = Person.new;
my $lisa = Woman.new;

say $tom.^name;  # -> Person
say $lisa.^name; # -> Woman

Metamodel::Primitives.rebless($tom, Woman);
# -> New type Woman for Person is not a mixin type

Thông báo lỗi không có ý nghĩa, vì nó được cho là hoạt động với các lớp được kế thừa. Ít nhất là như vậy.

Các tài liệu không hữu ích; https://docs.raku.org/routine/rebless


Có thể là một lỗi hồi quy. Có lẽ tốt nhất để báo cáo nó như là một vấn đề Rakudo.
jjmerelo

Có một số thay đổi vào tháng 2 năm ngoái: github.com/perl6/nqp/blob/ trên
jjmerelo

Ngoài ra, tôi đã cập nhật tài liệu với chú thích chỉ vào @jnthn trả lời docs.raku.org/type/Metamodel::Primologists . Cảm ơn, raiph
jjmerelo

Câu trả lời:


11

nó được cho là làm việc với các lớp kế thừa

Nó không bao giờ được cho là chung chung. Tôi đã thiết kế API đó và triển khai nó ở nơi đầu tiên và nó chỉ được dự định là một chi tiết triển khai của mixins.

Cho đến gần đây, nó không phải là một phần của bộ kiểm tra đặc tả ngôn ngữ - và khi nó trở thành một phần của nó, nó đã có ngữ nghĩa hiện tại, hạn chế hơn. Các ràng buộc về nó rất quan trọng vì lý do hiệu năng: khi chúng ta biết một loại không phải là mục tiêu của hoạt động mixin, chúng ta có thể truy cập thuộc tính biên dịch JIT trên đối tượng đó thành một thứ đơn giản hơn nhiều (chúng ta đã trả thêm một bước có điều kiện mọi quyền truy cập thuộc tính trước khi thay đổi và bây giờ chỉ phải trả tiền cho các loại mục tiêu mixin).

Có thể sửa đổi chương trình gốc để hoạt động bằng cách sử dụng MOP để xây dựng lớp. Trong thực tế, sau đây không hoàn toàn là chương trình ban đầu; Tôi đã thực hiện một điều chỉnh nhỏ nhằm mục đích cho thấy cách người ta có thể cung cấp các phương thức trong lớp con dưới dạng vai trò ẩn danh, để tránh quá nhiều bản tóm tắt MOP.

class Person { method m() { "person" } }
constant Woman = do {
    my \w = Metamodel::ClassHOW.new_type(:is_mixin, :name<Woman>);
    w.^add_parent(Person);
    w.^add_role(role { method m() { "woman" } });
    w.^compose()
}
my $tom = Person.new;
my $lisa = Woman.new;

say $tom.^name;  # -> Person
say $lisa.^name; # -> Woman

say $tom.m; # person
Metamodel::Primitives.rebless($tom, Woman);
say $tom.m; # woman

Mặc dù đó là cách khắc phục trực tiếp nhất về mặt ngữ nghĩa đối với chương trình gốc, có một cách ngắn hơn: sử dụng buttoán tử trên Personđối tượng loại để tạo ra một loại mixin và trả về nó, sau đó chỉ cần chỉnh tên của nó theo ý thích của bạn:

class Person { method m() { "person" } }
constant Woman = Person but role { method m() { "woman" } }
BEGIN Woman.^set_name('Woman');

my $tom = Person.new;
my $lisa = Woman.new;

say $tom.^name;  # -> Person
say $lisa.^name; # -> Woman

say $tom.m;
Metamodel::Primitives.rebless($tom, Woman);
say $tom.m;

Dù sao chỉ là một dòng so với bản gốc.


constant Woman = Person but role …Không nhận ra rằng điều đó có thể được thực hiện. Và do đó, nhưng đối với BEGINdòng, Raku chỉ cần có khả năng thực hiện một mô hình nguyên mẫu theo phong cách JS!
user0721090601

Đồng ý. Cám ơn vì đã giải thích. Tôi hy vọng rằng nó sẽ tìm được tài liệu của mình, vì docs.raku.org/routine/rebless khá vô dụng ... Tôi sẽ cập nhật «Bắt đầu Raku» ngay.
Arne Sommer

@ user0721090601 Raku hỗ trợ, trích dẫn S12: "cả lập trình OO dựa trên lớp và nguyên mẫu" . Tuy nhiên, nếu bạn xây dựng các đối tượng bằng classtừ khóa , sau đó, trích dẫn lại S12: "theo mặc định, các đối tượng xuất phát từ Muhỗ trợ mô hình dựa trên lớp khá chuẩn ... bless... gọi ... các thói quen BUILD ... ngữ nghĩa BUILD mặc định là được thừa hưởng từ Mu". Tóm lại, tôi cho rằng chính xác hơn khi nói rằng Raku hỗ trợ A) "làm cong vênh nghiêm trọng ngay cả OO dựa trên lớp tiêu chuẩn không có thật chỉ với một vài dòng mã" B) "OO dựa trên nguyên mẫu."
raiph

Xem raku-musings.com/reblished.html để biết quan điểm của tôi về việc phá vỡ các thay đổi.
Arne Sommer

5

Xem câu trả lời của jnthn để thảo luận có thẩm quyền về chính xác những gì đã xảy ra reblessvà phải làm gì về nó.

nó đã hoạt động ... Bây giờ thì không .. Thông báo lỗi không có ý nghĩa ... nó được cho là hoạt động với các lớp được kế thừa ... Ít nhất là ... Tài liệu này không hữu ích

Câu trả lời (cực dài này!) Có thể đáng để đọc cho những người quan tâm thảo luận thêm về các nguyên tắc và thực hành phương pháp TDD làm cơ sở cho ngôn ngữ lập trình Raku và các tạo tác liên quan như trình biên dịch Rakudo và nội dung docs.raku.org .

Câu trả lời này được cấu trúc như các câu trả lời cụ thể cho các phần cụ thể của câu hỏi ban đầu của Arne và các nhận xét mà họ đã viết để trả lời cho phiên bản trước của câu trả lời này. Mục đích của tôi là làm cho Arne trở nên hữu ích hơn trong khi, hy vọng, vẫn hữu ích với người khác.

Arne: Mã được đưa ra trong chuỗi này không còn hoạt động nữa: Làm thế nào tôi có thể từ chối một đối tượng trong Raku?

Tôi đã cập nhật câu trả lời được chấp nhận cho SO đó để liên kết với SO này.

Arne: Tôi đã viết đoạn mã này vào năm ngoái, và nó đã hoạt động sau đó. Bây giờ thì không

Thay đổi có liên quan đã được thảo luận trong một cam kết tháng 4 năm 2019, trong đó jnthn đã viết:

Gần đây, các loại là mục tiêu của một reblesshoạt động bắt đầu cần được tạo rõ ràng dưới dạng các loại mục tiêu mixin, để hỗ trợ tối ưu hóa. ...

Trong một bình luận 11 ngày trước khi kết thúc vấn đề rakudo GH "Không cần thiết cho một loại tùy chỉnh dường như không còn hoạt động" , ông đã viết:

Bạn sẽ cần sắp xếp để is_mixinchuyển đối số được đặt tên sang ClassHOW.new_type... Không có cách nào để làm điều đó với cú pháp lớp, do đó, loại mục tiêu của rebless cũng phải được lắp ráp bằng MOP.

(Nhấp vào liên kết ở trên để ghi chú về cách thực hiện những gì nó gợi ý.)

Vấn đề này cũng được thảo luận thêm một chút trong khi nó hoạt động ... đột nhiên nó không ... tài liệu ... nên ghi lại phần cuộc gọi bên dưới.

Arne: nó được cho là làm việc với các lớp kế thừa. Ít nhất là như vậy.

rang - e eectective o f a ll s pec t ests - xác định mã Raku phải làm gì. ( St của roa st có thể được đọc là s upposed t o s.)

Trong một tin nhắn tháng 4 năm 2019 khác jnthn đã viết:

Không có thông số kỹ thuật trước đó cho Metamodel::Primitives.rebless. Tôi đã thêm cảnh này để bây giờ có. Điều này có nghĩa là bây giờ có một số định nghĩa về những gì có thể được dự kiến ​​sẽ làm việc.

Việc hành vi của Rakudo được bộ công cụ kiểm tra thực thi xác định là một phần cơ bản trong cách tiếp cận của @ Larry để đảm bảo Raku hành xử đáng tin cậy [1] và có ý nghĩa sâu sắc [2] .

Tác động của thay đổi này đối với một mô-đun được sử dụng rộng rãi

Dưới đây là ảnh chụp nhanh về tác động của thay đổi này mở ra cho mô-đun Inline :: Perl5 phổ biến.

Vào tháng 4 năm 2019, niner đã mở một vấn đề rakudo GH về tác độngInline::Perl5 và tôi đã trích xuất một số điểm nổi bật của việc trao đổi giữa niner và jnthn dưới đây.

(Tôi đã bỏ qua một số nội dung quan trọng trong bối cảnh ban đầu, nhưng gây mất tập trung trong bối cảnh của SO này. Xin đừng cho rằng bạn đã hiểu đầy đủ về cuộc trò chuyện ban đầu từ trích xuất này. Nếu nghi ngờ, hãy nhấp vào liên kết. )

niner: TBH những gì tôi làm ở đây có lẽ lúc nào cũng tanh tanh ... Thậm chí có thể là ... tôi có thể thoát khỏi [nó] ... Sẽ rất tuyệt nếu tiếp tục triển khai các phiên bản Inline :: Perl5 .

jnthn: Không có thông số kỹ thuật trước đó cho Metamodel::Primitives.rebless. Tôi đã thêm [a] phổ biến để bây giờ có. Điều này có nghĩa là bây giờ có một số định nghĩa về những gì có thể được dự kiến ​​sẽ hoạt động và Inline :: Perl5 có thể dựa vào đâu.

Do các tham số có tên không xác định bị bỏ qua, nhưng :mixinkhông bắt buộc trên các phiên bản Rakudo trước đó, nên có thể tạo một bản phát hành Inline :: Perl5 mới có thể hoạt động trên các phiên bản Rakudo trước đó cũng như phiên bản sắp tới, vì vậy ít nhất có thể có trở lại compat.

Tôi không nghĩ có bất kỳ cách nào để giữ mọi thứ hoạt động cho các phiên bản Inline :: Perl5 hiện có ...

niner: Thật không may, việc vượt qua :mixinkhông giúp ích gì trong trường hợp này vì việc rebless được thực hiện trên một lớp con của lớp được tạo thông qua Metamodel::Primitives.create_type. Các lớp con sử dụng bình thường Perl6::ClassHOW.

Tôi đang làm việc trên một công cụ tái cấu trúc lớn để thoát khỏi vụ hack không hồi phục ngay từ đầu. Tôi đang mở lại vấn đề này để người quản lý phát hành biết rằng không có Inline :: Perl5 hoạt động trên ứng cử viên phát hành của rakudo.

jnthn: Bạn có tạo lớp đó bằng MOP không? Bạn có thể vượt qua :is_mixinđể Perl6::ClassHOW.new_typenếu như vậy.

niner: Không, đó là tình huống này:class Bar is Foo { }

Giúp đỡ với các tài liệu

Trong một bình luận bên dưới câu trả lời này bạn đã viết:

Tôi có thể giúp với phần tài liệu

Điều đó nghe có vẻ như là một phản ứng rất phù hợp và hữu ích cho vấn đề cốt lõi của SOQ của bạn. Tôi hy vọng rằng chúng ta đủ may mắn để điều này xảy ra.

nếu điều đó giúp

Imo bài viết kỹ thuật của bạn là tuyệt vời vì vậy tôi hy vọng rằng kết quả cuối cùng của việc bạn làm việc với những người khác liên quan đến việc cải thiện nó sẽ là một điều tuyệt vời.

Những hạn chế cơ bản về nội dung của docs.raku.org

Một phần lớn lý do tôi đã viết phần còn lại của câu trả lời rất rộng rãi này cho một câu hỏi có vẻ đơn giản như vậy, và đã khôi phục nó sau khi xóa nó ngay khi Jonathan trả lời, là để thảo luận về các nguyên tắc và thực hành của phương pháp TDD mà nền tảng hoạt động ngôn ngữ lập trình Raku và các tạo phẩm liên quan như trình biên dịch Rakudo và nội dung docs.raku.org .

Aiui, mối quan hệ mong muốn giữa cách mọi thứ được cho là hoạt động ở Raku và cách chúng thực sự hoạt động ở Rakudo và cách mọi thứ được ghi lại trên docs.raku.org nắm rõ:

  • Tất cả mọi thứ PHẢI được coi là mãi mãi tuân theo bản chất cơ bản của một dự án tình nguyện; và, trong giới hạn đó:

  • Hành vi trong rang NÊN được ghi lại và các hành vi khác KHÔNG NÊN.

.

Tài liệu vô dụng

Tài liệu này không hữu ích

Tôi coi đây là một nhận xét công bằng. Tất cả những điều được xem xét, tài liệu như khi bạn viết câu hỏi của bạn không hữu ích.

tài liệu là vô dụng [năm 2018]

Đây là một tuyên bố rất khác nhau.

Không có mục rang bao gồm reblesstại thời điểm đó.

Nếu trang docs.raku.org trên rebless đã mô tả hành vi của nó như năm 2018, thì điều đó sẽ tồi tệ hơn vô dụng vì nó sẽ gợi ý không chính xác rằng hành vi hiện tại được hỗ trợ. Trong thực tế, có phạm vi để nó phá vỡ phiên bản tương lai của Rakudo mà không có triển vọng hợp lý, hành vi năm 2018 sẽ được phục hồi bởi các nhà phát triển cốt lõi. Và thực sự điều này đã đi qua: hành vi không được hỗ trợ của nó từ năm 2018 đã bị phá vỡ, và không được phục hồi.

Vì vậy, với sự đồng thuận về những gì thuộc về docs.raku.org và những gì không (xem ở trên), điều hữu ích nhất mà reblesstrang của nó có thể làm là không tài liệu nào reblesscả, hoặc có lẽ tốt hơn, bao gồm một trang cho nó nhưng đảm bảo nó không mô tả hành vi của nó. Đó là những gì tình hình đã xảy ra: trang đã tồn tại; không trực tiếp hữu ích; và điều đó được cho là tốt hơn không có gì.

. Trong một nhận thức rằng chức năng đó không được bao phủ bởi rang. Điều đó nói rằng, trong khi tính năng tài liệu này rất dễ hình dung , ai sẽ thực hiện nó? Thật dễ dàng để tưởng tượng rằng nó có thể mất một năm lịch hoặc nhiều công việc cần mẫn hơn và hợp tác để thực hiện và triển khai một cách hữu ích, và rằng dân gian nghĩ rằng những thứ khác quan trọng hơn.)

nó hoạt động ... nó đột nhiên không ... tài liệu ... nên ghi lại cuộc gọi

nó đã làm việc

Đó là "may mắn" nó hoạt động.

nó đột nhiên không hoạt động nữa

Bởi vì Rakudo đã được cải thiện.

tài liệu ... nên ghi lại cuộc gọi

Như đã giải thích trước đó, aiui sự đồng thuận của cộng đồng hiện tại và / hoặc thực tiễn làm việc là: tài liệu NÊN ghi lại một phiên bản cụ thể của cuộc gọi, cụ thể là hành vi rang cho phiên bản Rakudo trong Rakudo Star mới nhất; và CÓ THỂ tài liệu hành vi trong các phiên bản khác.

và không đề cập đến cái gì khác

Aiui, sự đồng thuận hiện tại và / hoặc thực tiễn làm việc là những gì mà một số người có thể coi là đóng góp tài liệu "yếu", ví dụ như một số nội dung ngắn gọn, được viết vội vàng và / hoặc liên kết bên ngoài tài liệu, CÓ THỂ được giới thiệu nếu các tình nguyện viên cảm thấy một sự thay đổi ngay lập tức được phản ánh một số lo ngại được đưa ra bởi một người dùng (ví dụ SO này) và việc thực hiện thay đổi "yếu" sẽ tốt hơn là không làm gì cả. Tất nhiên bạn có thể thực hiện PR để cải thiện nó (hoặc hoàn nguyên nó nếu bạn thực sự cảm thấy rằng một sự thay đổi quá "yếu" khiến vấn đề trở nên tồi tệ hơn).

tham chiếu đến các thay đổi trong năm 2019.11 là 7 tháng.

(Tính của tôi cũng giống như vậy, mặc dù tôi đã thấy một trình biên dịch tự xưng là 2019.03.1 với hành vi tương tự. [3] )

Tôi nghĩ JJ đã làm cho tài liệu thay đổi và anh ấy chỉ giải thích sai nhận xét của jnthn về cách thích ứng với thay đổi. Tôi hiện đang nghĩ rằng tốt hơn là không có gì nhưng mong bạn cập nhật nó. :)

Chú thích

[1] Những điều sau đây được nói vài phút sau khi Larry lần đầu tiên công bố dự án dẫn đến Raku trong bài phát biểu "State of the Onion" năm 2000 của mình :

Câu hỏi: [Raku] sẽ có thông số kỹ thuật?

Larry: điều chúng tôi đặc biệt muốn nhấn mạnh ... có lẽ không phải là [thiết kế ngôn ngữ] khi phát triển bài kiểm tra hồi quy hiện tại của chúng tôi ... thành một bài kiểm tra xác thực về ý nghĩa của ngôn ngữ và thực sự đi ra ngoài và khám phá tất cả các ngóc ngách và crannies và nói, Đây là [Raku], đây không phải là [Raku], và sau đó chúng tôi thực sự có một thông số kỹ thuật có thể đọc được bằng máy. Và đối với tôi điều đó thực sự quan trọng hơn rất nhiều so với những gì diễn đạt trong điều có thể đọc được của con người nói.

[2] Tất nhiên, rang chỉ hoạt động tốt đối với một người dùng nhất định nếu các thử nghiệm của nó đủ đáp ứng nhu cầu của người dùng. Vấn đề của Arne cho thấy những lỗ hổng trong phạm vi bảo hiểm có thể gây ngạc nhiên như thế nào. Để thảo luận về các lỗ hổng này khi chúng đứng vào năm 2018, hãy xem Trên Thông số kỹ thuật, Phiên bản, Thay đổi và Phá vỡ . Tin tốt là rang chỉ là rất nhiều bài kiểm tra đơn vị được viết bằng Raku để kiểm tra các biểu thức hoặc cấu trúc với các giá trị cụ thể làm một việc cụ thể. Vì vậy, thật dễ dàng cho các cá nhân hoặc tập đoàn đóng góp các thử nghiệm mới để cải thiện phạm vi thử nghiệm. Và tất cả đều nằm dưới sự kiểm soát phiên bản (git), do đó, các thẻ, nhánh và nhánh tùy chỉnh là khả thi, bền vững và có thể quản lý được. (Trên thực tế, đó là cách mới phiên bản ngôn ngữ ( Christmas, Diwali, Eid(?), Vv) được quản lý.)

[3] Tôi đã thấy một nỗ lực để từ chối một lớp mới được tạo bằng newclass is oldclasscú pháp thông thường cả trên công việc (trên máy tính xách tay của tôi)không hoạt động (trên repl.it) bằng các trình biên dịch tự xưng 2019.03.1. (Có thể cài đặt lại một phiên bản mã nguồn của trình biên dịch hoặc một tệp nhị phân được biên dịch từ nó, được lấy từ đầu chính ngay sau khi phiên bản của trình biên dịch được cập nhật 2019.03.1, với sự thay đổi đột phá. Tôi lưu ý rằng thay thế. Tôi đã công khai thay thế raku trực tuyến của họ - Tôi đã phát hiện ra nó một cách tình cờ - vì vậy không có gì bất ngờ về tình huống này nhưng nó củng cố cho tôi nhu cầu về $RAKU.compiler.verbose-configphương pháp được sử dụng trong các đầu ra bị hỏng / tôi vừa liên kết.)


Tôi đã tìm thấy bài viết này khi tôi cố gắng tìm ra cách "rebless" hoạt động, vì tài liệu này là vô dụng: stackoverflow.com/questions/44486985/ Lỗi Và nó đã hoạt động. Và sau đó nó đột nhiên không hoạt động nữa, và tài liệu vẫn vô dụng. Nó vẫn là, vì nó nên ghi lại cuộc gọi, và không đề cập đến một cái gì khác. Và tài liệu tham khảo về các thay đổi trong năm 2019.11 là 7 tháng.
Arne Sommer

Tôi có thể giúp với phần tài liệu, nếu điều đó giúp.
Arne Sommer

@ArneSommer Vui lòng xem các phần mới trong câu trả lời của tôi bắt đầu bằng Trợ giúp với các tài liệu .
raiph

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.