Esquema | ||
![]() | ||
Fecha de la primera versión | 1975 | |
---|---|---|
Paradigma | Funcional | |
Autores | Guy L. Steele y Gerald Jay Sussman | |
Última versión | R7RS (2013) | |
Mecanografía | fuerte, dinámico | |
Estándares | IEEE 1178-1990, ANSI , R n RS | |
Influenciado por | Ceceo | |
Influenciado | JavaScript , Ruby , Hop , Snap! | |
Implementaciones | Esquema Bigloo, Gambit, PLT ... | |
Sitio web | www.scheme-reports.org | |
Extensión de archivo | scm y ss | |
Scheme ( pronunciación: / skim / ) es un lenguaje de programación derivado del lenguaje funcional Lisp , creado en la década de 1970 en el Instituto de Tecnología de Massachusetts (MIT) por Gerald Jay Sussman y Guy L. Steele .
El objetivo de los creadores del lenguaje era purificar Lisp conservando lo esencial, la flexibilidad y el poder expresivo. Por lo tanto, Scheme tiene una sintaxis extremadamente simple, con un número muy limitado de palabras clave. Como en Lisp, la notación prefijada elimina la necesidad de precedencia de operadores . Además, la potencia de las macros de Scheme le permite adaptarse a cualquier problema, en particular para hacerlo orientado a objetos y por lo tanto multiparadigma.
La especificación Scheme especifica que todas las implementaciones deben optimizar el caso de recursividad terminal .
Los tipos de datos básicos de Scheme son booleanos , números, que pueden ser números enteros de tamaño indefinido, racionales o complejos, caracteres o símbolos, que son variables.
A estos se agregan los siguientes tipos de datos compuestos: cadenas, vectores, pares orientados, listas, listas asociativas, tablas hash y un tipo genérico particular, la expresión S , de la que derivan todos los demás tipos, lo que hace posible la metaprogramación , es decir, la posibilidad de ampliar el lenguaje con nuevos operadores especiales .
Gérald Sussman y Guy Steele volvieron al nacimiento de Scheme en un artículo titulado The First Report on Scheme Revisited y publicado en 1998.
En 1973, Carl Hewitt propuso su modelo de actor y escribió con sus estudiantes una implementación en Lisp llamada Planner-73, luego PLASMA (acrónimo de PLAnner-like System Modeled on Actors ). Sussman y Steele queriendo comprender mejor el modelo de Hewitt, en particular relacionándolo con las nociones tradicionales de programación, escriben un pequeño intérprete Lisp y primitivas para crear actores y enviar mensajes entre ellos. Usan la misma sintaxis para funciones y actores, los primeros son cierres declarados por la palabra clave lambday devuelven un valor, y los segundos por alpha. Los actores no regresan, pero llaman continuaciones , que son los otros actores que él conoce.
El lenguaje se denomina "Schemer", siguiendo los nombres de los lenguajes Planner y Conniver, de los que se inspira. Sin embargo, el sistema ITS utilizado en ese momento limitaba los nombres de archivo a 6 caracteres, truncando el nombre a "SCHEME". Sussman y Steele dicen que ya no recuerdan por qué no eligieron abreviar a "SCHMR", como Planner y Conniver que usaron "PLNR" y "CNVR".
Descubren, luego de haber escrito programas con actores, que la implementación del intérprete fue la misma, que el código a evaluar concierne a funciones o actores, y que lo mismo ocurre con el código que crea las funciones y actores. La diferencia entre el hecho de que solo las funciones devuelven valores y no los actores no existía en la implementación, sino solo en las primitivas utilizadas en el cuerpo de la función y las definiciones de actor. Infieren que el reparto y los cierres son en realidad el mismo concepto, y el propio Hewitt lo admitió más tarde.
Estos descubrimientos sobre el entonces esquema embrionario llevaron a tres conclusiones principales. En primer lugar, el modelo de actor de Hewitt estaba perfectamente representado en el cálculo λ . Esto no era nuevo en sí mismo para los teóricos de la semántica denotacional , pero Scheme ayudó a dar una dimensión práctica a estas teorías. Entonces, pareció que el formalismo simple y pequeño del cálculo λ puede servir como núcleo de un lenguaje de programación expresivo y poderoso, por lo que Scheme es un cálculo λ aplicado. El corolario es inmediato: la semántica denotacional es equivalente a la semántica operacional . Finalmente, la búsqueda de un lenguaje definitivo para la inteligencia artificial resultó estar dando vueltas en círculos, ya que el trabajo en lenguajes comenzó con Lisp, seguido de CONVERT, luego Planner, Conniver, PLASMA, seguido por un dialecto simplificado de Lisp.
Las variables se escriben dinámicamente y su alcance es léxico :
(define var1 value) (let ([var2 value]) ...)Listas :
(cons 1 (cons 2 (cons 3 (cons 4 '()))))Esta concatenación se puede abreviar como
(list 1 2 3 4)o en
'(1 2 3 4)Funciones : se definen como expresiones lambda
(define fun (lambda (arg1 arg2) ...))o más simplemente
(define (fun arg1 arg2) ...)Aplicación a una lista:
(apply fun (list value1 value2))Evaluaciones condicionales :
(cond (test1 expr1) (test2 expr2) ... (else exprn))y también
(if condition then-expr else-expr)Ejemplo 1 - cálculo de un factorial:
(define (factorial n) (if (= n 0) 1 (* n (factorial (- n 1))))) (factorial 5) ;; ⇒ 120Ejemplo 2 : definición de una función de mapa, que aplica una expresión lambda (que cuadra su argumento) a todos los elementos de una lista:
(define (map f lst) (cond ((null? lst) lst) (else (cons (f (car lst)) (map f (cdr lst)))))) (map (lambda (x) (* x x)) '(1 2 3 4)) ;; ⇒ (1 4 9 16)Versiones recursivas de cola de los dos ejemplos anteriores:
(define (factorial n) (let loop ((fact 1) (n n)) (cond ((= n 0) fact) (else (loop (* n fact) (- n 1)))))) (factorial 5) ;; ⇒ 120 (define (map f lst) (do ((lst lst (cdr lst)) (res '() (cons (f (car lst)) res))) ((null? lst) (reverse res)))) (map (lambda (x) (* x x)) '(1 2 3 4)) ;; ⇒ (1 4 9 16)Scheme es, junto con Common Lisp , el dialecto más popular de Lisp. Al igual que Lisp, existen múltiples implementaciones, cada una de las cuales agrega funcionalidad de acuerdo con las necesidades de sus usuarios. Un informe evalúa periódicamente las diferentes implementaciones, con el fin de identificar una definición consensuada del lenguaje. Estos informes se denominan Informe n revisado sobre el esquema de lenguaje algorítmico , donde n es el número de revisión y se abrevia como R n RS . Su objetivo es poder intercambiar código entre diferentes implementaciones conforme a una revisión dada del informe.
La sexta revisión se publicó en septiembre 2007y ratificado por 102 personas, es decir, 2/3 de los votantes. Este informe es inmediatamente controvertido, algunos de los autores de las principales implementaciones indicaron que integrarían algunas características nuevas del R 6 RS, pero no el informe completo, Marc Feeley considera que el objetivo del R6RS no se puede lograr y que ha trabajar en un nuevo estándar.
En 2009, el Comité Directivo del Esquema publicó un comunicado de prensa en el que recuerda la diversidad de implementaciones del Esquema, que son tanto su debilidad como su fortaleza. Anunció que la diversidad actual justifica la distinción entre dos lenguajes de Scheme, uno llamado pequeño , heredado de IEEE Scheme y R 5 RS, y otro grande , heredado de R 6 RS, pero compatible entre sí. El Comité Directivo crea dos grupos de trabajo para preparar la nueva revisión (R 7 RS) del idioma.
La primera parte del informe, denominada R 7 RS-small se finalizó enJulio 2013.
Scheme usa la sintaxis de las expresiones S de Lisp cambiando algunas palabras clave. Una expresión de esquema es un valor atómico (número, cadena, identificador, etc. ) o una lista de expresiones. Las diferencias notables con Lisp son: