Skip to content

Commit f58a736

Browse files
committed
65% of chapteerr 12
1 parent 18ebd21 commit f58a736

File tree

1 file changed

+90
-84
lines changed

1 file changed

+90
-84
lines changed

12_language.md

Lines changed: 90 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -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}
461460
const topScope = Object.create(null);
@@ -464,87 +463,91 @@ topScope.true = true;
464463
topScope.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)`);
471470
console.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}
484483
for (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
```
518519
run(`
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}
550553
specialForms.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

650656
And when it comes to getting something done, cheating is more
651657
effective than doing everything yourself. Though the toy language in

0 commit comments

Comments
 (0)