¿Qué es lo más profundo que aprendiste al leer SICP?

En primer lugar, no he terminado SICP. Todavía tengo que estudiar uno y medio capítulos. No sé si estas cosas suenan profundas, pero esto es lo que aprendí / reaprendí.

  1. Evaluación aplicativa y de orden normal. Aprendí bastante en el curso en línea de Scala. En el primer capítulo, se preguntará por qué demonios necesita una evaluación de orden normal y, al menos, obtendrá la respuesta al final del tercer capítulo (o simplemente observe las declaraciones cond).
  2. Diferentes tipos de recursión: debo admitir que no sabía esto. Aprendí cola, árbol y recursión lineal. En general, me sentí cómodo trabajando con funciones recursivas y de orden superior mientras trabajaba en los ejercicios.
  3. ¡El hecho de que los lenguajes de programación no necesitan tener construcciones iterativas! Se pueden simular por recursión de cola.
  4. El poder de la abstracción y la programación dirigida por datos (que se puede traducir aproximadamente en características como la interfaz y las clases de tipos en otros lenguajes de programación).
  5. Los autores hablan sobre “construir idiomas sobre otro idioma para controlar la complejidad”. Un ejemplo es el lenguaje de compuerta lógica construido sobre Scheme. Están hablando sobre el uso de lenguajes específicos de dominio y el uso del nivel correcto de abstracciones.
  6. Programación funcional, modelo de sustitución y transparencia referencial. El modelo donde puede sustituir la función por el cuerpo de la función y verla como una ecuación matemática bajo ciertas condiciones.
  7. ¿Cómo la mutación complica las cosas y destruye la transparencia referencial? Luego se introduce el modelo de entorno como reemplazo del modelo de sustitución. Una vez que aprendí el modelo de entorno, tenía sentido completamente cómo funciona el sombreado en lenguajes de programación. Además, entendí el concepto de alcance léxico.
  8. El Capítulo 3 también presenta el paradigma orientado a objetos. Las clases y los objetos se simulan utilizando procedimientos y estados locales. Una vez que haya leído esto, la forma en que funciona la llamada al método, el polimorfismo y la encapsulación tiene sentido. Es posible que haya leído acerca de los objetos que se comunican entre sí al “enviar mensajes”. Puedes verlo claramente.
  9. Streams y pereza en lenguajes de programación. Estructuras de datos infinitos? ¿Qué? El código de tamiz de Eratóstenes escrito usando secuencias es muy elegante y directo. Me encantó.
  10. Intérprete: [evaluar y aplicar]. El hecho de que son solo dos funciones recursivas mutuamente dado el árbol de sintaxis abstracta en el nivel conceptual. ¡Okay! Estoy de acuerdo en que lo estoy simplificando un poco. Pero espero que entiendas la idea. Pero los intérpretes reales necesitan tener dos pases o admitir encabezados de función para admitir la recursividad mutua y también incluyen mucha optimización, como la compilación Just In-Time.

El capítulo final trata sobre la compilación en código máquina y aún no lo he revisado. El cuarto capítulo también tiene ejercicios para agregar características al Esquema después de crear un evaluador metacircular, una evaluación no determinista, etc. Espero poder digerirlo algún día.

Finalmente, encontré que la sintaxis de Lisp es simple y hermosa. Hubo algunos ejercicios como construir y agregar características al programa de diferenciación simbólica, escribir un solucionador de rompecabezas N-Queens usando solo funciones como mapear, reducir, filtrar, mapear (y en general, pensar en términos de ellos), escribir un evaluador meta-circular que disfruté mucho

Que en FP, se llama a una función para cambiar de estado, y lo que eso realmente significa. Lo mencioné en el ejercicio 1.11 del SICP: “No hay cuchara”. Publiqué esto como una guía para aquellos que intentan hacer el ejercicio 1.11. No quería dar la respuesta, pero aquí es donde me di cuenta de esta idea. Recibí comentarios de algunas personas que se preguntaban: “¿Cuál es el problema? Esto fue fácil ”. Sospecho que parte de esto proviene de personas que no estaban usando la forma de iteración de la que hablaba el libro, pero que usaron una construcción de bucle diferente que está disponible en Racket. No sé si usar el método del libro hace que sea más difícil conceptualizarlo. Fue un gran problema para mí. Es un momento cuando se encendió la bombilla, donde entendí mejor la FP.

Hubo un par de otras ideas realmente increíbles que obtuve al hacer los ejercicios.

Una fue que podía hacer los ejercicios realmente difíciles, cuando pensaba que serían imposibles, y que podía darme cuenta de algunas cosas bastante sorprendentes, como cómo optimizar el cálculo de la secuencia de Fibonacci. No hice todos los ejercicios, y un par me dejó perplejo. Aún así, pude lograr mucho más de lo que pensé que podía.

Otra idea vino en la sección sobre Streams, donde llegué a comprender cómo se podían realizar y usar conjuntos numéricos infinitos en un entorno de programación, como en Haskell, y lo hermoso que hace que la programación de algunos problemas. Se sintió tan fácil resolverlos, una vez que entendiste un poco su concepto de transmisión. Sin embargo, me golpeé contra una pared, donde me di cuenta de que no entendía el concepto de transmisiones lo suficientemente bien, y ahí fue donde me detuve. Realmente no he vuelto a eso desde entonces.

More Interesting

¿Podría haber estándares de cifrado que descansen en un problema NP-hard distinto de la factorización entera?

¿Existe un algoritmo que lo ayude a visualizar las distancias entre los n nodos de manera óptima?

¿Cuáles son los diferentes enfoques que uno puede tomar para mejorar la precisión dado un conjunto de datos además de probar diferentes algoritmos en el aprendizaje automático?

Cómo implementar la idea de algoritmos en MATLAB

¿Cómo se puede calcular el número de inversiones entre dos matrices en O (N log N)?

¿Qué es un algoritmo numérico simpléctico?

¿Cuáles son las piezas más llamativas del arte algorítmico?

¿Debo compartir un nuevo algoritmo de clasificación que escribí? ¿Existe algún potencial monetario en un algoritmo? De ser así, ¿cómo capitalizo?

¿Cómo resolver el problema de los genéricos?

Cómo incrementar mis habilidades en programación dinámica

Cómo comenzar a crear un modelo / pronóstico de ventas con dos años y medio de datos de ventas anteriores

Si llamo k veces getSuccessor () de un nodo con altura h en una búsqueda de árbol binario. ¿Cómo pruebo que el tiempo de ejecución tomará solo O (k + h)?

En plataformas de programación competitivas como TopCoder y CodeChef, ¿cómo sé que una competencia o proyecto es bueno para participar?

¿Cómo obtenemos ideas para resolver preguntas de programación dinámica?

Cómo desarrollar un algoritmo para detectar rangos de negociación horizontales / patrones de consolidación