क्या एक प्रतीक को सुरक्षित रूप से पुन: व्यवस्थित करने का एक तरीका है?


9

मैं अक्सर खुद को REPL में प्रयोग करता हुआ पाता हूं और मैं कुछ ऐसा कहूंगा:

subset Bar of Int where * %% 57;

फिर मैं Barकुछ चीजों के लिए -ness पर चेक के साथ खेलता हूं ।

सब कुछ खुश है, जब तक मुझे एहसास नहीं होता कि मैं परिभाषा बदलना चाहता हूं Bar

अगर मैं सिर्फ पुनर्परिभाषित करता Barहूं, तो मुझे एक Redeclaration of symbolअपवाद मिलता है।

मैंने इसका उपयोग करने MONKEY-TYPINGऔर augmentइस तरह की कोशिश की :

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

लेकिन मुझे वही त्रुटि हुई।

मुझे यह क्यों चाहिए? इसलिए मैं अपने सबसेट (या वर्ग, या अन्य प्रतीक) परिभाषाओं पर पुनरावृत्ति कर सकता हूं, उन परीक्षणों का पुन: उपयोग करते हुए मैंने पहले से ही टाइप किया है जो मेरे इतिहास में हैं।

जवाबों:


3

मुझे लगता है कि आरईपीएल अपने जादू 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+ enclosing पैकेज के लिए प्रतीक जोड़ना ...; यदि आप प्रतीक को पैकेज से हटाते हैं, तो आप इसे बाद में फिर से छाया कर सकते हैं:

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
AFAIK, आप केवल कक्षा में सामान जोड़ने के लिए वृद्धि का उपयोग कर सकते हैं । आप जो करने की कोशिश कर रहे हैं वह एक सबसेट की जगह है ।
एलिजाबेथ मैटीजसेन

1
@daotoad को प्रतिस्थापित करने के लिए, आप उपयोग कर सकते हैं supersede, लेकिन मेरा मानना ​​है कि वर्तमान समय में यह लागू नहीं हुआ है।
user0721090601

1
सुपरसेड अभी भी लागू नहीं है, लेकिन यह केवल वैसे भी एक स्थापित मॉड्यूल स्तर पर काम करेगा। सुपरसीड फ़ंक्शन को एक मॉड्यूल को यह इंगित करने की अनुमति देनी चाहिए कि उसे किसी अन्य मॉड्यूल / संस्करण के बजाय लोड किया जाना चाहिए। इसलिए यह CompUnitRepo के लिए एक संकेत है जब पूछा गया कि क्या यह किसी दिए गए मॉड्यूल को प्रदान कर सकता है।
एलिजाबेथ मैटीजसेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.