2012-06-16 7 views
11

Sto imparando lo schema e fino ad ora ho usato l'inganno. In realtà sto solo imparando come un modo per insegnare a me stesso un linguaggio di programmazione funzionale, ma mi piacerebbe pubblicare un progetto open source di qualche tipo per rinforzare lo studio, non so ancora cosa ... Sono uno sviluppatore web, quindi probabilmente qualcosa di webby.Scrittura codice schema portatile. Qualcosa di "standard" oltre alla stessa R5RS?

Sta diventando evidente che il codice dello schema di pubblicazione non è molto facile da fare, con tutte queste diverse implementazioni e nessun standard reale oltre il nucleo del linguaggio stesso (R5RS). Per esempio, ho quasi certamente bisogno di fare IO di base su disco e su un socket TCP, insieme alla manipolazione delle stringhe, come la scansione/regex, che sembra non essere coperta da R5RS, a meno che non lo veda nel documento. Sembra che Scheme sia più un "concetto" che un linguaggio pratico ... è una valutazione corretta? Forse dovrei cercare qualcosa come Haskell se voglio imparare un linguaggio di programmazione funzionale che si presta maggiormente ad essere utilizzato in progetti open source?

In realtà, quanto dolore si pongono le diverse implementazioni di schema quando si desidera pubblicare un progetto open source? Non mi piace davvero dover mantenere 5 funzioni diverse per cose di base come la manipolazione delle stringhe in varie implementazioni mainstream (Chicken, guile, MIT, DrRacket). Quante persone effettivamente scrivono uno schema per la compatibilità di implementazione incrociata, invece di essere strettamente associato alle funzioni di libreria che esistono solo nel proprio schema?

Ho letto http://www.ccs.neu.edu/home/dorai/scmxlate/scheme-boston/talk.html, che non mi riempie di fiducia;)

EDIT | Ridefiniamo "standard" come "comuni".

+5

La tua domanda fa sembrare che pensi che R5RS sia lo standard più attuale per Scheme, ma non è così. R6RS, che gestisce molte delle cose che tu chiedi, è stato pubblicato nel 2009 ed è lo standard attuale dello schema R6RS è ancora troppo piccolo per fare molte cose, quindi probabilmente vorrai seguire una particolare implementazione. Io uso (e sviluppo) Racket, ma Guile è anche una scelta ragionevole. –

risposta

9

Domanda difficile.

La maggior parte delle persone decide di essere pragmatico. Se la portabilità tra le implementazioni è importante, scrive la maggior parte del programma in Schema standard e isola le parti non standard in librerie (piccole). Ci sono stati diversi approcci su come esattamente farlo. Uno sforzo recente è SnowFort.

http://snow.iro.umontreal.ca/

Uno sforzo più vecchio è SLIB.

http://people.csail.mit.edu/jaffer/SLIB

Se si guarda - o chiedere - le biblioteche per le espressioni regolari e lexer/parser troverete rapidamente un po '.

Poiché la filosofia di R5RS include solo le funzionalità linguistiche concordate da tutti gli implementatori, lo standard è ridotto, ma anche molto stabile.

Tuttavia, per la programmazione "reale" R5RS potrebbe non essere la soluzione migliore. Quindi R6RS (e R7RS?) Includono più librerie "del mondo reale".

Detto questo, se avete solo bisogno di portabilità, perché sembra essere la cosa giusta, quindi riconsiderare attentamente se davvero vuole mettere lo sforzo. Vorrei semplicemente scrivere il mio programma sulla realizzazione conosco la migliore. Quindi se necessario portarlo in seguito. Questo spesso risulta più facile del previsto.

+0

Ottima risposta, grazie. Lo terrò aperto un po 'più a lungo. Uno dei motivi per cui utilizzo guile è perché non richiede Java ed è scritto in C (non ho una JVM e non voglio installarne una). Sfortunatamente non credo che l'inganno abbia una versione conforme a R6RS, e il MIT-Scheme ha affermato che non intende scriverne uno. Il pollo è ancora R5RS. Potrebbe essere necessario fare qualche ricerca per altre implementazioni C che hanno R6RS :) – d11wtq

+0

La neve sembra interessante. Qualcosa come rubini o NPM, dal suono di esso. – d11wtq

+1

La neve è per il codice portatile. Vedi anche http://planet.racket-lang.org e http://wiki.call-cc.org/chicken-projects/egg-index-4.html per altri pacchetti. Anche se i pacchetti sono nella pagina Racket o Chicken ci sono alcuni pacchetti portatili in mezzo. Sfortunatamente hai bisogno di guardare la fonte per scoprirlo. – soegaard

8

Scrivo un blog che utilizza Scheme come lingua di implementazione. Poiché non voglio alienare gli utenti di alcuna particolare implementazione di Scheme, scrivo in un dialetto limitato di Scheme basato su macro R5RS più sintassi e il mio Standard Prelude.Non trovo questo troppo restrittivo per il tipo di programmi algoritmici che scrivo, ma i tuoi bisogni potrebbero essere diversi. Se guardi i vari esercizi sul blog, vedrai che ho scritto il mio matcher per le normali espressioni, che ho fatto una buona dose di manipolazione delle stringhe e che ho catturato i file da internet eseguendo il bombardamento su wget (io uso Chez Scheme - gli utenti devono fornire il proprio meccanismo di shell non portatile se usano qualcos'altro); Ho anche fatto qualche lavoro di grafica limitato scrivendo sequenze di terminali ANSI.

Vado d'accordo solo un po 'con Jens. Invece di effettuare il porting in un secondo momento, trovo più facile costruire la portabilità sin dall'inizio. Non ho usato il pensiero in quel modo, ma la mia esperienza negli ultimi tre anni dimostra che funziona.

+0

Blog interessante. Dovrà tenerlo d'occhio. Vuoi dire che il blog è scritto in Scheme o è WordPress? o_O – d11wtq

+0

Il blog è WordPress. Le soluzioni sono implementate in Scheme. – user448810

+0

LOL in un primo momento ho pensato che fosse stato scritto letteralmente in Schema =) – petajamaja

15

credo che nello Schema, la portabilità è un'impresa inutile, dal momento che le implementazioni Scheme sono più diverso da quello che sono simili, e non c'è un'unica implementazione che altre implementazioni cercano di emulare (a differenza di Python e Ruby, per esempio) .

Così, la portabilità nello schema è analogo all'uso di rendering software per la scrittura di giochi "perché è nel sottoinsieme comune tra OpenGL e DirectX". In altre parole, è un minimo comune denominatore, può essere fatto, ma si perde l'accesso a molte funzionalità offerte dall'implementazione.

Per questo motivo, mentre gli SRFI generalmente dispongono di un'implementazione di riferimento portatile (laddove possibile), alcuni di essi sono accompagnati da note che un'implementazione di Schema di qualità deve adattare la libreria affinché utilizzi funzionalità specifiche dell'implementazione per funzionare in modo ottimale.

  • Un primo esempio è case-lambda (SRFI 16); può essere implementato in modo portabile e l'implementazione di riferimento lo dimostra, ma è decisamente meno ottimale rispetto a un case-lambda integrato, dal momento che devi implementare la funzione di invio nel codice "utente".
  • Un altro esempio è stream-constant da SRFI 41. L'implementazione di riferimento utilizza una simulazione O (n) di elenchi circolari per la portabilità, ma qualsiasi implementazione decente dovrebbe adattare quella funzione per utilizzare elenchi circolari reali in modo che sia O (1).

L'elenco potrebbe continuare. Molte cose utili in Scheme non sono portatili: gli SRFI aiutano a rendere più portatili le funzionalità, ma non c'è modo che gli SRFI possano coprire tutto. Se si desidera ottenere un lavoro utile svolto in modo efficiente, è molto probabile che si debbano utilizzare funzionalità non portatili. Il meglio che puoi fare, penso, è scrivere una facciata per incapsulare quelle caratteristiche che non sono già coperte dagli SRFI.

In realtà c'è now a way to implement stream-constant in an O(1) fashion senza utilizzare elenchi circolari. Portatile e veloce per la vittoria!

6

Vale la pena sottolineare che le implementazioni del moderno Schema sono esse stesse abbastanza portabili; spesso è possibile portare interi programmi in nuovi ambienti semplicemente portando avanti lo schema appropriato. Ciò non aiuta molto i programmatori di librerie, tuttavia, ed è qui che entra in gioco R7RS-small, l'ultima definizione di Scheme. Non è ancora ampiamente implementato, ma fornisce un nucleo comune più ampio di R5RS.

+0

R7RS-small fornisce un nucleo comune più ampio di R7RS? Sicuramente intendevi R5RS. :-D –

+1

Sì, certo. Fisso. –