Esquema

Esquema
Semántica funcional
clase de idioma lenguaje de programación , lenguaje de programación multiparadigma , lenguaje de programación funcional , lenguaje de programación procedimental y lenguaje de metaprogramación [d]
tipo de ejecución intérprete o compilador
Apareció en 1975
Autor Guy Steele y Gerald Sussman
extensión de archivo .scm, .ss
Liberar
sistema de tipos fuerte, dinámico
Implementaciones principales Esquema PLT , Esquema MIT , Scheme48 , Guile , JScheme
Dialectos T
sido influenciado Ceceo , ALGOL
influenciado Common Lisp , JavaScript , R , Ruby , Dylan , Lua , Hop, raqueta
Sitio web esquema-reports.org
 Archivos multimedia en Wikimedia Commons

Scheme [ skiːm ] es un lenguaje de programación funcional , uno de los tres dialectos Lisp más populares (junto con Common Lisp y Clojure ). Creado a mediados de la década de 1970 por los investigadores del MIT Guy L. Steele y Gerald Jay Sussman .  

Tiene un diseño minimalista, contiene un mínimo de estructuras primitivas y te permite expresar todo lo que necesitas construyendo sobre ellas. Por ejemplo, utiliza solo dos mecanismos de bucle: recursión de cola y un enfoque iterativo (que utiliza variables temporales para almacenar un resultado intermedio).

El lenguaje comenzó como un intento de implementar el modelo de actor de Carl Hewitt , para el cual Steele y Sussman escribieron "un pequeño intérprete de Lisp" y luego "añadieron un mecanismo para crear actores y enviar mensajes". Scheme fue el primer dialecto de Lisp en usar exclusivamente el alcance variable estático (en lugar de dinámico) , lo que garantizaba la optimización de la recursión de cola y proporcionaba soporte de tipo booleano ( #ty #fen lugar del tradicional Ty NIL). También se convirtió en uno de los primeros lenguajes en admitir continuaciones . A partir de la especificación R⁵RS, el lenguaje adquirió una facilidad para escribir macros basadas en patrones de transformación sintáctica con " macro higiénica " .  Se proporciona " recolección de basura " (liberación automática de memoria de objetos que ya no se utilizan).

El lenguaje utiliza listas y matrices unidimensionales ("vectores") como estructuras de datos básicas. De acuerdo con el minimalismo declarado, no existe (todavía) una sintaxis estándar para las estructuras de soporte con campos con nombre, así como las facilidades OOP  ; todo esto puede ser implementado por el programador según sus preferencias, aunque la mayoría de las implementaciones del lenguaje ofrecen mecanismos listos para usar.

El nombre original del idioma, Schemer, se cambió debido a la limitación en la longitud de los nombres de archivo en ITS ; ( Inglés  intrigante  - "aventurero", "combinador"; aparentemente, una pista de otros lenguajes similares a ceceo que salieron del MIT - Planner (en uno de los significados - "proyector") y Conniver ("conspirador "). El libro " La estructura e interpretación de los programas informáticos " de Abelson y Sussman , que se utilizó durante mucho tiempo como libro de texto básico de programación en el Instituto Tecnológico de Massachusetts, hizo una contribución significativa a la popularización del lenguaje .

Ejemplos

Operaciones matemáticas simples:

( + 2 ( * 2 2 )) > 6 ( + 1 2 3 4 ) > 10

La llamada a cada operación (o función) está representada por una lista en la que el símbolo de la operación (que es esencialmente el nombre de la función) siempre ocupa la posición inicial.

Escriba predicados:

( ¿número? 5 ) ( ¿número? "foo" ) ( cadena? "foo" )

Por convención, todos los nombres de predicados terminan en ?.

Comprobaciones de igualdad:

( igual? "foo" "barra" ) ( eqv? 5 ( + 2 3 )) ( eq? 'a 'A )

Definición de macros para operaciones push y pop tradicionales:

( define-syntax push! ( syntax-rules () (( push! x l ) ( set! l ( contras x l ))))) ( define-syntax pop! ( reglas-syntax () (( pop! l ) ( let (( x ( car l ))) ( set! l ( cdr l )) x ))))

Definiciones de funciones:

;; factorial en estilo recursivo (ineficiente) ( define ( fact x ) ( if ( < x 2 ) 1 ( * ( fact ( - x 1 )) x ))) ;; Función de Fibonacci: requiere recursividad paralela ( define ( fib n ) ( cond (( = n 0 ) 0 ) (( = n 1 ) 1 ) ( else ( + ( fib ( - n 1 )) ( fib ( - n 2 )) )))) ;; la suma de los elementos de la lista en un estilo típico de Scheme ;; (la función auxiliar de bucle expresa un bucle con ;; recursividad final y una variable acumuladora) ( define ( sum-list x ) ( let loop (( x x ) ( n 0 )) ( if ( null? x ) n ( bucle ( cdr x ) ( + ( coche x ) n ))))) ( hecho 14 ) ( fib 10 ) ( suma-lista ' ( 6 8 100 )) ( suma-lista ( mapa fib ' ( 1 2 3 4 )))

La definición de la función debe ajustarse al siguiente prototipo:

( definir el nombre de la función ( lambda ( argumentos ) ( implementación de la función )))

aunque en la práctica se suele utilizar la forma abreviada:

( define ( argumentos de nombre de función ) ( implementación de función ))

E/S

El esquema utiliza el tipo de puerto para entrada y salida ( port, R5RS sec 6.6) [1] . R5RS define dos puertos estándar, disponibles como current-input-porty current-output-port, correspondientes a flujos de E/S de Unix estándar. La mayoría de las implementaciones también proporcionan current-error-port. La redirección de E/S se admite en el estándar a través de los procedimientos with-input-from-filey with-output-to-file. Las implementaciones también tienen puertos de cadena a través de los cuales se pueden realizar muchas operaciones de E/S en un búfer de cadena en lugar de un archivo, usando procedimientos de SRFI 6 [2] . El estándar R6RS define procedimientos más complejos para tratar con puertos y muchos tipos nuevos de puertos.

Los siguientes ejemplos están escritos en R5RS Scheme.

( escribir ( + ( leer ) ( leer )))

Salida al puerto predeterminado (puerto de salida actual):

( let (( hola0 ( lambda () ( mostrar "Hola mundo" ) ( nueva línea )))) ( hola0 ))

Pasar un puerto como argumento:

( let (( hola1 ( lambda ( p ) ( mostrar "Hola mundo" p ) ( nueva línea p )))) ( hola1 ( puerto de salida actual )))

Redirigir la salida a un archivo:

( let (( hola0 ( lambda () ( mostrar "Hola mundo" ) ( nueva línea )))) ( con salida a archivo "archivo de salida" hola0 ))

Abriendo explícitamente un archivo y cerrando un puerto:

( let (( hola1 ( lambda ( p ) ( mostrar "Hola mundo" p ) ( nueva línea p ))) ( puerto de salida ( abrir archivo de salida " archivo de salida " ))) ( hola1 puerto de salida ) ( cerrar salida -puerto puerto-salida ) )

llamada-con-archivo-de-salida:

( let (( hola1 ( lambda ( p ) ( mostrar "Hola mundo" p ) ( nueva línea p )))) ( llamada con archivo de salida "archivo de salida" hola1 ))

Existen procedimientos similares para la entrada. R5RS Scheme proporciona predicados input-port?y output-port?. Para la entrada y salida de caracteres , existen write-char, y . Los procedimientos y se utilizan para leer y escribir expresiones de Scheme . Si el puerto ha llegado al final del archivo en una operación de lectura, se devuelve un objeto eof que puede reconocer el predicado . read-charpeek-charchar-ready?readwriteeof-object?

SRI

Debido al minimalismo del lenguaje, muchos procedimientos y formas sintácticas comunes no están definidos en el estándar. Para mantener pequeño el núcleo del lenguaje y promover la estandarización de las extensiones, la comunidad de Scheme ha adoptado un proceso de "Solicitud de Scheme para implementación" mediante el cual se analizan cuidadosamente las extensiones propuestas. Esto contribuye a la portabilidad del código. Muchos SRFI son compatibles con todas o la mayoría de las implementaciones del Esquema.

Los siguientes SRFI [3] son ​​ampliamente compatibles con las implementaciones :

  • 0: busca extensiones concond-expand
  • 1: biblioteca para listas
  • 4: vectores numéricos homogéneos
  • 6: puertos de cadena
  • 8: receive: vincular a múltiples valores
  • 9: tipos de registros
  • 13: biblioteca para cadenas
  • 14: biblioteca de conjuntos de caracteres
  • 16: sintaxis para procedimientos de aridad variable
  • 17: generalizadoset!
  • 18: compatibilidad con subprocesos múltiples
  • 19: tipos de datos y procedimientos para trabajar con el tiempo
  • 25: arreglos multidimensionales
  • 26: notación para fijar argumentos de procedimiento sin curry
  • 27: fuentes de bits aleatorios
  • 28: formato de cadena básico
  • 29: localización
  • 30: comentarios multilínea anidados
  • 31: una forma especial de ejecución recursiva
  • 37: args-fold: procesador de argumentos de programa
  • 39: objetos de parámetro
  • 41: flujos de datos
  • 42: comprensiones ansiosas
  • 43: biblioteca de vectores
  • 45: primitivas para expresar algoritmos iterativos perezosos
  • 60: operaciones de bits
  • 61: más generalcond
  • 66: octeto vectores
  • 67: procedimientos de comparación

Principales implementaciones

GNU Guile , el lenguaje de extensión del Proyecto GNU , es un intérprete de Scheme implementado como una biblioteca que permite que las aplicaciones creen un intérprete de Scheme interno.

El lenguaje Racket fue originalmente una implementación de Scheme (originalmente llamado PLT Scheme).

MIT Scheme  es una implementación gratuita ( GPL ) para la plataforma x86 bajo Linux , FreeBSD , IBM OS/2 y Win32 . Chicken Scheme  es un intérprete que admite la traducción de C. JScheme  es un intérprete escrito en Java ; Kawa es un  compilador de bytecode de Scheme a JVM . El compilador Chez Scheme se ha suministrado como un producto comercial durante mucho tiempo, desde 2016 se ha distribuido libremente ( Apache ).

En total, existe una gran cantidad de implementaciones de lenguaje para diferentes plataformas, en particular, existe un intérprete Armpit Scheme para microcontroladores basado en la arquitectura ARM [4] .

Notas

  1. Ricardo Kelsey; Guillermo Clinger; jonathan rees; Rosas, GJ; Adams IV, NI; Friedman, DP; Kohlbecker, E.; Steele Jr., GL; Bartley, DH Informe revisado 5 sobre el esquema de lenguaje algorítmico  //  Computación simbólica y de orden superior: revista. - 1998. - Agosto ( vol. 11 , no. 1 ). - Pág. 7-105 . -doi : 10.1023/A : 1010051815785 .
  2. William D. Clinger. SRFI 6: Puertos básicos de cadena . The SRFI Editors, Schemers.org (1 de julio de 1999). Consultado el 9 de agosto de 2012. Archivado desde el original el 21 de octubre de 2021.
  3. Scheme Systems que admiten SRFI . Los editores de SRFI, Schemers.org (30 de agosto de 2009). Consultado el 9 de agosto de 2012. Archivado desde el original el 20 de junio de 2021.
  4. Un intérprete de esquemas para microcontroladores ARM . Fecha de acceso: 30 de diciembre de 2014. Archivado desde el original el 30 de diciembre de 2014.

Literatura

Enlaces