किलर अर्ध-अद्वितीय प्रोग्रामिंग भाषा सुविधाएँ [बंद]


25

जब आप एक नई प्रोग्रामिंग भाषा सीखते हैं, तो आप कभी-कभी एक भाषा सुविधा में आते हैं, जिससे आपको लगता है कि यह आपके अन्य प्रोग्रामिंग भाषाओं में है जिसे आप जानते हैं।

भाषा की कौन सी विशेषताएँ हैं जो आपके लिए बहुत नई सीखने के समय थीं और आपकी इच्छा थी कि आपकी अन्य प्रोग्रामिंग भाषाएं हों।

इसका एक उदाहरण पायथन या सी # में जनरेटर है। अन्य उदाहरणों में पायथन में सूची बोध, C ++ में टेम्पलेट या .NET में NETQ या हास्केल में आलसी मूल्यांकन शामिल हो सकते हैं।

आपके पास कौन सी अन्य अर्ध-अद्वितीय भाषा सुविधाएँ हैं जो आपके लिए पूरी तरह से नई और ज्ञानवर्धक थीं? क्या पुरानी प्रोग्रामिंग भाषाओं की अन्य विशेषताएं हैं जो अद्वितीय थीं और फैशन से बाहर हो गईं?

जवाबों:


25

हास्केल में व्यावहारिक रूप से कुछ भी

  • Monads। हां - बड़ा डरावना शब्द जो कि LGdibly आसान पार्सर, IO, सूचियों पर संचालन और अन्य चीजों को इतना आसान बनाता है (एक बार जब आप सामान्य पैटर्न को नोटिस करते हैं)
  • तीर। उन्नत उपयोगकर्ताओं के लिए भी यही);
  • मानक सामान जैसे लंबोदर आदि।
  • करी कार्य
  • बीजीय डेटा प्रकार
  • पैटर्न मिलान

और बहुत सारे।

पुनश्च। हाँ। अगर किसी ने पूछा तो मैं हास्केल फैनबॉय हूं।


12
निष्पक्ष होने के लिए, आपको उस सूची में से अधिकांश के लिए एमएल क्रेडिट देना चाहिए।
उदार

1
अच्छी तरह से - मोनाड और तीर IIRC को छोड़कर। लेकिन वे अभी भी कर रहे हैं अर्द्ध अनोखा
मेसिएज Piechotka

चढ़ाव के लिए कोई विशेष कारण?
मैकीज पीचोटका

2
पैटर्न मिलान के लिए +1। मैं इसे अन्य लोगों को दिखाता हूं और वे इसे प्राप्त नहीं करते हैं। मुझे लगता है कि यह प्रतिभाशाली है।
बैरी ब्राउन

अप्रचलित ( steve-yegge.blogspot.com/2010/12/… )। Btw, मैं शायद ही lambdas को अद्वितीय, अजगर, C #, जावास्क्रिप्ट, आदि मोनाड्स मानूंगा? अधिकांश अन्य भाषाएँ इसे जंजीर के रूप में संदर्भित करती हैं; jquery कोर अनिवार्य रूप से HTML / DOM और AJAX मोनाड (Google: jQuery.fn) का एक विशाल सेट है। करी भी आजकल अपेक्षाकृत आम है।
इवान प्लाइस

21

लिस्प मैक्रोज़।

लिस्प मैक्रो भाषा लिस्प है, सुविधा के लिए कुछ पूर्वनिर्धारित वाक्यविन्यास सुविधाओं के साथ। उनका उपयोग करते हुए, भाषा की प्रमुख विशेषताओं को जोड़ना संभव है, जैसे कि ऑब्जेक्ट ओरिएंटेशन शैलियों की पसंद या प्रोलॉग जैसी नियतात्मक मिलान, जगह से बाहर देखे बिना। यह setfमैक्रो को संभव बनाता है, जो एक वैचारिक रूप से बहुत शक्तिशाली मैक्रो है: (setf A B)इसका मतलब है कि, जब आप मूल्यांकन Aकरेंगे तो आपको मिलेगाB , और जिसे आप की तरह किसी भी सीमा तक बढ़ाया जा सकता है।

C ++ टेम्पलेट मेटाप्रोग्रामिंग समान चीज़ों में सक्षम है, लेकिन नियमित C ++ की तुलना में बहुत भिन्न भाषा में है।


+1 मैं आशा करता हूं कि एक दिन मैं एक लिस्प बोली में कार्यक्रम कर सकूंगा।
ओलिवर वीलर

@ हेल्पर ... सी ++ टेम्पलेट्स के माध्यम से [डरावनी हँसी]
एमवीएलएलजीआर

@mlvjr: आप डरावने हैं।
डेविड थॉर्नले

वास्तव में, यह एकमात्र आउट-ऑफ-द-बॉक्स सुविधा है जिसकी आपको कभी भी किसी भाषा में आवश्यकता होगी। लिस्प मैक्रोज़ के साथ आप बाद में अन्य सभी संभावित सुविधाओं को जोड़ सकते हैं।
एसके-लॉजिक

18

अजगर का डेकोरेटर।

डेकोरेटर का उपयोग करके फ़ंक्शन के संस्मरण या समय को लागू करना बेहद आसान है।

फ़ंक्शन टाइमर का उदाहरण।

class FuncTimer(object):
    """ Time how much time a function takes """
    def __init__(self, fn):
        self.fn = fn
        self.memo = {}
        self.start_time = time.time()
    def __call__(self, *args):
        self.memo['return'] = self.fn(*args)
        print("Function '%s' took %u seconds" % (self.fn.__name__, time.time() - self.start_time))
        return self.memo['return']

अब अगर आपके पास कोई फंक्शन है जिसे आप समय देना चाहते हैं, तो आप बस ऐसा कर सकते हैं,

@FuncTimer
def foo():
    # foo's implememtation goes here

आप कुछ इस तरह देखेंगे,

समारोह 'फू' में 3 सेकंड लगे।


जावा में एनोटेशन हैं, जिनका उद्देश्य एक समान है और वाक्यविन्यास है, लेकिन बहुत अलग तरीके से काम करते हैं
केसबश

1
+1: पायथन के सज्जाकारों ने मुझे भाषा की किसी भी अन्य विशेषता से अधिक प्रभावित किया है। वे बहुत सुंदर और सरल हैं!
एडम पेन्न्टर

शायद आप हमारे साथ एक सरल उदाहरण साझा कर सकते हैं? मैं अजगर को ईमानदार नहीं जानता।
ShdNx

@ SHDNx, मैंने अभी एक उदाहरण जोड़ा है।
ग्रुकस

1
कॉल के भाग के रूप में प्रारंभ समय की गणना नहीं की जानी चाहिए?
detly

14

void*C. में कास्टिंग करना आप कच्ची बाइट्स को सब कुछ डाल सकते हैं, और इन आंकड़ों के साथ जो चाहें कर सकते हैं

(हाँ, आजकल यह अद्वितीय है ...)


1
.Net भाषाओं में वस्तु बहुत समान है। केवल अधिक प्रकार-सुरक्षित आदि
Maciej Piechotka

आप बहुत सी भाषाओं में आपत्ति कर सकते हैं। मुख्य समस्या यह है कि कई भाषाएं आदिम और वस्तुओं को अलग करती हैं
केसबेश

5
@Maciej: .NET में भी, आप वास्तव में ऑब्जेक्ट के लिए प्रिमिटिव्स नहीं डाल सकते हैं। आप उन्हें बॉक्स करते हैं, और यह काफी अलग जानवर है। इसके अलावा, यह अभी भी कास्टिंग के लिए पूरी तरह से अलग है void*...
डीन हार्डिंग

1
Pointerपास्कल और ऑब्जेक्ट पास्कल में कास्टिंग एक ही काम करता है।
फ्रैंक शीयर

1
@ डीनिंगिंग: वेल - सी में आपके पास int64_tहमेशा सुरक्षित रूप से डाली नहीं जा सकती void *(सॉरी फॉर लेट - 2 साल - रिप्लाई )।
माकीज पीचोटका

12

पायथन में यील्ड

पायथन में (और मुझे C # में विश्वास है), आप एक तथाकथित जनरेटर को परिभाषित कर सकते हैं जो एक yieldस्टेटमेंट पर फ़ंक्शन निष्पादन को रोक देता है, मान लौटाता है और बाद की कॉल पर, उस फ़ंक्शन को पुनरारंभ करता है जहां इसे छोड़ दिया (कॉल के बीच संरक्षित राज्य के साथ)। यह उन मानों की लंबी सूची उत्पन्न करने के लिए बहुत अच्छा है, जहाँ आप केवल फ़ंक्शन के वर्तमान मूल्य (जो बहुत सामान्य है) में रुचि रखते हैं। यह आपको संभावित रूप से लंबे समय तक अनुक्रम बनाने की अनुमति देता है, जबकि केवल मेमोरी में बहुत सीमित स्थान रखता है।


1
यील्ड पहले ही प्रश्न में सूचीबद्ध है।
त्रिनिदाद

यह BCPL पर वापस जाता है।
पीटर टेलर

8

लैम्ब्डा एक्सप्रेशन (क्लोजर, नेस्टेड फ़ंक्शंस, अनाम तरीके, जो भी आप उन्हें कहते हैं)।

मैं पहली बार पर्ल में उनके सामने आया, तुरंत उन्हें प्यार किया और सोचा कि अन्य भाषाएं उनके पास क्यों नहीं हैं। आजकल मुझे लगता है कि यह अब अद्वितीय नहीं है; यहां तक ​​कि PHP उन्हें किसी भी तरह से हैक करने में कामयाब रहा। लेकिन वे उस समय अर्ध-अद्वितीय थे।


5
अद्वितीय, जब तक आप लिस्प में वापस जा रहे हैं, जो कि दूसरी सबसे पुरानी प्रोग्रामिंग भाषा है। ;-)
माइकल एच।

-1: अर्ध-अद्वितीय नहीं
केसबश


7

डेल्फी में सेट बहुत उपयोगी हैं, बहुत ज्यादा सिर्फ एक नामित बूलियन सरणी। वे 32 चेकबॉक्स के साथ सेटिंग फ़ॉर्म को सहेजने के लिए बहुत उपयोगी हैं। लेकिन उन्हें सभी समान सिद्धांत कार्य (यानी अंतर, अंतर, संघ) मिल गए हैं।

मुझे यकीन नहीं है कि वे फैशन से बाहर हो गए हैं, लेकिन मैं हर समय उनका उपयोग करता हूं।


अच्छा है, लेकिन यह जावा में लागू करना आसान नहीं होगा, उदाहरण के लिए: बूलियन []?
मार्क सी

हाँ, आप कर सकते हैं, लेकिन मुझे नहीं लगता कि यह उतना ही सफल है: TForm = (FF_1500 = 1, FF_CA251 = 5, FF_UB04 = 6, FF_MA10 = 7); TFormSet = TFormS सेट;
पीटर टर्नर

7

संदेश

एर्लांग से। एक संदेश को दूसरे सूत्र के लिए अतुल्यकालिक भेजता है ।

Expr1 ! Expr2

प्राप्त करना

एर्लांग से। दूसरे धागे से एक संदेश प्राप्त करता है।

receive
    Pattern1 [when GuardSeq1] ->
        Body1;
    ...;
    PatternN [when GuardSeqN] ->
        BodyN
end

5

सी # गुण

/// <summary>
/// Get ID
/// </summary>
public int ID
{
    get; set;
}

बनाम

(जावा)

/**
 * Name of user
 */
private String name;

/**
 * Gets name of user
 * @return Name of user
 */
public String getName() {
    return this.name;
}

/**
 * Sets name of user. 
 * @param name
 */
public void setName(final String name) {
    this.name = name;
}

2
हां, वे बेहतर हैं, लेकिन यह एक बुरा उदाहरण है। अंतर बहुत छोटा होगा यदि गेटटर / सेटर वास्तव में कुछ विशेष करेगा, और सी # संस्करण को कम प्रलेखित किया गया है।
बार्ट वैन ह्युकेलोम

1
मेरे बॉस C # के स्वचालित गुणों के सख्त खिलाफ हैं और जब भी हमारे पास इसके बारे में कोई तर्क होता है, तो हम में से कोई भी यह देखने में सक्षम नहीं होता कि दूसरा सही या गलत क्यों है। मैं उनसे सिर्फ इसलिए प्यार करता हूं क्योंकि वे कोड को इतना साफ-सुथरा बनाते हैं और लंबे समय में मुझे काफी समय बचाते हैं।
mbillard

2
बस इसे लोगों को पाने के लिए प्रोत्साहित करने और सभी जगह बसने की अनुमति न दें। केवल उन पाने वालों और बसने वालों को जो किसी वस्तु पर कार्रवाई के रूप में समझ में आता है।
डेविड थॉर्नले

3
उन्हें C # प्रॉपर्टीज़ नहीं कहा जाता है, वे ऑटो-प्रॉपर्टीज़ कहलाते हैं
जैको प्रीटोरियस

1
इन दिनों ऑटो-गुण बहुत आम हैं। पायथन, ऑब्जेक्टिव-सी ...
केसबश

5

यूनियनों में सी

मैं ईमानदारी से यह नहीं कह सकता कि मैंने इनमें से किसी को बनाने के लिए पर्याप्त सी नहीं लिखा है, लेकिन मैंने दूसरे के कोड के साथ काम किया है।

जब यह उन अनुप्रयोगों में विभिन्न डेटा के पैकेजिंग मिश्रणों के लिए नीचे आता है जो नेटवर्किंग या बाइनरी डेटा स्टोरेज जैसे कच्चे बिट्स / बाइट्स में हेरफेर करते हैं। जोरदार टाइप की गई भाषाओं में इसके समकक्ष कोई आसान तरीका नहीं है।

अस्वीकरण:

हालाँकि कुछ मामलों में यूनियन्स बेहद उपयोगी हैं, वे अधिकांश उच्च स्तरीय भाषाओं में नहीं पाए जाते हैं क्योंकि वे सुरक्षित नहीं हैं। IE, आप यूनियनों का उपयोग करके चर की सीमाओं के पार डेटा ब्लीड कर सकते हैं (प्रकार सुरक्षित दुनिया में एक बड़ी संख्या नहीं)। महान शक्ति के साथ महान जिम्मेदारी आती है।


2
एक अच्छे कारण के लिए IMHO। डेटा रीइंटरप्रेट करना, पैर में खुद को गोली मारने का एक खूबसूरत तरीका है ( en.wikipedia.org/wiki/Aliasing_(computing) )। बेहतर उपयोग स्पष्ट रूपांतरण IMHO। सही तरीके से करने वाले यूनियन IMHO बीजीय डेटा प्रकार हैं।
मैकीज पीचोटका

@ मैसीज I ने एक आवश्यक अस्वीकरण जोड़ा। हालाँकि, मुझे यकीन नहीं है कि यह सटीक रूप से यूनियनों के उपयोग के खतरों की व्याख्या करता है क्योंकि मुझे वास्तव में उनके उपयोग करने का अंतरंग ज्ञान नहीं है। मुझे सिर्फ इतना पता है, जहां मैंने उन्हें देखा है कि उच्च स्तरीय भाषा समतुल्य की तुलना में कोड का उपयोग करना अधिक संक्षिप्त और आसान काम था।
इवान प्लाइस

समस्या यह है कि C 'उच्च स्तरीय भाषा' है (केवल निम्न-स्तरीय उच्च स्तरीय भाषा)। K & R C के बाद से इसे बहुत सारे नियम मिलते हैं जो तेज पोर्टेबल कोड का उपयोग करने की अनुमति देता है। मूल्य यह है कि संकलक विभिन्न चीजों को मान सकता है और कुछ भ्रमित हो सकता है। unionउपयोग का MOST सुरक्षित है, कुछ अच्छी तरह से समर्थित मुहावरे हैं (हालांकि तकनीकी रूप से सही नहीं हैं) - देखें Cellperformance.beyond3d.com/articles/2006/06/… (हालांकि यह पॉइंटर्स यूनियनों के साथ अधिक poblem है यह अच्छी तरह से नकली हो सकता है)।
Maciej Piechotka

डेल्फी ने recordयूनियनों का समर्थन करने के लिए अपना सिंटैक्स बढ़ाया :in_addr = record case integer of 0: (S_un_b: SunB); 1: (S_un_w: SunW); 2: (S_addr: u_long); end;
फ्रैंक शीयर

5

मैं वास्तव में की तरह जब तक में संशोधक रूबी । यह बहुत स्वाभाविक लगता है और बहुत सारे परिदृश्यों की जगह लेता है जहां आपका कोड बस इसके बिना बहुत गड़बड़ लगता है।

puts "All good" unless input.nil?

आप ऐसा कैसे नहीं कर सकते हैं? : डी


6
रूबी से पहले पर्ल के पास था। में भी इसे चाहता हु।
बैरी ब्राउन

1
निमर्ले के पास समान कीवर्ड हैं unlessऔर whenजो पारंपरिक रूप से उपयोग किए जाने वाले सबसे आम शाखाओं वाले परिदृश्यों की जगह लेते हैं if/else
मैटवेवी

5

फैंसी अजगर तर्क वाक्य रचना

मुझे यकीन नहीं है कि यह कितना अनोखा है, लेकिन अजगर में आप शांत सामान कर सकते हैं जैसे कि कीवर्ड जोड़े स्वचालित रूप से एक शब्दकोश और बैक में बने होते हैं। सूचियों के साथ भी:

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print "-- This parrot wouldn't", action,
    print "if you put", voltage, "volts through it."
    print "-- Lovely plumage, the", type
    print "-- It's", state, "!"


parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')

अजगर डॉक्स (अधिक तर्क के लिए नीचे स्क्रॉल करें सामान)


1
+1 सूची में एक पैरामीटर को पास करने में सक्षम होने के लिए पहले वैकल्पिक मापदंडों के सभी के लिए मानों को पारित किए बिना
eswald

4

C प्रीप्रोसेसर। आप अलग-अलग प्लेटफ़ॉर्म पर सामान्य कोड भी लिख सकते हैं - कम या अधिक - ifdefs।


2
आसानी से उपलब्ध बेहतर प्रीप्रोसेसर हैं जो अपना अतिरिक्त कदम उठाते हैं, और सभी भाषाओं के साथ काम करते हैं।
डेविड थोरले

मैं ifdef, ifndef और अन्य के साथ बहुत खुश हूं।
अर्न ०

3

उद्देश्य-सी श्रेणियाँ

श्रेणियाँ रनटाइम पर एक वस्तु की कार्यक्षमता का विस्तार करने के लिए एक आसान तरीका प्रदान करती हैं (रचना बनाम विरासत के बारे में सोचें)। क्लासिक उदाहरण NSString वर्ग के लिए एक वर्तनी जाँचक जोड़ना है।

@interface NSString (SpellChecker)
- (BOOL) checkSpelling;
@end

कम प्रभाव वाले बग-फिक्स के लिए भी उपयोगी है, क्योंकि किसी श्रेणी के कार्यान्वयन की विधि उसके माता-पिता के कार्यान्वयन को ओवरराइड कर देगी।


1
सी # में विस्तार के तरीकों के समान है
केसबश

2

रूबी की इंजेक्शन विधि # सिंबल # to_proc रूबी 1.9 की सुविधा के साथ संयुक्त रूप से एक कुछ अविश्वसनीय रूप से संक्षिप्त (लेकिन अभी भी पठनीय) कोड लिखने देता है:

जैसे (1..10).inject(:+)

जो पूर्णांक 1 को 10 => 55 के माध्यम से बताता है

इस तरह के उदाहरण देखकर मैंने रूबी को सीखना चाहा, जिसे मैंने अभी करना शुरू किया है।


9
निष्पक्ष बनाने के लिए सुई की रूबी का संस्करण है गुना / foldl लिस्प, हास्केल, आदि जैसी भाषाओं से / foldr
mipadi

मैं वास्तव में यह अनूठा नहीं कहूंगा।
डेन्थ

1
प्रश्न का शीर्षक "अर्ध-अद्वितीय" है, अद्वितीय नहीं। निश्चित रूप से इंजेक्शन (या मानचित्र आदि) और प्रतीक # to_proc के संयोजन द्वारा वहन की गई कोड की संक्षिप्तता सी, जावा, और सी ++ जैसी मुख्यधारा की भाषाओं से परे है।
tcrosley

बहुत संक्षिप्त (और मुझे यह पसंद है), लेकिन मुझे यकीन नहीं है कि यह कुछ अलग करने के लिए ऐसा है: Enumerable.Range (1, 10) .Aggregate (s, x) => s + x); C # या अन्य भाषाओं से
FinnNk

1

JavaFX (RIP) में बाइंडिंग मैकेनिज्मबाँध कीवर्ड आप एक अभिव्यक्ति के मूल्य के लिए एक चर के मूल्य के लिए बाध्य है और आप सभी उन बदसूरत श्रोता जो भी बॉयलरप्लेट कोड से छुटकारा प्राप्त करने के लिए सक्षम बनाता है।

जबकि JavaFX कई मायनों में काफी असफल था, मुझे पटकथा भाषा की कई विशेषताएं काफी अच्छी लगीं।


1

स्ट्रिंग मिश्रणों के साथ-साथ डी में फंक्शन टाइम का मूल्यांकन एक बहुत ही अनोखा किलर फीचर है। हां, तकनीकी रूप से यह दो विशेषताएं हैं, लेकिन असली शक्ति उन्हें संयोजन से आती है। इस संयोजन के साथ, आप नियमित डी फ़ंक्शन लिख सकते हैं जो संकलन समय पर एक स्ट्रिंग के रूप में कोड उत्पन्न करते हैं, और फिर इस कोड को किसी भी दायरे में मिलाते हैं और इसका मूल्यांकन नियमित डी कोड के रूप में किया जाता है। कोड पूरी तरह से सांख्यिकीय रूप से संकलित है और बिल्कुल वैसे ही निष्पादित होता है जैसे कि इसे हस्तलिखित किया गया था। इस सुविधा का उपयोग मानक पुस्तकालय में कुछ चिपचिपा स्थितियों के आसपास काम करने के लिए भी किया जाता है।


मुझे यह भी पसंद है कि रिटर्न प्रकार स्वचालित रूप से एक विधि से अनुमान लगाया जाता है ..
nawfal
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.