Perché F # ha una modalità interattiva ma non C #?

32

F # esce dalla scatola con un REPL interattivo. C # non ha nulla del genere ed è in effetti un po 'difficile da giocare senza impostare un progetto completo (anche se LINQpad funziona ed è anche possibile farlo tramite PowerShell).

C'è qualcosa di fondamentalmente diverso nei linguaggi che consente a F # di avere la console interattiva ma rende difficile implementarlo per C #?

Poiché molti anni dopo la gente sta ancora arrivando a questa domanda, dovrei notare che ora ci sono molte opzioni. È possibile utilizzare PowerShell (preinstallato su ogni macchina Windows moderna) per giocare con il framework .Net. Oppure puoi utilizzare LINQpad per prototipare il codice c # arbitrario . Oppure puoi usare ScriptCs o puoi usare un ambiente di tipo jsfiddle online come Complify .net o Jsil . Molte opzioni.

    
posta George Mauer 10.07.2012 - 20:48
fonte

4 risposte

56

Is there something fundamentally different about the languages that allows F# to have the interactive console but makes it difficult to implement it for C#?

Sì.

F # è un discendente del linguaggio di programmazione ML, che a sua volta è stato pesantemente influenzato da linguaggi come Lisp e Scheme. Quelle lingue sono state progettate fin dal primo giorno per avere tre belle proprietà.

Innanzitutto, quelle lingue non hanno davvero dichiarazioni il modo in cui le pensi in C #. Piuttosto, quasi tutto è un'espressione che ha un valore , quindi un meccanismo di valutazione-e-allora-stampa-il-valore ha senso in quasi tutte le situazioni.

In secondo luogo, quelle lingue scoraggiano la programmazione con effetti collaterali, quindi puoi fare delle valutazioni senza preoccuparti di rovinare lo stato globale.

In terzo luogo, la maggior parte del lavoro che fai in quelle lingue è "al livello più alto"; di solito non vi è alcuna "classe" o "spazio dei nomi" o altro contesto.

Al contrario, C # enfatizza il flusso di controllo della programmazione con affermazioni che producono effetti collaterali, e tali istruzioni sono sempre in più contenitori nidificati: uno spazio dei nomi, una classe, un metodo e così via.

Quindi queste sono tutte cose che rendono più difficile per C # avere un REPL, ma certamente non impossibile . Dovremmo solo capire quale sia la semantica per le affermazioni e le espressioni che appaiono al di fuori del solito contesto, e quali sono le semantiche delle mutazioni che cambiano le associazioni dei nomi e così via.

Why does F# have an interactive mode but not C#?

Perché il team di F # ha deciso che avere un ciclo REPL era uno scenario prioritario per loro. Il team C # storicamente no. Le funzionalità non vengono implementate a meno che non siano le funzionalità con priorità più alta che si adattano al budget; fino ad ora, un C # REPL non è stato in cima alla lista.

Il progetto Roslyn ha un REPL C # (e alla fine avrà anche un VB REPL, ma non è ancora pronto.) Puoi scaricare una versione di anteprima per vedere come ti piace

link

    
risposta data 10.07.2012 - 22:49
fonte
22

Mono ha un C # repl: link

Ha persino una versione della GUI che ti permette di manipolare direttamente oggetti grafici o creare widget Gtk #:

    
risposta data 10.07.2012 - 21:06
fonte
2

Credo che sia principalmente una cosa storica. Gli ambienti REPL sono sempre stati associati a linguaggi funzionali, inclusi i linguaggi della famiglia ML e F # rimane fedele a tale tradizione. Tieni presente che l'ambiente interattivo è qualcosa che gli utenti provenienti da uno sfondo funzionale danno per scontato, la mancanza di una tale funzionalità verrebbe messa VS e - per estensione - F #, in una posizione di svantaggio.

D'altra parte, nessuna funzione del genere è stata comune nella comunità OOP.

Esistono tuttavia REPL disponibili per molte lingue non funzionali, tra cui C, Java o C #. Anche se è molto diverso da un REPL a tutti gli effetti, la funzione di Auto in VS mostra che è certamente fattibile con C #.

    
risposta data 10.07.2012 - 22:12
fonte
1

Credo che C # sia principalmente orientato agli oggetti. Per scrivere codice ancora più semplice, devi dividerlo in più classi. Per utilizzare REPL, è necessario scrivere molto codice.

F # è principalmente funzionale non ha questo problema e puoi facilmente scrivere anche codice complesso in file diretti e convertirlo in oggetto / i in un secondo momento.

È più facile scrivere una singola riga di funzione che scrivere una classe, che si estende su più righe.

    
risposta data 10.07.2012 - 21:51
fonte

Leggi altre domande sui tag