नेस्टेड सूचियों के लिए मानचित्र
कहो कि आपको मैट्रिक्स की तरह एक नेस्टेड सूची मिली है:
[[0 1 2][3 4 5][6 7 8]]
या तार की एक सरणी:
["foo""bar"]
और आप नेस्टेड स्तर पर एक ब्लॉक मैप करना चाहते हैं (यानी इसे प्रत्येक नंबर या प्रत्येक वर्ण पर लागू करें)। भोला समाधान एक नेस्टेड है %:
{{...}%}%
हालाँकि, आप वास्तव में आंतरिक ब्लॉक को स्टैक पर धक्का दे सकते हैं और फिर उपयोग कर सकते हैं f%। f"अतिरिक्त पैरामीटर वाला मानचित्र" है, इसलिए यह %बाहरी पैरामीटर पर मैप करेगा , ब्लॉक को दूसरे पैरामीटर के रूप में उपयोग करेगा:
{...}f%
दो बाइट बचाता है।
ऐसा करने के लिए एक और साफ-सुथरी चाल for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}है
5,_f{f{...}}
बाहरी fपहली सीमा पर मैप करेगा, दूसरे रेंज को अतिरिक्त पैरामीटर के रूप में आपूर्ति करेगा। लेकिन अब, यदि आप fफिर से उपयोग करते हैं, तो केवल शीर्ष स्टैक तत्व एक सरणी है, इसलिए आप fउस पर आंतरिक ब्लॉक को मैप करते हैं, बाहरी "पुनरावृत्ति चर" को एक अतिरिक्त पैरामीटर के रूप में आपूर्ति करते हैं। इसका मतलब यह है भीतरी ब्लॉक के साथ रन है iऔर jढेर पर।
इसमें वर्णों की समान संख्या होती है, जैसे किसी कार्टेशियन उत्पाद पर ब्लॉक को मैप करना (हालाँकि उत्तरार्द्ध छोटा हो जाता है यदि आपको एरियर्स के रूप में जोड़े की आवश्यकता होती है):
5,_m*{~...}%
अंतर यह है कि यह संस्करण सभी जोड़ों के लिए परिणामों की एक एकल सरणी देता है, जबकि डबल- fएक नेस्टेड सूची देता है, जो उपयोगी हो सकता है यदि आप परिणामों को ग्रिड में संग्रहित करना चाहते हैं, तो पुनरावृत्त चर निर्देशांक होते हैं।
मुझे यह चाल दिखाने के लिए डेनिस का धन्यवाद।
0.6.4 अपडेट करें
fऔर :अब खुद सहित किसी अन्य ऑपरेटर को ले कर बहुत सुधार हुआ है। इसका मतलब है कि आप अभी और भी बाइट्स बचा सकते हैं। नेस्टेड सूची पर ऑपरेटर को मैप करना अब और कम हो गया है:
{:x}%
{x}f%
::x
यह वास्तव में नेस्टेड सूचियों पर ब्लॉक मैपिंग के साथ मदद नहीं करता है।
कार्टेसियन उत्पाद के लिए ब्लॉक या ऑपरेटरों को लागू करने के लिए, यह अब ब्लॉक के साथ-साथ ऑपरेटरों के लिए भी छोटा हो गया है:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
क्या अच्छा है कि आप अब इन घोंसला बना सकते हैं। इसलिए आप किसी ऑपरेटर को किसी सूची में तीसरे स्तर तक आसानी से लागू कर सकते हैं:
:::x
या कुछ चाल के साथ एक ब्लॉक:
{...}ff%