রাকুতে একটি মডিউলে প্রিলেড মডিউলগুলির মতো হাস্কেল ব্যবহার করুন


11

আমি কিছু অংশ দিয়ে একটি অঙ্কন প্যাকেজ লিখছি, এবং আমার অপারেটর এবং ডেটা ধরণের ছড়িয়ে ছিটিয়ে আছে rou তবে আমি চাই না যে প্রতিবার ব্যবহারকারীরা সংশ্লিষ্ট মডিউলগুলি যুক্ত করুন, কারণ এটি যথেষ্ট অগোছালো হবে, উদাহরণস্বরূপ আমি এর মতো বিভিন্ন পথে একটি Pointক্লাস, Monoidভূমিকা এবং একটি Styleশ্রেণি চাই have

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 {...}

আমি এই জাতীয় স্ক্রিপ্টগুলি লিখতে পারি এমন প্রভাবটির সাথে একটি haskellপছন্দসই উপস্থাপনা করতে চাইlib/Package/Prelude.pm6

use Package::Prelude;

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

পরিবর্তে না

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

আমি অনেক কিছুই চেষ্টা করেছি:

  • এই সংস্করণটি আমাকে সঠিক প্রভাব দেয় না, আমাকে পয়েন্ট পর্যন্ত পুরো পথটি টাইপ করতে হবে, Package::Data::Point...
unit module Package::Prelude;
# $?FILE = lib/Package/Prelude.pm6
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;
  • এই সংস্করণটি Pointএখনই আমাকে দেয় , তবে আমি অপারেটরগুলির সাথে সমস্যা পেতে শুরু করি এবং এছাড়াও, আমি উল্লিখিত উদাহরণ প্যাকেজগুলিতে রফতানি রুটিনগুলি থেকে স্বয়ংক্রিয়ভাবে সমস্ত কিছু যুক্ত করতে চাই।
# $?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
     ...
}

আপনি কি এই জাতীয় উপস্থাপনের মতো ফাইল পাওয়ার আরও ভাল এবং দ্রুত উপায় জানেন?


আপনি ব্যবহার করতে পারেন unit class Package::Data::Point। আপনি ব্যবহার করতে হবে না module
ব্র্যাড গিলবার্ট

উত্তর:


12

ব্যবহার EXPORTসঠিক পথে is মূল বিষয়গুলি জানতে হবে:

  • আমদানিগুলি লেজিক্যাল
  • আমরা বর্তমান লেক্সিকাল স্কোপগুলিতে প্রতীকগুলি পেতে এবং এটি অ্যাক্সেসের জন্য অন্তরীক্ষণ ব্যবহার করতে পারি

সুতরাং রেসিপিটি হ'ল:

  • use ভিতরে সমস্ত মডিউল EXPORT
  • তারপরে সমস্ত আমদানিকৃত প্রতীকগুলি বের করুন এবং ফলাফল হিসাবে সেগুলি ফিরিয়ে দিন EXPORT

উদাহরণ হিসাবে, আমি Foo::Pointএকটি অপারেটর এবং একটি ক্লাস সহ একটি মডিউল তৈরি করি :

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)
}

এবং, এটি প্রদর্শনের জন্য এটি একাধিক মডিউলগুলির সাথেও কাজ করতে পারে Foo::Monad:

unit module Foo::Monad;

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

লক্ষ্যটি এই কাজটি করা:

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

যা একটি লিখে এটি অর্জন করা যেতে পারে Foo::Prelude:

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

এখানে ব্যাখ্যা করার জন্য কয়েকটি অদ্ভুততা রয়েছে:

  1. একটি subঅন্তর্নিহিত ঘোষণা হয়েছে $_, $/এবং $!। এগুলি রফতানির ফলে মডিউলটি use'd' হয়ে গেলে একটি সংকলন-সময়ের প্রতীক সংঘর্ষ ত্রুটি হতে পারে । একটি ব্লকে কেবল অন্তর্ভুক্ত থাকে $_। এভাবে আমরা নেস্টেড বেয়ার ব্লক দিয়ে আমাদের জীবনকে আরও সহজ করে তুলি।
  2. grepনিশ্চিত আমরা আমাদের পরোক্ষভাবে ঘোষণা রপ্তানি না করা হয় $_(নেস্টেড ব্লক ধন্যবাদ, এটি শুধুমাত্র এক আমরা যত্নের আছে) প্রতীক।
  3. ::বর্তমান সুযোগটি উল্লেখ করার একটি উপায় (ব্যুৎপত্তি: ::প্যাকেজ বিভাজক)। ::.pairsসুতরাং Pairবর্তমান সুযোগে প্রতিটি প্রতীক জন্য বস্তু প্রাপ্ত ।

একটি অনুমানিত পুনরায় রফতানি ব্যবস্থা রয়েছে যা ভবিষ্যতে রাকু ভাষার প্রকাশে উপস্থিত হতে পারে যা এই বিট বয়লারপ্লেটের প্রয়োজনীয়তা দূর করবে।


অবশেষে, আমি ঠিক সেই আচরণটিই খুঁজছিলাম, অনেক ধন্যবাদ!
মার্গোয়ালারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.