in F #

2008-09-17 16 views
20

Dopo aver letto Practical Common Lisp ho finalmente capito quale fosse il grosso problema delle macro e ho cercato un linguaggio per la piattaforma .NET che supporta questo. Esistono pochi dialetti per .NET, ma da ciò che sono riuscito a raccogliere sono tutti molto beta o abbandonati. Recentemente il mio interesse è stato innescato da Clojure, ma è per la piattaforma java e anche se probabilmente potrei usare ikvm non si sentirà un po 'integrato. Soprattutto quando vuoi fare cose come WPF.in F #

Recentemente ho sentito un sussurro su F #, ho provato a guardare la documentazione se potevo trovare qualcosa sul supporto delle macro, ma non l'ho trovato. Quindi qualcuno lo sa?

Grazie :)

risposta

10

Bene, F # è basato su OCaml e OCaml ha piuttosto extensive macro system. Date le similitudini sintattiche e semantiche di F # e OCaml, potresti essere in grado di eseguire il porting sul sistema di macro Ocaml su F #.

Altro che rubare il sistema macro di Ocaml Non sono a conoscenza di un sistema di macro in scatola per F #.

+3

Porting camlp4 non è un compito banale. Ma non è necessario finché resti in un sottoinsieme compatibile con ocaml di F #. Sebbene l'intero processo richiederà alcune impostazioni manuali e porterà a determinati vincoli. – ygrek

+0

Questo link è rotto: (http://www.ocaml-tutorial.org/camlp4_3.10) – theoski

7

Nope. Nessuna macro per F #.

+0

Si potrebbe scegliere di considerare le espressioni di calcolo come una sostituzione di un sistema macro, nel senso che consente di creare linguaggi di dominio specifici. – BitTickler

4

ma buoni orrori della sintassi in quegli esempi OCaml sembra oscuro

Ci si sta eseguendo nella stessa fondamentale sintattico trade-off si fa con Lisp. Se si desidera la potenza delle macro di tipo lisp, tendenzialmente si finisce con una sintassi simile al lisp per il linguaggio, altrimenti la sintassi della macro sembra molto diversa dalla sintassi normale ... niente di sbagliato in entrambi gli approcci, solo scelte differenti

+1

Non proprio. Le macro di OCaml sono complicate dalla necessità di distinguere tra diversi tipi di costrutti sintattici (ad esempio definizioni di tipi vs espressioni) perché sono rappresentati da valori di diversi tipi statici. Ad esempio, Mathematica dispone di una sintassi avanzata e di macro potenti. –

13

Nemerle, al http://nemerle.org/, è un linguaggio .NET (che supporta anche mono) che supporta molti dei paradigmi di programmazione funzionale rimanendo visivamente vicino a C#. Ha un ampio supporto macro.

6

Hai guardato Boo? Mentre Boo non ha macro, ha una pipeline di compilazione aperta, che è una buona alternativa alle macro per la metaprogrammazione sintattica.

[MODIFICA] Come indicato nei commenti, Boo dispone di macro ora.

+4

Attualmente Boo ha macro (questo potrebbe non essere stato il caso quando hai postato). – JasonTrue

+0

Potrebbe essere. Più probabilmente, * ha * avuto macro quando l'ho postato, ma non l'ho fatto l'ultima volta che ho controllato (che era molto prima di quel post.) Non importa comunque, dato che puoi fare tutto ciò che puoi fare con le macro con un open compilatore e viceversa. –

1

Questo potrebbe essere il contrario rispetto a quello che desideri, ma sai di RDNZL? È un'interfaccia FFI (foerign-function interface) che ti consente di chiamare le librerie .NET dal tuo codice Lisp.

Probabilmente sono molto meno maturi di qualsiasi implementazione di Common Lisp o Scheme, ma ci sono i dialetti Lisp per .NET: L# e DotLisp.

+1

Solo FYI Dotlist non viene più mantenuto (Rich è il ragazzo dietro Clojure) quindi non penso che mi farebbe casini. Mente se vuoi un Lisp-like che non sia CL/Schema, userò Clojure, personalmente. – Runevault

+0

DotLisp è un po 'stentato, ma perché è stabile, funzionante, e sono troppo impegnato per caricare le mie patch :-( –

1

Ci sono due Lisps sviluppati attivamente per .net

IronScheme - basato DLR implementazione schema

Xronos - DLR porto a base di clojure

+0

Xronos sembra morto per me. Scopri ClojureCLR - https://github.com/richhickey/ clojure-clr/wiki/ – Justin

2

ne dite di usare F # citazioni?

http://tomasp.net/blog/fsquotations.aspx

+2

Le citazioni ti consentono di quotare il codice per ottenere una rappresentazione runtime di esso e le citazioni di F # spesso non ti permettono nemmeno di farlo (ad esempio F # si rifiuta di citare '<@ a @>'). Le macro ti permettono di fare di più, Ad esempio, cambia la sintassi della lingua, non c'è modo di farlo in F #. F # non ha un CodeDOM completo quindi non è possibile utilizzare il compilatore F # a livello di codice, anzi, si può dire che F # è specificamente progettato per prevenire questo tipo di programmazione. –

3

Recentemente ho sentito sussurrare su F #, ho cercato di esaminare la documentazione, se sono riuscito a trovare nulla di supporto per le macro, ma non l'ho trovato. Quindi qualcuno lo sa?

F # non supporta le macro ed è improbabile che lo sarà mai.

4

Ho pensato che dovrei sottolineare che ora esiste una porta .NET/Mono piuttosto attiva di Clojure. Clojure supporta macro in stile LISP come indicato nella domanda.

Come altri hanno già detto, le macro non sono supportate in F # a questo punto (fine 2010).

0

Attualmente sto studiando le possibilità di meta-programmazione in F #. Se definiamo macro come modello di testo che si espande in codice poi ci sono due approcci evidenti:

  1. modelli T4. C'è implementazione per F #: https://github.com/kerams/Templatus

  2. Ho visto da qualche parte l'invocazione di F # dalle stringhe in un assieme separato e quindi il caricamento dell'assieme.