8

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?

+0

¿Existe realmente una respuesta significativa y definitiva a esta pregunta? – Pointy

+1

@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

+2

Si se pregunta por qué Doug hace algo, ¿por qué no le envía un correo electrónico a Doug? – Ken

Respuesta

6

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.)

+0

¿Qué pasa con '(let)' en Scheme? Bueno, supongo que ES5 también lo tendrá. – Pointy

+0

@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). –

+0

@Pointy, 'let' es solo una sintaxis de azúcar. Puedes hacer lo mismo en js: '(función (x) {...}) (...)' en lugar de '(let ((x ...)) ...)'. –

5

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
6

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).

+0

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

0

Bueno, JavaScript carece de homoiconicity, y esta es una de las propiedades principales de los dialectos Lisp.

Cuestiones relacionadas