প্রতীকটি নিরাপদে পুনরায় ঘোষণার কোনও উপায় আছে কি?


9

আমি প্রায়শই নিজেকে আরআরপিএল পরীক্ষায় দেখতে পাই এবং আমি এরকম কিছু বলব:

subset Bar of Int where * %% 57;

তারপরে আমি Barজিনিসগুলির জন্য কিছুটা জন্য চেক দিয়ে ঘুরে দেখি ।

সমস্ত কিছু খুশি, যতক্ষণ না আমি বুঝতে পারি যে আমি এর সংজ্ঞাটি পরিবর্তন করতে চাই Bar

আমি যদি কেবল নতুন সংজ্ঞা দিই তবে আমি Barএকটি Redeclaration of symbolব্যতিক্রম পাই ।

আমি এটি ব্যবহার MONKEY-TYPINGএবং এর augmentমতো চেষ্টা করেছি :

use MONKEY-TYPING;
augment subset Bar of Int where * %% 37;

কিন্তু এটি আমাকে একই ত্রুটি জালিয়েছে।

আমি এটা কেন চাই? আমি ইতিমধ্যে টাইপ করা পরীক্ষাগুলি আমার ইতিহাসে পুনরায় ব্যবহার করার সময় আমি আমার উপসেট (বা শ্রেণি বা অন্যান্য প্রতীক) সংজ্ঞাগুলিতে পুনরাবৃত্তি করতে পারি।

উত্তর:


3

আমি মনে করি যে REPL EVALপ্রতিটি নতুন ইনপুটকে একটি নতুন নেস্টেড লেজিকাল স্কোপ-এ- করে এটির জাদুটির অংশ করে । সুতরাং, যদি আপনি এর সাথে জিনিসগুলি ঘোষণা করেন myতবে আপনি পরে প্রবেশের ঘোষণার সাথে সেগুলি ছায়াতে পারেন:

my subset Bar of Int where * %% 57;
sub take-Bar(Bar $n) { say "$n is Bar" }
take-Bar 57;

my subset Bar of Int where * %% 42;
sub take-Bar(Bar $n) { say "$n is Bar" }
take-Bar 42;

যদি আপনি বাদ দেন myতবে তার জন্য subsetএবং classঘোষণাপত্রগুলি ourব্যবহার করা হবে এবং যেহেতু ourপ্রকৃতপক্ষে my+ বদ্ধ প্যাকেজটিতে প্রতীকটি যুক্ত করা হচ্ছে ...; আপনি যদি প্যাকেজ থেকে প্রতীকটি মুছে ফেলেন তবে আপনি এটির পরে আবার ছায়া ফেলতে পারেন:

subset Bar of Int where * %% 57;
GLOBAL::<Bar>:delete;
subset Bar of Int where * %% 42;
42 ~~ Bar;

দ্রষ্টব্য: এই ফলাফলগুলি কেবলমাত্র REPL- এ আমার পরীক্ষাগুলি থেকে। অন্যান্য অজানা পার্শ্ব প্রতিক্রিয়া আছে কিনা তা আমি নিশ্চিত নই।


8

REPLতার ভুলত্রুটি হয়েছে। এটি EVALবিবৃতিগুলির বিস্তৃত নির্মাণ যা একসাথে কাজ করার চেষ্টা করে। কখনও কখনও যে কাজ করে না।

আমি অনুমান করি যে আমরা সবচেয়ে ভাল করতে পারি, এটি একটি REPL কমান্ড প্রবর্তন করা যা এটি এর আগে যা কিছু করেছিল তা ভুলে যায়। প্যাচ স্বাগত! :-)


সুতরাং যদি আমি সঠিকভাবে বুঝতে পারি তবে আমি সঠিক ট্র্যাকটিতে ছিলাম use MONKEY-TYPINGএবং augmentতারা আরইপিএলে সঠিকভাবে কাজ করে না (এখনও?) কারণ এর জন্য প্রচুর যাদু এবং হাঁসের টেপ দরকার।
দাওতাড

1
আফাইক, আপনি কেবল ক্লাসে স্টাফ যুক্ত করতে অগমেন্ট ব্যবহার করতে পারেন । আপনি যা করার চেষ্টা করছেন সেটি হ'ল একটি উপসেট প্রতিস্থাপন
এলিজাবেথ ম্যাটিজসেন

1
@ দোটোটাড প্রতিস্থাপনের জন্য, আপনি ব্যবহার করতে পারেন supersede, তবে আমি বিশ্বাস করি বর্তমান সময়ে যা অবিবাহিত রয়েছে।
user0721090601

1
সুপারসিড এখনও অব্যবহৃত না হলেও এটি কেবল কোনও ইনস্টলড মডিউল স্তরে কাজ করবে। সুপারসিড ফাংশনটি মডিউলটিকে অন্য মডিউল / সংস্করণের পরিবর্তে লোড করা উচিত তা নির্দেশ করার অনুমতি দেয়। এটি কোনও প্রদত্ত মডিউল সরবরাহ করতে পারে কিনা জিজ্ঞাসা করা হলে এটি CompUnitRepo এর ইঙ্গিত।
এলিজাবেথ ম্যাটিজসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.