@@ -447,15 +447,14 @@ specialForms.define = (args, scope) => {
447447
448448{{index "lenguaje Egg", "evaluar función"}}
449449
450- The ((scope )) accepted by ` evaluate ` is an object with properties
451- whose names correspond to binding names and whose values correspond to
452- the values those ((binding))s are bound to. Let's define an object to
453- represent the ((global scope )).
450+ El ((ámbito )) aceptado por ` evaluate ` es un objeto con propiedades
451+ de las que sus nombres corresponden a los nombres de las vinculaciones en el ámbito
452+ y sus valores corresnponden a los valores de esos vínculos. Ahora definamos un objeto
453+ para representar el ((ámbito global )).
454454
455- To be able to use the ` if ` construct we just defined, we must have
456- access to ((Boolean)) values. Since there are only two Boolean values,
457- we do not need special syntax for them. We simply bind two names to
458- the values ` true ` and ` false ` and use those.
455+ Para poder usar el constructo ` if ` que acabamos de definir, necesitamos acceder
456+ a valores ((Booleano))s. Como solo hay dos valores Booleanos, no necesitamos una sintaxis
457+ especial. Simplemente asociaremos dos nombres a los valores ` true ` y ` false ` y usaremos estos nombres.
459458
460459``` {includeCode: true}
461460const topScope = Object.create(null);
@@ -464,87 +463,91 @@ topScope.true = true;
464463topScope.false = false;
465464```
466465
467- We can now evaluate a simple expression that negates a Boolean value .
466+ Podemos evaluar una expresión simple que niegue un Booleano .
468467
469468```
470- let prog = parse(`si (true, false, true)`);
469+ let prog = parse(`if (true, false, true)`);
471470console.log(evaluate(prog, topScope));
472471// → false
473472```
474473
475- {{index arithmetic, "Function constructor"}}
474+ {{index aritmética, "constructor de Función"}}
475+
476+ Para proveer la ((aritmética)) y ((operador))es de ((comparación)),
477+ necesitamos además añadir algunas funciones al ((ámbito)). Para mantener
478+ el código peequeño, usaremos ` Function ` para sintetizar varias
479+ funciones de operador en un ciclo, en vez de definirlas individualmente.
476480
477- To supply basic ((arithmetic)) and ((comparison)) ((operator))s, we
478- will also add some function values to the ((scope)). In the interest
479- of keeping the code short, we'll use ` Function ` to synthesize a bunch
480- of operator functions in a loop, instead of defining them
481- individually.
482481
483482``` {includeCode: true}
484483for (let op of ["+", "-", "*", "/", "==", "<", ">"]) {
485484 topScope[op] = Function("a, b", `return a ${op} b;`);
486485}
487486```
488487
489- A way to ((output)) values is also very useful, so we'll wrap
490- ` console.log ` in a function and call it ` imprimir ` .
488+ Tener una manera de ((devolver)) valores tambbién es muy útil,
489+ así que envolveremos ` console.log ` en una función y la llamaremos
490+ ` print ` .
491491
492492``` {includeCode: true}
493- topScope.imprimir = value => {
493+ topScope.print = value => {
494494 console.log(value);
495495 return value;
496496};
497497```
498498
499- {{index parsing, "run function"}}
499+ {{index parseo, "función run"}}
500+
501+ Esto nos da suficientes herramientas elementales para escribir
502+ programas simples. La siguiente función provee una forma conveniente
503+ de leer un programa y correrlo en un ámbito nuevo.
500504
501- That gives us enough elementary tools to write simple programs. The
502- following function provides a convenient way to parse a program and
503- run it in a fresh scope.
504505
505506``` {includeCode: true}
506- function run(programa ) {
507- return evaluate(parse(programa ), Object.create(topScope));
507+ function run(program ) {
508+ return evaluate(parse(program ), Object.create(topScope));
508509}
509510```
510511
511- {{index "Object.create function ", prototype }}
512+ {{index "función Object.create", prototipo }}
512513
513- We'll use object prototype chains to represent nested scopes, so that
514- the program can add bindings to its local scope without changing the
515- top-level scope .
514+ Usareomos las cadenas de prototipos de los objetos para representar
515+ ámbitos anidados, para que el programa pueda añadir asignaciones a su
516+ ámbito local sin cambiar el ámbito superior .
516517
517518```
518519run(`
519- hacer(definir (total, 0),
520- definir (count, 1),
520+ do(define (total, 0),
521+ define (count, 1),
521522 while(<(count, 11),
522- hacer(definir (total, +(total, count)),
523- definir (count, +(count, 1)))),
524- imprimir (total))
523+ do(define (total, +(total, count)),
524+ define (count, +(count, 1)))),
525+ print (total))
525526`);
526527// → 55
527528```
528529
529- {{index "summing example", "Egg language"}}
530+ {{index "ejemplo de suma", "lenguaje Egg"}}
531+
532+ Este es el programa que hemos visto varias veces antes, que calcula la suma
533+ de los números del 1 a 10, expresado en Egg. Es claramente más
534+ feo que su equivalente en JavaScript, peror no está tan mal para
535+ un lenguaje implementado en menos de 150 ((líneas de código)).
530536
531- This is the program we've seen several times before, which computes
532- the sum of the numbers 1 to 10, expressed in Egg. It is clearly uglier
533- than the equivalent JavaScript program—but not bad for a language
534- implemented in less than 150 ((lines of code)).
535537
536538{{id egg_fun}}
537539
538- ## Functions
540+ ## Funciones
541+
542+ {{index función, "lenguaje Egg"}}
539543
540- {{index function, "Egg language"}}
544+ Un lenguaje de programación sin funciones es un lenguaje de
545+ programación pobre, en efecto.
541546
542- A programming language without functions is a poor programming
543- language indeed.
547+ Afortunadamente, no es difícil agregar un constructo ` fun ` ,
548+ que trate su último argumento como el cuerpo de la función y use
549+ todos los argumentos antes de ese como los parámetros de la función.
544550
545- Fortunately, it isn't hard to add a ` fun ` construct, which treats its
546- last argument as the function's body and uses all arguments before
547- that as the names of the function's parameters.
548551
549552``` {includeCode: true}
550553specialForms.fun = (args, scope) => {
@@ -596,56 +599,59 @@ do(define(pow, fun(base, exp,
596599// → 1024
597600```
598601
599- ## Compilation
602+ ## Compilación
600603
601- {{index interpretation, compilation }}
604+ {{index interpretación, compilación }}
602605
603- What we have built is an interpreter. During evaluation, it acts
604- directly on the representation of the program produced by the parser.
606+ Lo que hemos construido es un intérprete. Durante la evaluación, actúa
607+ directamente en la representación del programa producido por el
608+ parseador.
605609
606- {{index efficiency, performance}}
607610
608- _ Compilation_ is the process of adding another step between the
609- parsing and the running of a program, which transforms the program
610- into something that can be evaluated more efficiently by doing as much
611- work as possible in advance. For example, in well-designed languages
612- it is obvious, for each use of a ((binding)), which binding is being
613- referred to, without actually running the program. This can be used to
614- avoid looking up the binding by name every time it is accessed,
615- instead directly fetching it from some predetermined ((memory))
616- location.
611+ {{index eficiencia, rendimiento}}
617612
618- Traditionally, ((compilation)) involves converting the program to
619- ((machine code)), the raw format that a computer's processor can
620- execute. But any process that converts a program to a different
621- representation can be thought of as compilation.
613+ La _ Compilación_ es el proceso de añadir otro paso entre la lectura
614+ del programa y su ejecución, que transforma el programa en algo que
615+ pueda ser evaluado más eficientemente, haciendo la mayor cantidad
616+ de trabajo posible por adelantado. Por ejemplo, en lenguajes bien
617+ diseñados es obvio, para cada uso de una ((asignación)), a qué asignación
618+ te estás refiriendo, sin correr el programa. Esto puede ser usado para
619+ evitar buscar la asociación por nombbre cada vez que se usa, y, en vez de eso,
620+ traer directamente el valor de una locación predeterminada de
621+ ((memoria)).
622622
623- {{index simplicity, "Function constructor", transpilation}}
623+ Tradicionalmente, la ((compilación)) implica convertir el programa
624+ en ((código máquina)), el formato crudo que el procesador de la computadora
625+ puede ejecutar. Pero puedes pensar en compilación como cualquier proceso
626+ que convierta un programa en una representación diferente.
624627
625- It would be possible to write an alternative ((evaluation)) strategy
626- for Egg, one that first converts the program to a JavaScript program,
627- uses ` Function ` to invoke the JavaScript compiler on it, and then runs
628- the result. When done right, this would make Egg run very fast while
629- still being quite simple to implement.
628+ {{index simplicidad, "función constructor", transpilación}}
630629
631- If you are interested in this topic and willing to spend some time on
632- it, I encourage you to try to implement such a compiler as an
633- exercise.
630+ Sería posible escribir una estrategia de ((evaluación)) alternativa
631+ para Egg, una que primero convierrta el programa a uno de JavaScript,
632+ usa ` Function ` para invocar el compilador de JavaSctipt, y después correr
633+ el resultado. Cuando se hace correctamente, esto haría que Egg
634+ corrra muy rápiddo mientras todavía sigue siendo simple implementarlo.
634635
635- ## Cheating
636+ Si estás interesado en este tema y dispuesto a gastar algo de tiempo,
637+ te animo a que trates de implementar el compilador como ejercicio.
636638
637- {{index "Egg language"}}
639+ ## Haciendo trampa
640+
641+ {{index "lenguaje Egg"}}
642+
643+ Cuando definimos ` id ` y ` while ` , probablemente te diste cuenta de que son
644+ más o menos envoltorios triviales alrededor de los ` if ` y ` while ` de
645+ JavaScript. Similarmente, los valores en Egg son solo valores de
646+ JavaScript comunes.
638647
639- When we defined ` if ` and ` while ` , you probably noticed that they were
640- more or less trivial wrappers around JavaScript's own ` if ` and
641- ` while ` . Similarly, the values in Egg are just regular old JavaScript
642- values.
648+ Si comparas la implementación de Egg, construida soobre JavaScript,
649+ con la cantidad de trabajo y complejidad requerida para
650+ construir un lenguaje de programación directamente en la funcionalidad
651+ pura y cruda provista por una máquina, la diferencia es grande. Sin embargo,
652+ con suerte este ejemplo te dio un vistazo de la forma en
653+ que un ((lenguaje de programación)) funciona.
643654
644- If you compare the implementation of Egg, built on top of JavaScript,
645- with the amount of work and complexity required to build a programming
646- language directly on the raw functionality provided by a machine, the
647- difference is huge. Regardless, this example hopefully gave you an
648- impression of the way ((programming language))s work.
649655
650656And when it comes to getting something done, cheating is more
651657effective than doing everything yourself. Though the toy language in
0 commit comments