2010-07-22 16 views
9

मैं सोच रहा था, वहाँ किसी भी प्रोग्रामिंग भाषा आप कार्य हो सकता है, जहां इस तरह कहता है:"अजीब" फ़ंक्शन कॉल के साथ कोई प्रोग्रामिंग भाषा?

function_name(parameter1)function_name_continued(parameter2); 

या

function_name(param1)function_continued(param2)...function_continued(paramN); 

उदाहरण के लिए आप इस समारोह कॉल हो सकता है:

int dist = distanceFrom(cityA)to(cityB); 

यदि आपने distanceFromto इस तरह की कार्य परिभाषित की है:

int distanceFrom(city A)to(city B) 
{ 
    // find distance between city A and city B 
    // ... 
    return distance; 
} 

जहां तक ​​मुझे पता है, सी, जावा और एसएमएल प्रोग्रामिंग भाषाओं में, यह नहीं किया जा सकता है।

क्या आप किसी प्रोग्रामिंग भाषा से अवगत हैं जो आपको फ़ंक्शन को इस तरह से परिभाषित करने और कॉल करने देता है?

+1

क्या आप इसे पूरा करने के बारे में कुछ और बता सकते हैं? – nos

+1

ठीक है मुझे लगता है कि कुछ फ़ंक्शन कॉल 'दूरी फ्रॉमो' उदाहरण की तरह पढ़ने के लिए बहुत आसान होंगे। लेकिन मैं सिर्फ उत्सुक था अगर ऐसी प्रोग्रामिंग भाषा जो आपको इस तरह के फ़ंक्शन को परिभाषित करने देती है। –

+0

मुझे लगता है कि आपको यह कहने के लिए एक बेहतर उदाहरण की आवश्यकता है कि आप क्या कहने की कोशिश कर रहे हैं क्योंकि फ़ंक्शन में बहु मानों को पार करना एक ही चीज़ प्राप्त करता है और समान रूप से (यदि अधिक नहीं) स्पष्ट होता है। ईजी। dist = distanceFrom (cityA, cityB) –

उत्तर

6

यह ऑब्जेक्टिव-सी

- (int)distanceFrom:(City *)cityA to:(City *)cityB { 
    // woah! 
} 
+0

आपके उत्तर के लिए धन्यवाद। मुझे लगता है, आपके द्वारा लिखा गया कोड फ़ंक्शन परिभाषा है। क्या आप यह भी उदाहरण दे सकते हैं कि इस फ़ंक्शन को कैसे कहा जाता है? –

+0

लगभग समान रूप से स्मॉलटॉक के लिए: dist = [मीट्रिक दूरी से: शहर ए से: सिटीबी]; –

6

की तरह एक भयानक बहुत स्मालटाक की वाक्य रचना की तरह एक बहुत, (- Kubi के जवाब देखने के जो ऑब्जेक्टिव-सी की वाक्य रचना की व्याख्या करता है) ध्वनि लग रहा है।

उदाहरण:

dist := metric distanceFrom: cityA to: cityB 

जहां #distanceFrom: करने के लिए: किसी वस्तु नामक मीट्रिक पर एक विधि है।

तो तुम "समारोह कॉल" है (वे कर रहे हैं वास्तव में संदेश भेजता है) की तरह

'hello world' indexOf: $o startingAt: 6. "$o means 'the character literal o" 

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

+1

एक मीट्रिक दो बिंदुओं के बीच की दूरी को मापने के लिए 'रणनीति' है। अलग-अलग मान्य परिणाम लौट रहे हैं, कई मान्य रणनीतियों। 'मीट्रिक # दूरी से: सही तकनीक है; 'शहर # दूरी 'सबसे अच्छा अनुमान है। शहरों को अन्य शहरों में दूरी के बारे में क्या पता है ?! शहर अपनी खुद की स्थिति जानते हैं, और मेट्रिक्स दो पदों के बीच दूरी को मापने के बारे में जानते हैं। – yfeldblum

+0

न्याय, आप सही हैं।मुझे '#distanceTo: 'पसंद है क्योंकि यह छोटा है - लेकिन यह एक ऐसा ट्रेडऑफ है जो संभवतः बनाने योग्य नहीं है, क्योंकि यह युग्मन को बढ़ाता है (शहर गैर-सिटी चीजों के बारे में जानते हैं) और यह' #distance से: कम: '' से छोटा नहीं है। धन्यवाद! –

0

यह फ़ंक्शन ओवरलोडिंग (सी ++/सी #)/डिफ़ॉल्ट पैरामीटर के समान दिखता है (VB)।

उदहारण के लिए:

डिफ़ॉल्ट पैरामीटर व्यक्ति बाद पैरामीटर के लिए डिफ़ॉल्ट सेट करने समारोह को परिभाषित करने की अनुमति देते हैं सी # ओवरलोडिंग:

int CalculateDistance(city A, city B, city via1, city via2) 
{....} 

int CalculateDistance(city A, city B) 
{ 
    return CalculateDistance(city A, city B, null, null) 
} 
0

आप इसके लिए एक सदस्य फ़ंक्शन का उपयोग कर सकते हैं।

cityA.distance_to(cityB); 

यह सी ++, सी (थोड़ा tweaking के साथ), सी #, जावा में मान्य कोड है।विधि जंजीरों का उपयोग करना, आप कर सकते हैं:

cityA.something(cityB).something(cityC).something(cityD).something(cityE); 
2

अजगर में, आप स्पष्ट रूप से तर्क आप के साथ समारोह कॉल कर रहे हैं के नाम, तो आप उन्हें एक अलग क्रम में पास या वैकल्पिक तर्क को छोड़ देता है पारित कर सकते हैं:

>>> l = [3,5,1,2,4] 
>>> print l.sort.__doc__ 
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*; 
cmp(x, y) -> -1, 0, 1 
>>> l.sort (reverse=True) 
>>> l 
[5, 4, 3, 2, 1] 

ऐसा लगता है कि उद्देश्य सी सिंटैक्स क्या कर रहा है, प्रत्येक तर्क को उसके नाम के साथ एक फ़ंक्शन में टैग करना।

भाषा एक

ऑब्जेक्टिव-सी लेकिन बुला वाक्य रचना [वस्तु संदेश] है, तो लगेगा -

2

(इस जवाब के अंत में अंतिम सी ++ दृष्टिकोण मेरी बहुत पसंदीदा व्यक्तिगत प्रयास देखें) जैसे:

int dist = [cities distanceFrom:cityA to:cityB]; 

अगर आप एक शहर के भीतर distanceFromto समारोह इस तरह, परिभाषित किया है आपत्ति:

- (int)distanceFrom:(City *)cityA to:(City *)cityB 
    { 
    // find distance between city A and city B 
    // ... 
    return distance; 
    } 

भाषा दो

मैं भी आप कुछ बहुत IO Language में इस के पास प्राप्त कर सकते थे संदेह है, लेकिन मैं सिर्फ इसे देख रहा हूँ। आप में अन्य भाषाओं की तुलना में इसके बारे में भी पढ़ना चाहेंगे जिसमें आईओ के बारे में free excerpt है।

भाषा तीन

वहाँ एक मुहावरा ("चेनिंग") C++ जहां अस्थायी वस्तुओं या मौजूदा वस्तु उस कीवर्ड तर्क को बदलने के लिए प्रयोग किया जाता है लौटने के लिए, The Design and Evolution of C++ के अनुसार है और इस तरह दिखता है:

int dist = distanceFrom(cityA).to(cityB); 

यदि आपने distanceFrom इस तरह की फ़ंक्शन को थोड़ा सहायक ऑब्जेक्ट के साथ परिभाषित किया है। ध्यान दें कि इनलाइन फ़ंक्शंस इस प्रकार की चीज को बहुत ही कुशल कोड में संकलित करते हैं।

class DistanceCalculator 
{ 
public: 
    DistanceCalculator(City* from) : fromCity(from) {} 

    int to(City * toCity) 
    { 
     // find distance between fromCity and toCity 
     // ... 
     return distance; 
    } 

private: 
    City* fromCity; 
}; 


inline DistanceCalculator distanceFrom(City* from) 
{ 
    return DistanceCalculator(from); 
} 

Duhh, मैं जल्दी पहले में था, महसूस किया कि मैं सिर्फ एक अस्थायी वस्तु का उपयोग करने के लिए एक ही वाक्य रचना देने के लिए refactor कर सकते हैं:

class distanceFrom 
{ 
public: 
    distanceFrom(City* from) : fromCity(from) {} 

    int to(City * toCity) 
    { 
     // find distance between fromCity and toCity 
     // ... 
     return distance; 
    } 

private: 
    City* fromCity; 
}; 

मेरे पसंदीदा और यहाँ एक और भी अधिक प्रेरित है सी ++ संस्करण है कि आप लिखने की अनुमति देता

int dist = distanceFrom cityA to cityB; 

या

भी
int dist = distanceFrom cityA to cityB to cityC; 

#define और वर्गों के एक अद्भुत सी ++ ish संयोजन के आधार पर:

#include <vector> 
#include <numeric> 
class City; 
#define distanceFrom DistanceCalculator() << 
#define to << 

class DistanceCalculator 
{ 
public: 

    operator int() 
    { 
     // find distance between chain of cities 
     return std::accumulate(cities.begin(), cities.end(), 0); 
    } 

    DistanceCalculator& operator<<(City* aCity) 
    { 
     cities.push_back(aCity); 
     return *this; 
    } 

private: 
    std::vector<City*> cities; 
}; 

नोट यह एक बेकार व्यायाम की तरह लग सकता है, लेकिन कुछ संदर्भों में यह लोगों को एक डोमेन देने के लिए बहुत उपयोगी हो सकता है - विशिष्ट भाषा सी ++ में जो वे पुस्तकालयों के साथ संकलित करते हैं। हमने सीएसआईआरओ में भू-मॉडलिंग वैज्ञानिकों के लिए पाइथन के साथ एक समान दृष्टिकोण का उपयोग किया।

+0

मुझे सी ++ का कोई ज्ञान नहीं है लेकिन असाइनमेंट: 'int dist = distance शहर से शहर शहर में; 'साफ दिखता है! मेरे प्रश्न पर उत्तर देने के लिए समय निकालने के लिए धन्यवाद। –

+3

यह सी ++ के बारे में यह चतुरता है जो हमेशा मुझे मुस्कुराता है और एक साथ क्रिंग करता है। – Novelocrat

0

एसएमएल में आप केवल कुछ मूल्य (इकाई, उदाहरण के लिए) "और" दूरी से "एक करीबी कार्य कर सकते हैं जो तीन पैरामीटर लेता है। उदाहरण के लिए:

val to =() 
fun distanceFrom x _ y = (* implementation function body *) 

val foo = distanceFrom cityA to cityB 

तुम भी इस तथ्य का लाभ ले सकता है कि एसएमएल datataype कंस्ट्रक्टर्स पर नामकरण रिवाजों का (कई लोगों के झुंझलाहट के लिए बहुत कुछ) लागू नहीं करता है, इसलिए यदि आप सुनिश्चित करना चाहते हैं कि टाइप प्रणाली लागू करता है अपने कस्टम वाक्य रचना:

datatype comp = to 

fun distanceFrom x to y = (* implementation *) 

val foo = distanceFrom cityA to cityB (* works *) 
val foo' = distanceFrom cityA cityB (* whoops, forgot 'to' - type error! *) 
+0

हालांकि मैं एक करीबी समारोह की तलाश नहीं कर रहा था। मुझे वास्तव में दिलचस्प और अच्छी चाल मिली जो आपने 'डेटाटाइप कॉम्प = से' के साथ की थी :) (इसके लिए +1) –

2

सी # 4.0 के Named and Optional Arguments सुविधा आपको बहुत कुछ इसी तरह प्राप्त करने के लिए अनुमति देता है: Agda2 एक समान है,

public static int Distance(string from, string to, string via = "") 
{ 
    ... 
} 

public static void Main() 
{ 
    int distance; 

    distance = Distance(from: "New York", to: "Tokyo"); 
    distance = Distance(to: "Tokyo", from: "New York"); 
    distance = Distance(from: "New York", via: "Athens", to: "Tokyo"); 
} 
+0

यह सामान्य लिस्प के कीवर्ड पैरामीटर की तरह दिखता है, यह डरावना है: (दूरी:" न्यूयॉर्क "से:" टोक्यो ") –

+0

कीवर्ड ':' से शुरू होते हैं, इसके साथ समाप्त नहीं होते हैं, इसलिए यह' (दूरी: "न्यूयॉर्क से": "टोक्यो") होगा। लेकिन हाँ। – Ken

+0

पायथन में कीवर्ड तर्क भी हैं। – Novelocrat

4

उत्सुक के लिए, बहुत अनुमोदित वाक्यविन्यास। निम्नलिखित मान्य कोड है:

data City : Set where 
    London : City 
    Paris : City 

data Distance : Set where 
    _km : ℕ → Distance 

from_to_ : City → City → Distance 
from London to London = 0 km 
from London to Paris = 342 km 
from Paris to London = 342 km 
from Paris to Paris = 0 km 

तो

from Paris to London 

मूल्यांकन किया जाता है, परिणाम

342 km 
0

आप मैक्रो का उपयोग कर योजना या लिस्प में यह कर सकता है। की तरह कुछ

प्रपत्र हो जाएगा: अपरकेस में

(DISTANCE-FROM city-a TO city-b) 

प्रतीकों वाक्य रचना को दर्शाता है।

तुम भी तरह 'नाम वाले पैरामीटर' कुछ कर सकते हैं:

(DISTANCE TO city-a FROM city-b) 
(DISTANCE FROM city-a TO city-b) 
+0

आप इसे सी प्रीप्रोसेसर के साथ भी कर सकते हैं ... – reinierpost

+0

आप खुशी से (दूरी: 'शहर-ए: से' शहर-बी) तक: (डिफ्यून दूरी (और से कुंजी) ...) (लेकिन यह सवाल को संबोधित नहीं करता है, क्योंकि फ़ंक्शन को अभी भी DISTANCE कहा जाता है)। –

+0

@reinierpost सी प्रीप्रोसेसर के साथ यह कैसे किया जा सकता है? –

3

एक fluent interface या method chaining मेरे लिए की तरह एक बहुत लग रहा है।

proc distance {from cityA to cityB} {...} 
set distance [distance from "Chicago IL" to "Tulsa OK"] 

मुझे यकीन है कि अगर काफी क्या आप यद्यपि के बारे में सोच रहे हैं नहीं कर रहा हूँ:

0

Tcl आप इस तरह कुछ करने के लिए अनुमति देता है।

1

आप सी में ऐसा कर सकते हैं, unsafely यद्यपि:

struct Arg_s 
    { 
    int from; 
    int to; 
    }; 

int distance_f(struct Arg_s args) 
    { 
    return args.to - args.from; 
    } 

#define distance(...) distance_f(((struct Arg_s){__VA_ARGS__})) 
#define from_ .from = 
#define to_ .to = 

compound literals और designated initializers उपयोग करता है।

printf("5 to 7 = %i\n",distance(from_ 5, to_ 7)); 
// 5 to 7 = 2 
+0

+1 यह कहने जैसा है: सिर्फ इसलिए कि आप कर सकते हैं, इसका मतलब यह नहीं है कि आपको चाहिए। –

+1

के रास्ते के लिए –

0

आप जावा में कर सकते हैं, Builder pattern उस किताब प्रभावी जावा यहोशू बॉश द्वारा (यह दूसरी बार मैं इतना में इस लिंक डाल है में प्रकट होता है का उपयोग करें, मैं अभी भी उपयोग नहीं किया वह पैटरन, लेकिन बहुत अच्छा लग रहा है)

0

ठीक है, फ़ेलिक्स में आप इसे दो चरणों में कार्यान्वित कर सकते हैं: सबसे पहले, आप एक सामान्य कार्य लिखते हैं। फिर, आप व्याकरण का विस्तार कर सकते हैं और कुछ नए गैर-टर्मिनलों को फ़ंक्शन में मैप कर सकते हैं।

यह आप जो चाहते हैं उसकी तुलना में यह थोड़ा हेवीवेट है (इसे आसान बनाने में मदद करने के लिए आपका स्वागत है !!) मुझे लगता है कि यह वही करता है जो आप चाहते हैं और बहुत कुछ!

मैं क्योंकि फेलिक्स भाषा का पूरे वास्तव में इस तकनीक द्वारा परिभाषित किया गया कोई वास्तविक उदाहरण दे देंगे (एक्स नीचे, भाव के लिए गैर टर्मिनल एक्स में पी है [p] एक पूर्वता कोड है):

// alternate conditional 
x[sdollar_apply_pri] := x[stuple_pri] "unless" x[let_pri] 
    "then" x[sdollar_apply_pri] =># 
    "`(ast_cond ,_sr ((ast_apply ,_sr (lnot ,_3)) ,_1 ,_5))"; 

यहाँ थोड़ा अधिक है:

// indexes and slices 
x[sfactor_pri] := x[sfactor_pri] "." "[" sexpr "]" =># 
    "`(ast_apply ,_sr (,(noi 'subscript) (,_1 ,_4)))"; 
x[sfactor_pri] := x[sfactor_pri] "." "[" sexpr "to" sexpr "]" =># 
    "`(ast_apply ,_sr (,(noi 'substring) (,_1 ,_4 ,_6)))"; 
x[sfactor_pri] := x[sfactor_pri] "." "[" sexpr "to" "]" =># 
    "`(ast_apply ,_sr (,(noi 'copyfrom) (,_1 ,_4)))"; 
x[sfactor_pri] := x[sfactor_pri] "." "[" "to" sexpr "]" =># 
    "`(ast_apply ,_sr (,(noi 'copyto) (,_1 ,_5)))"; 

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

शायद आप Felix Grammar Online की जांच करना चाहते हैं।