2012-04-18 11 views
9

Quando scriviamo (in una lingua o in un altro):Le lingue esistenti consentono gli argomenti delle funzioni in aree arbitrarie in un nome funzione?

lengthOf(n) 

Pensiamo ad esso come abbreviazione di un inglese 'riempire gli spazi vuoti' di costruzione, come:

length of __ 

Ma quando scriviamo cose come queste:

isAnInteger(n) 
    appendTo(n,m) 

Pensiamo a frasi come:

__ is an integer 
    append ___ to ___ 

Quindi, sembrerebbe più naturale per consentire espressioni funzione di invocazione come:

(n)isAnInteger 
    append(n)to(m) 

Dove sono i 'nomi delle funzioni' qualcosa di simile:

_isAnInteger 
    append_to_ 

Qualcuno può citare la programmazione esistente lingue che permettono questo? So che i linguaggi orientati agli oggetti consentono all'oggetto di essere un argomento in primo piano, ma mi domando su sintassi più flessibili.

+1

Objective-C chiamate di metodi sono spesso nella forma '[anObject performOperation: operation withTask: task andInteger: intero] ', ecc. Non è _flexible_ di per sé, ma (IMO) è più naturale. –

+0

È possibile definire le funzioni di base in Standard ML. Ad esempio, è possibile definire una funzione 'to' in modo che il chiamante scrive' n in m' invece di 'in (n, m)'. Questo non è esattamente quello che stai cercando, ma condivide alcune somiglianze (specialmente dal momento che puoi scrivere sia 'append' che' to' per chiamare 'append (da n a m)' più tardi). –

+1

Smalltalk, Objective-C, Agda, BitC e altri. Vedi [Esiste un linguaggio là fuori in cui i parametri sono inseriti nel nome del metodo?] (Http://programmers.stackexchange.com/questions/102906/) e [Gli spazi bianchi negli identificatori sono mai stati idiomatici?] (Http://programmers.stackexchange.com/questions/145751/) –

risposta

1

Sì, una cosa del genere esiste, ma non nella sintassi esatta presentata nella domanda.

In JavaScript si chiama concatenamento e si trova comunemente nei framework come jQuery per rendere più semplice creare e modificare elementi DOM al volo:

$('<div/>') 
.css('background', '#f00') 
.css('width', '100px') 
.css('height', '100px') 
.hide() 
.appendTo('BODY') 
.fadeIn(); 

Il precedente jQuery frammento crea un elemento DIV, set la larghezza, l'altezza e il colore di sfondo, nasconde lo DIV, lo appende al documento e applica un effetto dissolvenza.

La sintassi è importante. Dato il seguente esempio:

(n)isAnInteger 
append(n)to(m) 

Le parentesi sono ovviamente da intendersi come delimitatori di argomenti di funzione. Ma hai anche bisogno di delimitatori di nomi di funzioni e delimitatori di oggetti/cose. Una sintassi migliore sarebbe:

n.isAnInteger().append(n).to(m) 

che è molto simile alla sintassi jQuery:

$('DIV') 
    .filter(':visible') 
    .appendTo('#new_element'); 

che troverà DIV elementi che sono visibili e copiarli l'elemento con un id di new_element.

+3

Il richiedente non sta chiedendo una sintassi * migliore *, ma sta chiedendo una sintassi * specifica *.Il concatenamento delle funzioni –

+0

è tutto tranne * arbitrario *. – RBarryYoung

0

Objective-C probabilmente arriva più vicino. Esempio:

- (void)setRangeStart:(int)start end:(int)end; 

- (void)importDocumentWithName:(NSString *)name withSpecifiedPreferences: 
(Preferences *)prefs beforePage:(int)insertPage; 

Chiamato come:

[obj setRangeStart:1 end:42]; 
[obj importDocumentWithName:@"foo" withSpecifiedPreferences:prefs beforePage:1]; 

Non permette [obj 5:isAnInteger] però.

1

Smalltalk è abbastanza vicino. (È la stessa sintassi Objective-C, detto in un'altra risposta)

messaggio manda in Smalltalk non fanno parentesi uso, ma seguire la forma doSomething:with:

Così si può scrivere:

5 isInteger 
aList appendTo: anotherList 
aList at: aPosition ifAbsent: anAction 

tutti i messaggi vengono inviati a un oggetto (ricevitore) che deve essere a sinistra, in modo da poter non scrittura:

append: aList to: anotherList "illegal syntax" 

La sintassi doSomething:with: è più naturale rispetto all'utilizzo di parentesi graffe. Sei meno facilmente confuso su quale sia il parametro. Si consideri ad esempio:

aList.sublist(i, j) 
    aList sublistFrom: i to: j 

Con la corretta denominazione dei metodi, è chiaro il primo argomento è l'indice inferiore, e il secondo indice superiore, a differenza con bretelle.

3

Mixfix è la forma più generale di ciò che è presentato sopra come funzione di sintassi Smalltalk tramite Objective-C. Maude's "bubble" parsing è l'implementazione più chiaramente documentata di questo. Più in generale, google for "mixfix parsing".

1

Grace è un nuovo linguaggio di istruzione (ancora in sviluppo), che supporta un ordine quasi arbitrario di argomenti:

class MyObject { 
    method choseBetween (a : Block<None>) and (b : Block<None>) -> None { 
     if (Random.nextBoolean) 
      then { a.apply } else { b.apply } } 
} 

che potrebbe ottenere chiamato come:

MyObject.new.chooseBetween { print("Yes") } and { print("No") } 
0

Due lingue con operatori mixfix supporto mi viene in mente: Agda e BitC.

3

Come ha sottolineato Brian Rice, la notazione mixfix in Maude gestisce esattamente questo. Hai persino la sintassi corretta.

I suoi esempi

_isAnInteger 
append_to_ 

sarebbe stata dichiarata in Maude come

op _IsAnInteger : Int -> Bool 
op append_to_ : Int List -> List 

E sarebbero chiamati come

5 IsAnInteger 
append 5 to L 
Problemi correlati