In che modo la racchetta è diversa dallo schema?


184

Racket è un discendente di Scheme. In che modo la racchetta è diversa dall'R6RS? Cosa ha aggiunto, portato via o è solo diverso?

Capisco che Racket è più di una lingua, è una piattaforma per le lingue. Ma mi riferisco al dialetto principale della racchetta.

Risposte:


132

Alla fine la racchetta si basa su R5RS e non su R6RS e non è un superset rigoroso di entrambi. Non penso che possa essere chiamato "Schema" perché non è retrocompatibile con nessuno standard Scheme.

La maggior parte delle implementazioni offre estensioni, ma per il resto sono compatibili con le versioni precedenti, ovviamente, il compilatore fornito con Racket può anche funzionare in modalità R5RS o R6RS. Lo schema R5 / 6RS valido che viene eseguito in modalità racchetta può essere rifiutato, causare errori di runtime o comportarsi in modo diverso rispetto a quanto dovrebbe. Detto questo, i punti principali in cui non è compatibile con le versioni precedenti sono:

  • La racchetta non ha set-cdr!e set-car!, anzi, set-mcar!funziona solo su coppie create appositamente come mutabili.
  • Ciò che chiamate Racchetta letrecviene chiamato letrec*in R6RS e non esiste in R5RS, ciò che chiamate R5RS e R6RS letrecnon esiste in Racchetta.
  • In Racket, molte cose si autovalutano e ciò comporterebbe un errore in R5RS, soprattutto l'elenco vuoto .
  • La racchetta fa distinzione tra maiuscole e minuscole, anche se R6RS distingue tra maiuscole e minuscole
  • Tratta la racchetta ( ... )e [ ... ]come equivalente, R5RS no, ma R6RS no.

Probabilmente ce ne sono altri, ma sulla maggior parte delle altre parti la racchetta è un superset di Scheme.


24
In Racket ()non è valido, non si auto-valuta. Inoltre, Racket non hanno la più ristretto letrec- per esempio, quello del r5rslinguaggio; è una scelta intenzionale utilizzare la letrec*versione simile nella lingua predefinita.
Eli Barzilay,

9
@Eli, spiacenti, hai ragione, la racchetta in esecuzione in modalità Swindle sembra prendere in considerazione ()l'autovalutazione, ero confuso con quello. Non ho mai davvero ()capito perché non si autovalutasse in Scheme come in Common Lisp.
Zorf

@Zorf Può essere facilmente modificato sovraccaricando #%app, tuttavia:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Suzanne Dupéron,

2
Questa risposta dovrebbe essere aggiornata. Il set di funzionalità di Racket ora supera di gran lunga quello di Scheme, con moduli e definizioni linguistiche, ecc.
CinchBlue,

1
@MaliRemorker Non capisco esattamente cosa intendi, ma Scheme è attualmente su R7RS ed era su R6RS. Ma Racket supera ancora il set di funzionalità R6RS.
CinchBlue

36

Contiene elenchi immutabili, come menzionato sopra. Contiene anche un sistema di struttura un po 'più pulito del sistema di registrazione R6RS. Ha una classe orientata agli oggetti e un sistema di oggetti. Ha il supporto nativo per la progettazione per contratto. Ha un sistema di unità che ricorda il sistema di moduli ML, nonché un sistema di moduli molto simile al sistema di moduli R6RS. Sono sicuro di aver dimenticato tutte le cose che ho menzionato.

Non sono sicuro che la ridenominazione sia stata utile come qualcosa di diverso da un espediente di marketing, ma la racchetta è sicuramente un dialetto distinto di schema.


24
Penso che la ridenominazione fosse perché non volevano essere un dialetto di Scheme con un sacco di aggiunte non standard - volevano essere un linguaggio basato su Scheme con un sacco di roba standard. Classificare lo Schema PLT come "solo" un dialetto dello Schema è come classificare Ruby come un dialetto di Mirah - non è inesatto, ma in qualche modo minimizza i punti di forza del linguaggio.
Chuck,

5
Penso che usare un nome diverso sia una decisione saggia: usare lo stesso nome per lingue diverse che hanno un'origine comune è fonte di confusione IMO. Vorrei cambiare il nome anche se il linguaggio contenesse Scheme come sottoinsieme ma contenesse così tante aggiunte da incoraggiare uno stile di programmazione molto diverso.
Giorgio,


18

La specifica del linguaggio R5RS sul linguaggio di programmazione dello Schema si basa sul consenso tra i vari implementatori dello Schema. Ciò implica che la lingua è molto stabile. Implica anche che molte utili funzioni non facciano parte dello standard R5RS.

La racchetta si basa su R5RS e l'ha estesa notevolmente. Alcune estensioni sono definite come macro, ma alcune funzionalità richiedono il supporto del sistema di runtime.

Funzionalità in Racket non implementabili dalle sole macro:

  • continuazioni delimitate (più generali di call / cc)
  • segni di continuazione
  • discussioni
  • posti
  • ffi

Il modulo e il sistema macro sono molto più generali delle specifiche RnRS. Insieme alle #langspecifiche del lettore / lingua, è possibile definire lingue personalizzate (con sintassi personalizzata) e usarle con i normali programmi Racket.

In alcuni casi la racchetta ha costrutti il ​​cui comportamento si discosta dall'R5RS. Il più ovvio sta facendo conscostruire una coppia immutabile ( mconscostruisce una coppia mutabile). Un vantaggio di avere coppie immutabili è che lengthora corre nel tempo ammortizzato O (1).


2
... ma rende impossibile aggiungere la lista O (1).
Will Ness,

16

La racchetta include molti costrutti di linguaggio davvero belli non inclusi nello schema R6RS, come "match" .


3
Perché "abbinare" sarebbe una bella caratteristica? Almeno, quando esprimi un'opinione, dovresti fornirne una breve spiegazione, in modo che le persone che non conoscono bene Racket possano capire perché "abbinare" sia teoricamente vantaggioso.
nbro,

1
Pattern Matching è una funzionalità davvero desiderata su molti linguaggi con background di programmazione funzionale, sfortunatamente nemmeno R6RS o Common Lisp lo implementano di default, quindi sì, questa è una funzionalità davvero piacevole e differenziale fornita da Racket. Ad esempio linguaggi come Haskell, Elixir, Rust e F # forniscono quel tipo di costruzioni e sono molto usati. Personalmente realizzo la programmazione Lisp principalmente in Common Lisp e in molti casi mi manca la mancata implementazione del pattern matching.
Manoel Vilela,

1
matchè molto bello ma per fortuna è solo una macro, quindi può essere facilmente aggiunta a Lisps che non ce l'hanno. Tramite Lisp comune è possibile eseguire la corrispondenza dei pattern di luce negli elenchi destructuring-bind. È semplice scrivere una destructuring-casemacro basata su di essa, e molte persone hanno. Per Scheme ci sono matchlibrerie portatili . Clojure ha core.match.
Lassi,

Le macro possono rendere il codice difficile da leggere poiché spesso hanno una semantica speciale, quindi il linguaggio dovrebbe sempre standardizzare tutte le macro per uso generale in modo che tutti non costruiscano le proprie macro. La corrispondenza dei motivi dovrebbe essere quella predefinita proprio come in Arc & Clojure & Racket & Ocaml & Haskell in quanto specifica più direttamente l'intento. Caddr è di livello troppo basso.
aoeu256

12

Per un grande esempio, gli elenchi di racchette sono immutabili per impostazione predefinita mentre gli schemi sono mutabili. La racchetta include anche molte librerie standard (ad es. Web Server) che altri schemi non hanno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.