Red de conocimiento del abogados - Cuestiones jurídicas del divorcio - ¿Cómo evaluar el lenguaje de programación Racket?

¿Cómo evaluar el lenguaje de programación Racket?

El nacimiento y desarrollo de Racket

Una breve introducción al desarrollo de Racket. Para obtener más detalles, consulte la respuesta de Zhihu a una pregunta sobre Racket: ?

1958, John McCarthy, el padre de la inteligencia artificial, inventó un lenguaje de procesamiento simbólico basado en el cálculo Lambda. En 1960, McCarthy publicó el famoso artículo "Funciones recursivas de expresiones simbólicas y su computación por máquina". LSIP (Procesador de listas), su sintaxis se denomina: expresión simbólica (S-Expression). LISP se basa en 7 funciones [atom car cdr cond cons eq quote] y 2 tipos especiales [etiqueta lambda].

Lisp nació originalmente para la investigación científica pura. La ejecución del código es como una fórmula matemática, calculada por el cerebro humano. No fue hasta que Stephen Russell, alumno de McCarthy, implementó la función de evaluación en la máquina IBM 704 que comenzó la historia de Lisp como lenguaje informático. En 1962, nació el primer compilador Lisp completo en el MIT. Desde entonces, Lisp se ha extendido por todo el mundo con el MIT como centro. Durante la siguiente década, aparecieron varios dialectos Lisp.

En 1975 nació Scheme. Scheme también nació en el MIT. Su filosofía de diseño es el minimalismo. Solo proporciona algunas primitivas necesarias y todas las demás funciones prácticas se implementan mediante bibliotecas. Bajo el concepto de diseño minimalista, Scheme tiende a ser extremadamente elegante y se usa ampliamente en la comunidad educativa como lenguaje de enseñanza informática.

En 1984 nació Common Lisp. En las décadas de 1970 y 1980, debido a demasiados dialectos de Lisp, la comunidad se dividió, lo que no contribuyó al desarrollo general de Lisp. A partir de 1981, bajo la operación de un grupo de hackers de Lisp, después de tres años de arduo trabajo para integrarse, se lanzó Common Lisp en 1984. Dado que el concepto de diseño de Scheme es diferente de otras versiones de Lisp, aunque Common Lisp toma prestadas algunas características de Scheme, no integra Scheme. Desde entonces, sólo han quedado dos dialectos de Lisp: Common Lisp y Scheme.

Desde la década de 1990, debido al auge de C, Java y C#, Lisp ha ido decayendo gradualmente. No fue hasta 2005 que, a medida que la informática científica se calentó y los lenguajes dinámicos JavaScript, Python y Ruby se hicieron populares, Lisp volvió gradualmente a llamar la atención de la gente. Sin embargo, en el mundo de la educación, la posición tradicional de Lisp, Python lanzó una carga contra Scheme como un poderoso rival. En 2008, el MIT abandonó el curso SICP (Construcción e Interpretación de Programas de Computadora) que usaba Scheme como lenguaje de enseñanza y recurrió a Scheme; Python para la enseñanza básica. Al mismo tiempo, la Universidad Northeastern en los Estados Unidos estableció una estufa separada y su sistema informático científico líder, PLT Scheme, comenzó a desarrollarse rápidamente en 2010, PLT Scheme pasó a llamarse Racket; En los últimos años, The Racket Language se ha convertido continuamente en el sitio web lingüístico más activo del año, junto con el sitio web de Haskell. ?

Expresión simbólica S-Expression

Primero hablemos de S-expression: ¿Los elementos básicos de S-expression son lista y átomo?. Una lista está entre paréntesis y puede contener cualquier número de elementos separados por espacios. Los átomos son otros elementos. ?Utiliza notación de prefijo y se utiliza como código y datos en Lisp.

?Por ejemplo: 1 2*3 ?Escrito como expresión de prefijo es ?( 1 (* 2 3)) .

Ventajas: fácil de analizar, simple y puro, sin necesidad de considerar prioridades, etc., que también es un requisito previo para realizar el código como datos;

Desventajas: poco legible;

Funciones de orden superior

Las funciones de orden superior satisfacen al menos una de las siguientes condiciones:

Aceptar una o más funciones como entrada;?

Generar una función;

Un ejemplo de esto son las derivadas en cálculo, que asignan una función a otra. ?En el cálculo lambda sin tipo, todas las funciones son de orden superior?. En programación funcional, las funciones de orden superior que devuelven otra función se denominan funciones curry. ?Currying es la técnica de transformar una función que acepta múltiples parámetros en una función que acepta un solo parámetro (el primer parámetro de la función original) y devuelve una nueva función que acepta los parámetros restantes y devuelve un resultado. Por ejemplo, f(x, y)=x y, si se da y=1, entonces se obtiene la función g(x)=x 1.

Expresión lambda

Las expresiones lambda se utilizan en Racket para definir funciones anónimas. Los principios de uso dados en el libro "Cómo diseñar programas" son: Si es una función no recursiva solo Si. debe usarse una vez como parámetro, ¿usar expresión Lambda? Si desea utilizar expresiones Lambda para expresar recursividad, debe introducir el "combinador Y". Y es un operador de este tipo. Cuando actúa sobre cualquier función F (que acepta una función como parámetro), devolverá una función X. . Luego aplica F a esta función X y aún obtendrás X. Entonces X se llama punto fijo de F, es decir (Y F) = (F (Y F)) .

Evaluación diferida

Evaluación diferida (Evaluación diferida), para decirlo sin rodeos, no es necesario calcular algunos resultados intermedios. Encontrarlos no favorece cálculos posteriores y es un desperdicio. . tiempo. Ver: ?Evaluación diferida y programación diferida?. ?

La evaluación diferida es un concepto en programación de computadoras, su propósito es minimizar el trabajo realizado por la computadora. El beneficio más importante de la evaluación diferida es que puede construir una cantidad ilimitada de tipos de datos. Cuando se utiliza la evaluación diferida, la expresión no se evalúa inmediatamente después de vincularse a la variable, sino que se evalúa cuando se recupera el valor. Declaraciones como x:=expresión; (asignar el resultado de una expresión a una variable) llaman explícitamente a la expresión y calculan y colocan el resultado en Cuando hay una referencia a x en la expresión y se requiere su valor, se requiere la evaluación de la La expresión posterior también se puede retrasar y, finalmente, se calcula el valor de rápido crecimiento para generar un determinado símbolo para que lo vea el mundo exterior. ?

Cierre

Cierre En informática, ?cierre (Closure) es la abreviatura de cierre léxico (Lexical Closure), que es una función que hace referencia a variables libres?. Una variable libre es un símbolo utilizado para representar una posición o posiciones en una expresión. Por ejemplo, cuando f(x, y) toma la derivada parcial de x, y es la variable libre. La variable libre a la que se hace referencia permanecerá con la función incluso después de que haya abandonado el entorno en el que fue creada. Al definir otra función dentro de una función (anidada), si la función interna hace referencia a las variables de la función externa, puede ocurrir un cierre. En tiempo de ejecución, una vez que se ejecuta la función externa, se forma un cierre que contiene el código de la función interna y referencias a las variables en la función externa requerida. La variable a la que se hace referencia se llama valor ascendente. Hay muchos artículos sobre cierres de JavaScript en Internet. Si tiene una comprensión sistemática de LISP, este concepto, naturalmente, será muy claro.

Implementación de raqueta de clasificación rápida #lang?racket

(define?(quick-sort?array) (cond

[(empty?array)?empty ];?La idea de la ordenación rápida es la recursividad de divide y vencerás

[else?(append?

(quick-sort?(filter?(lambda?(x)? (lt;? x?(primera?matriz)))?matriz));?matriz? aquí está el cierre

(filtro?(lambda?(x)?(=?x?(primera?matriz) ) ))?array)

(¿ordenación rápida?(filtro?(lambda?(x)?(gt;?x?(first?array)))?array))]))

(quick-sort?'(1?3?2?5?3?4?5?0?9?82?4))

;;?Ejecutar resultado?'( 0?1?2?3?3?4?4?5?5?9?82)

A través de este ejemplo, puede sentir la poderosa capacidad de expresión del lenguaje Racket basado en el uso del operador lambda. de funciones de orden superior, expresiones lambda y cierres es muy refinado en la clasificación rápida descrita por Racket, que es un modo de pensamiento completamente diferente del lenguaje C basado en el modelo de von Neumann. Más adelante, a medida que aprenda más sobre Racket, intente escribir un intérprete