2011-12-18 8 views
14

Arc está construida en la parte superior de Racket. Como ambos están en la familia Lisp, tengo curiosidad sobre la ventaja de Arc over Racket, o ¿cuál es la motivación para crear Arc dado que Racket está disponible?La ventaja de Arc over Racket

+7

Python está construido "encima" de C, entonces, ¿cuál es la ventaja de Python sobre C? El lenguaje subyacente, a menos que esté expuesto, tiene poca relevancia para el poder del "nivel superior". – drysdam

+11

Dudo que haya ningún - esquema es un lenguaje bien conocido, bastante popular con las bibliotecas para hacer cosas, mientras que el arco es un proyecto de vanidad de un chico que hizo una tienda web temprana. – Marcin

+1

Parece un poco tonto comparar una DSL con un lenguaje completamente separado. No diría "LiftWeb * or * Scala" o "Seaside * o * SmallTalk" o "Sinatra * or * Ruby", por ejemplo. (Los formularios concedidos de Lisp realmente pueden difuminar la distinción). –

Respuesta

21

Escribir tu propio idioma es, en cierto sentido, empoderador: puedes elegir qué primitivos, qué tipos de expresiones, son convenientes para escribir en ese idioma. En ese sentido, puede mirar un libro como On Lisp y ver que los autores principales de Arc tienen una fuerte opinión sobre qué tipo de cosas les gustaría de un idioma.

Si tomo su pregunta y la reduzco a lo esencial, suena así: ¿por qué la gente debería escribir lenguajes específicos del dominio?

(Es una pregunta aparte si la gente de Arc debería haber reimplementado tantas instalaciones primitivas, como sus propios sistemas de macros y módulos, cuando ya existen tales mecanismos incorporados en Racket. Pero los autores de Arc están perfectamente dentro sus derechos a reinventar)

Supongo que una de las objeciones que tengo a Arc es esta: la forma en que han implementado el tiempo de ejecución oficial hace que sea difícil reutilizar el trabajo que han hecho con Racket. En ese sentido, es un esfuerzo que ayuda a una sola comunidad, mientras que hubiera sido bueno poder beneficiarse fácilmente del trabajo de la gente de Arc.

16

Raqueta es un dialecto de esquema, mientras que Arc no lo es. Ambos son dialectos LISP sin embargo. Arc reduce la cantidad de paréntesis y tiene una sofisticada sintaxis incorporada para hacer que las cosas comunes sean más cortas en el tamaño del código. Ejemplos:

;; scheme 
(if p1 c1 
    (if p2 c2 
     (if p3 c3 a3))) 

;; arc simplifies if 
(if p1 c1 
    p2 c2 
    p3 c3 
     a3) 

;; scheme 
(f1(f2(f3 a b))) 

;; arc simplifies cascading calls 
(f1:f2:f3 a b) 

;; scheme 
(lambda (x) (+ x x)) 

;; arc simplified one argument anonymous functions 
[+ _ _ ] 

;; scheme array access 
(vector-ref v1 5) 

;; arc simplifies array access 
(v1 5) 

Puede elegir una sobre la otra. Personalmente, me gusta la sintaxis de Arc, pero no el hecho de que esté implementada como intérprete. Ojalá hubieran implementado Arc como un lenguaje de módulo Racket, ya que entonces podrías desarrollar en drracket, debug y make executables. Eso incluso podría permitir hacer bibliotecas de Racket en Arc o viceversa.

Si desea hacer un código compatible, debe ser más estricto y utilizar R6RS/R5RS que usar el lenguaje o el arco predeterminados de la raqueta, ya que entonces puede tener un código que pueda ejecutar en algo más que raqueta. En la raqueta, puede elegir R5RS o usar el #! R6RS como la primera línea del código para forzar el estándar. En ambos casos, el resultado podrá ejecutarse en otras implementaciones/compiladores.

+1

Diría algo sobre cond para ese primer caso de raqueta. '(cond (p1c1) (p2c2) (p3c3) (#t c4))' es un poco más equitativo. –