Siempre me he preguntado por qué Douglas Crockford sigue comparando JavaScript con Scheme. Sí JS estaba destinado a ser Scheme por su diseñador; pero además del soporte de la función de primera clase y el alcance léxico (roto), ¿qué características tiene JS en común con Scheme que la hace "Lisp in C's Clothing"?Además de las funciones de primera clase y el alcance léxico, ¿qué comparte JavaScript con las implementaciones de Scheme?
Respuesta
Otra cosa que viene a la mente es el uso generalizado de una única estructura de datos de omnipresencia de la lengua y las bibliotecas: listas cons en el caso del esquema, mapas (llamados objetos) en el caso de ECMAScript.
Entonces, no es sólo el hecho de que tiene ECMAScript procedimientos de primera clase, pero que estos procedimientos son el único mecanismo de abstracción. (O más precisamente encapsulación mecanismo.)
¿Qué pasa con '(let)' en Scheme? Bueno, supongo que ES5 también lo tendrá. – Pointy
@Pointy: ¿Te refieres a ES6? Sí, AFAIK, 'let' ya está en ES-Harmony. Básicamente, 'var' se va a abandonar, y se reemplaza con' let' (correctamente léxicamente delimitado) y 'const' (no se puede recuperar). –
@Pointy, 'let' es solo una sintaxis de azúcar. Puedes hacer lo mismo en js: '(función (x) {...}) (...)' en lugar de '(let ((x ...)) ...)'. –
De la parte superior de la cabeza, además de echar un vistazo a Wikipedia:
- Estructura de bloque de inspección
- Runtime
- Eval
- No (explícito) compilación paso
- pequeño pero rico stdlib
- S espacio de nombres hared para procedimientos y variables
Una cosa que debería ser importante en esta lista es tener un REPL. Parece un tecnicismo, especialmente cuando estos repls generalmente están ocultos detrás de algunas herramientas de "desarrollador", pero tiene un gran efecto en el lenguaje. (Por ejemplo, es natural tener un eval
real cuando hay una réplica, etc.) Básicamente, la evaluación dinámica del código tiene un estado de primera clase, que es extremadamente útil para algo como JS, y probablemente ha contribuido mucho más a su éxito que funciones de primera clase (que realmente apenas se usaron hasta hace unos años).
Guau, me perdí el elefante en la habitación. Esto está obviamente relacionado con otras características (inspección en tiempo de ejecución, evaluación, sin compilación explícita), pero podría decirse que es más importante que cualquiera de ellas individualmente. – Ken
Bueno, JavaScript carece de homoiconicity, y esta es una de las propiedades principales de los dialectos Lisp.
- 1. Desventajas de las funciones de primera clase
- 2. Pregunta de ejemplo de JavaScript: alcance/cierre léxico - Eloquent Javascript
- 3. ¿Cuáles son las distinciones entre alcance léxico y estático?
- 4. Entorno léxico y alcance de la función
- 5. alcance de las variables en las funciones de devolución de llamada de JavaScript
- 6. ¿Por qué Scheme no admite entornos de primera clase?
- 7. Cómo usar el conjunto! en las funciones de Scheme?
- 8. ¿Hay otras implementaciones de .Net además de las de Microsoft y Mono?
- 9. Alcance de las funciones lambda y sus parámetros?
- 10. Diagramas para las funciones de JavaScript
- 11. ¿Cómo se implementa el Alcance léxico?
- 12. Alcance de la variable en las funciones de VBScript
- 13. Alcance de las funciones de middleware en express.js
- 14. ámbito léxico y dinámica en Mathematica: Las variables locales con el módulo, con, y el bloque
- 15. ¿Por qué las funciones miembro de la clase sombrean funciones libres con el mismo nombre?
- 16. Clase y alcance en Javascript
- 17. ¿Dónde puedo encontrar las implementaciones nativas de estas funciones?
- 18. ¿En qué se diferencian las funciones de prototipo de las funciones normales en javascript?
- 19. ¿Para qué has usado las macros de Scheme?
- 20. Las funciones de JavaScript son objetos?
- 21. Compare las implementaciones de JSF
- 22. En C++, ¿en qué memoria están las funciones de clase?
- 23. JavaScript alcance cláusula catch
- 24. Cuándo se ejecutan las funciones de Javascript
- 25. Scala - sobrecarga de invocación de 'funciones de primera clase'
- 26. Alcance de Lisp común (dinámico frente a léxico)
- 27. ¿Dónde debería usar las implementaciones de BlockingQueue en lugar de las implementaciones de Simple Queue?
- 28. Devolución de funciones en javascript, comprensión del alcance y cierres
- 29. reemplazar de forma no recursiva las funciones de Javascript integradas
- 30. ¿Qué valores de RUBY_ENGINE corresponden a las implementaciones de Ruby?
¿Existe realmente una respuesta significativa y definitiva a esta pregunta? – Pointy
@Pointy: Sí, cualquier función además de la función de primera clase y el alcance léxico sería una respuesta significativa y definitiva. ¿Sabes de alguno? – unj2
Si se pregunta por qué Doug hace algo, ¿por qué no le envía un correo electrónico a Doug? – Ken