Gleam में हायर ऑर्डर फंक्शन लिखना और इस्तेमाल करना आम बात है, यानी ऐसे फंक्शन जो दूसरे फंक्शन को आर्गुमेंट के रूप में लेते हैं। कभी-कभी एक साथ कई हायर ऑर्डर फंक्शन इस्तेमाल करने पर कोड में इंडेंटेशन की कई परतें हो जाती हैं और उसे पढ़ना मुश्किल हो जाता है।
उदाहरण के लिए, यहाँ एक फंक्शन है जो ऐसे कई फंक्शन कॉल करता है जो Result(Int, Nil) लौटाते हैं, और अगर चारों सफल होते हैं तो उन वैल्यू को जोड़ देता है।
import gleam/result
pub fn main() -> Result(Int, Nil) {
result.try(function1(), fn(a) {
result.try(function2(), fn(b) {
result.try(function3(), fn(c) {
result.try(function4(), fn(d) {
Ok(a + b + c + d)
})
})
})
})
}
Gleam के use एक्सप्रेशन की मदद से हम यह कोड बिना इंडेंटेशन के लिख सकते हैं, जिससे यह अक्सर पढ़ने में आसान हो जाता है।
import gleam/result
pub fn main() -> Result(Int, Nil) {
use a <- result.try(function1())
use b <- result.try(function2())
use c <- result.try(function3())
use d <- result.try(function4())
Ok(a + b + c + d)
}
एक use एक्सप्रेशन ब्लॉक के बाद आने वाले सारे स्टेटमेंट इकट्ठा करता है और उन्हें कॉलबैक फंक्शन के रूप में फंक्शन कॉल के अंतिम आर्गुमेंट की तरह भेज देता है। use कीवर्ड और <- चिह्न के बीच लिखे गए वेरिएबलो ही उन आर्गुमेंट के नाम होते हैं जो कॉलबैक फंक्शन को भेजे जाएँगे।
// This use expression
use a <- function(1, 2)
io.println("Hello!")
a
// Is equivalent to this normal function call
function(1, 2, fn(a) {
io.println("Hello!")
a
})
कॉलबैक फंक्शन कितने भी आर्गुमेंट ले सकता है, या एक भी नहीं।
use a, b, c, d <- call_4_function()
use <- call_0_function()
use एक्सप्रेशन की मदद से कॉल की जा सकने वाली फंक्शन बनाने के लिए कोई खास शर्त नहीं है, बस अंतिम आर्गुमेंट के रूप में एक कॉलबैक फंक्शन लेना ज़रूरी है।
pub fn call_twice(function: fn() -> t) -> #(t, t) {
let first = function()
let second = function()
#(first, second)
}
Gleam के use एक्सप्रेशन एक बहुत शक्तिशाली फीचर हैं जिन्हें ढेर सारी समस्याओं पर लागू किया जा सकता है, लेकिन ज़रूरत से ज़्यादा इस्तेमाल करने पर ये कोड को पढ़ना मुश्किल बना सकते हैं। आम तौर पर सामान्य फंक्शन कॉल सिंटैक्स ही इस्तेमाल करना बेहतर होता है, और use एक्सप्रेशन तभी उठाना चाहिए जब वे कोड को पढ़ने में आसान बनाते हों।
डैफ्नी एक ऐसे सिस्टम पर काम कर रही हैं जो उनके प्रयोग चलाता है और उनके परिणाम रिकॉर्ड करता है। कोड का कुछ हिस्सा थोड़ा लंबा और दोहराव वाला हो गया है, इसलिए उन्होंने आपसे कहा है कि इस कोड को साफ करने के लिए आप कुछ use एक्सप्रेशन लिखिए।
with_retry फंक्शन बनाइएकभी-कभी कोई प्रयोग किसी एक बार हुई गलती की वजह से विफल हो सकता है, इसलिए अगर कोई प्रयोग विफल हो जाए, तो डैफ्नी उसे दोबारा चलाकर देखना चाहती हैं कि वह दूसरी बार काम करता है या नहीं।
with_retry फंक्शन बनाइए, जो आर्गुमेंट के रूप में एक ऐसा फंक्शन लेता है जो परिणाम लौटाता है।
अगर वह फंक्शन Ok वैल्यू लौटाता है, तो with_retry को वही वैल्यू लौटानी चाहिए।
अगर वह फंक्शन Error वैल्यू लौटाता है, तो with_retry को उस फंक्शन को दोबारा कॉल करना चाहिए और उस कॉल का परिणाम लौटाना चाहिए।
डैफ्नी इस फंक्शन का इस्तेमाल ऐसे करेंगी:
pub fn main() {
use <- with_retry
// Perform the experiment here
}
record_timing फंक्शन बनाइएडैफ्नी हर प्रयोग से पहले और बाद में टाइम लॉगिंग फंक्शन कॉल करके रिकॉर्ड करती हैं कि हर प्रयोग को चलने में कितना समय लगता है।
record_timing फंक्शन बनाइए, जो दो आर्गुमेंट लेता है:
Nil लौटाता है।record_timing को पहले टाइम लॉगिंग फंक्शन कॉल करना चाहिए, फिर प्रयोग फंक्शन कॉल करना चाहिए, फिर दोबारा टाइम लॉगिंग फंक्शन कॉल करना चाहिए, और अंत में प्रयोग फंक्शन का परिणाम लौटाना चाहिए।
डैफ्नी इस फंक्शन का इस्तेमाल ऐसे करेंगी:
pub fn main() {
use <- record_timing(time_logger)
// Perform the experiment here
}
run_experiment फंक्शन बनाइएप्रयोग तीन चरणों से बने होते हैं: सेटअप, एक्शन और रिकॉर्डिंग। तीनों चरण परिणाम लौटाते हैं, और हर चरण को चलने के लिए पिछले चरण के सफल परिणाम की ज़रूरत होती है।
run_experiment फंक्शन बनाइए, जो चार आर्गुमेंट लेता है:
String के रूप में।Ok वैल्यू को आर्गुमेंट के रूप में लेता है और परिणाम लौटाता है।Ok वैल्यू को आर्गुमेंट के रूप में लेता है और परिणाम लौटाता है।अगर तीनों फंक्शन सफल होते हैं, तो run_experiment को Ok(#(experiment_name, recording_data)) लौटाना चाहिए।
अगर इनमें से कोई भी फंक्शन Error वैल्यू लौटाता है, तो run_experiment को वही वैल्यू लौटानी चाहिए।
डैफ्नी इस फंक्शन का इस्तेमाल ऐसे करेंगी:
pub fn main() {
use setup_data, action_data <- run_experiment("Test 1", setup, action)
// Record the results here
}
Exercism पर साइन अप कीजिए और Gleam को 33 कॉन्सेप्ट122 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।