Sử dụng các mô đun Haskell như Prelude trong một mô-đun trong raku


11

Tôi đang viết một gói bản vẽ với một số phần, và tôi có các toán tử và kiểu dữ liệu rải rác. Tuy nhiên tôi không muốn người dùng thêm các mô-đun tương ứng mỗi lần, vì nó sẽ khá lộn xộn, ví dụ tôi có một Pointlớp, một Monoidvai trò và một Stylelớp trong các đường dẫn khác nhau như thế này

unit module Package::Data::Monoid;
# $?FILE = lib/Package/Data/Monoid.pm6

role Monoid {...}
unit module Package::Data::Point;
# $?FILE = lib/Package/Data/Point.pm6

class Point {...}
unit module Package::Data::Style;
# $?FILE = lib/Package/Data/Style.pm6

class Style {...}

Tôi muốn có một haskellkhúc dạo đầu giống như lib/Package/Prelude.pm6 hiệu ứng mà tôi có thể viết các kịch bản như vậy

use Package::Prelude;

# I can use Point right away, Style etc...

thay vì làm

use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;

# I can too use point right away, but for users not knowing the
# inner workings it's too overwhelming

Tôi đã thử nhiều thứ:

  • Phiên bản này không mang lại cho tôi hiệu ứng phù hợp, tôi phải nhập toàn bộ đường dẫn đến điểm, tức là Package::Data::Point...
unit module Package::Prelude;
# $?FILE = lib/Package/Prelude.pm6
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;
  • Phiên bản này cung cấp cho tôi Pointngay lập tức, nhưng tôi gặp vấn đề với các nhà khai thác, v.v., tôi cũng muốn thêm tự động mọi thứ từ các thói quen được xuất trong các gói ví dụ đã đề cập.
# $?FILE = lib/Package/Prelude.pm6
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;

sub EXPORT {
  hash <Point> => Point
     , <Style> => Style
     , <mappend> => &mappend
     ...
}

Bạn có biết một cách tốt hơn và nhanh chóng để có được một tập tin giống như khúc dạo đầu không?


Bạn có thể sử dụng unit class Package::Data::Point. Bạn không phải sử dụng module.
Brad Gilbert

Câu trả lời:


12

Sử dụng EXPORTlà đúng hướng. Những điều quan trọng cần biết là:

  • Nhập khẩu là từ vựng
  • Chúng ta có thể sử dụng hướng nội để có được và truy cập các ký hiệu trong phạm vi từ vựng hiện tại

Vì vậy, công thức là:

  • use tất cả các mô-đun bên trong EXPORT
  • Sau đó trích xuất tất cả các biểu tượng đã nhập và trả lại chúng là kết quả từ EXPORT

Ví dụ, tôi tạo một mô-đun Foo::Point, bao gồm một toán tử và một lớp:

unit module Foo::Point;

class Point is export {
    has ($.x, $.y);
}

multi infix:<+>(Point $a, Point $b) is export {
    Point.new(x => $a.x + $b.x, y => $a.y + $b.y)
}

Và, chỉ để chứng minh rằng nó có thể hoạt động với nhiều mô-đun, cũng là Foo::Monad:

unit module Foo::Monad;

class Monad is export {
    method explain() { say "Just think of a burrito..." }
}

Mục tiêu là để thực hiện công việc này:

use Foo::Prelude;
say Point.new(x => 2, y => 4) + Point.new(x => 3, y => 5);
Monad.explain;

Điều này có thể đạt được bằng cách viết một Foo::Preludecó chứa:

sub EXPORT() {
    {
        use Foo::Point;
        use Foo::Monad;
        return ::.pairs.grep(*.key ne '$_').Map;
    }
}

Có một vài điều kỳ lạ ở đây để giải thích:

  1. Một subcó tờ khai ngầm của $_, $/$!. Việc xuất những thứ này sẽ dẫn đến lỗi xung đột biểu tượng thời gian biên dịch khi mô-đun là use'd. Một khối chỉ có một ẩn $_. Do đó, chúng tôi làm cho cuộc sống của chúng tôi dễ dàng hơn với một khối trần lồng nhau.
  2. Điều grepnày là để đảm bảo chúng ta không xuất $_biểu tượng được khai báo ngầm (nhờ vào khối lồng nhau, đó là thứ duy nhất chúng ta phải quan tâm).
  3. ::là một cách để tham chiếu phạm vi hiện tại (từ nguyên: ::là dấu tách gói). ::.pairsdo đó có được Paircác đối tượng cho mỗi biểu tượng trong phạm vi hiện tại.

Có một cơ chế tái xuất được suy đoán có thể xuất hiện trong một bản phát hành ngôn ngữ Raku trong tương lai sẽ loại bỏ sự cần thiết của bản tóm tắt này.


Cuối cùng, đây chính xác là hành vi mà tôi đang tìm kiếm, cảm ơn rất nhiều!
margolari
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.