# Constant Folding
# Objetivos
Construya un paquete npm y
publíquelo en npmjs (opens new window) con ámbito @aluXXX
y con nombre constant-folding
El módulo además de exportar la función constantFolding
provee un ejecutable cf
que se llama así:
cf input.js output.js
el cual realiza la transformación de plegado de constantes sobre input.js
dejando la salida en output.js
.
Una parte de los conceptos y habilidades a adquirir con esta práctica se explican en la sección Creating and publishing a node.js module en GitHub y en NPM. Léala con detenimiento antes de hacer esta práctica.
# Ámbitos
Deberá publicar el paquete en npmjs (opens new window) con ámbito @aluXXX
y con nombre constant-folding
.
Para saber sobre ámbitos, vea la sección Scopes and Registries.
# Pruebas
Deberá añadir pruebas usando Mocha y Chai o Jest. Repase las secciones Testing with Mocha and Chai y Jest.
# Documentación
Documente
el módulo incorporando un README.md
y la documentación de la función exportada usando JsDoc.
Repase la sección Documenting the JavaScript Sources
# Pruebas de Producción
En el repo asignado testing-constant-folding-aluXXX
añada las pruebas necesarias
para comprobar que la última versión del paquete publicado se instala y puede ser usado.
Repase la sección Testing in Production
# Superproject with Git Submodule
Usando git submodule
configure como super-project el repo asignado super-constant-folding-aluXXX
para que contenga
a a los dos repos: en el que ha desarrollado el módulo npm constant-folding-aluXXX
y el repo para las pruebas en tiempo de producción testing-constant-folding-aluXXX
.
El informe de la práctica README.md
se hace en este repo.
Repase la sección Making a Project with the two repos: git submodule
# Challenge: Constant Folding of MemberExpression literals
Añada ahora plegado de constantes para métodos (con argumentos plegables) y propiedades de los arrays. Esto es, expresiones como:
["a", "b", "c"].concat(["d", "e"], "f", "g", ["h"]);
["a", "b", "c"].join();
["a", "b", "c"].join('@');
[1, 2, 3].length;
[1, 2, 3][2-1];
[1, 2, 3].shift();
[1, 2, 3].slice(0, 1+1);
[a, b, c].pop(); // substitute the MemberExpression node by the last AST in the "elements" array of the object Array Expression
[a, b, c].reverse(); // reverse the ASTs
2
3
4
5
6
7
8
9
Serán evaluadas en tiempo de compilación produciendo:
["a", "b", "c", "d", "e", "f", "g", "h"];
"a,b,c";
"a@b@c";
3;
2;
2;
[1, 2];
c;
[c, b, a];
2
3
4
5
6
7
8
9
Implemente las transformaciones necesarias para cubrir al menos tres de los ejemplos mostrados arriba.
Publique ahora esta mejora en la funcionalidad del módulo.
¿Como debe en cambiar el nº de versión?
Repase la sección Semantic Versioning
Other possible optional extensions are:
Constant folding for methods and properties of Literal Strings:
"abc"[0]; "abc".charAt(); "abc".charAt(1); "abc".length; "a,b,c".split(",");
1
2
3
4
5Constant folding for methods and properties of Objects, Numbers, etc.
{a:4, b:5}.b (100 + 23).toString();
1
2
# References
# Constant Folding
- Transformación de plegado de constantes en estos apuntes
- Babel plugin minify-constant-folding (opens new window)
- esmangle (esmangle (opens new window)) is mangler / minifier for Parser API (opens new window) AST that includes constant folding (opens new window)
# Packages
- Creating and Publishing a node.js Module in GitHub and NPM Registries
- Módulos
- Node.js Packages
- Instalación de Módulos desde GitHub
- Introducción a los Módulos en JS (opens new window) por Manz
- @ull-esit-dsi-1617/scapegoat (opens new window) en npm
- How to install an npm package from GitHub directly? (opens new window) in StackOverflow
- Working with scoped packages (opens new window)
- npm-scope manual: Scoped packages (opens new window)
- Package.json documentation en npm site (opens new window)
# Testing and Documentation
# Semantic versioning and npm
Grading Rubric#
#Labs
- Task GitHub-AluXXXX Form
- Lab GitHub Campus Expert
- Lab GitHub Project Board
- Lab GitPod and Visual Studio Code
- Lab IAAS
- Lab Espree Logging
- Lab Hello Compilers
- Lab Constant Folding
- Lab ast-types
- Lab egg-parser
- Lab Lexer Generator
- Lab The Egg Interpreter
- Lab Adding OOP to the Egg Parser
- Lab Extending the Egg Interpreter
- Lab TFA: Final Project PL
- Task Training Exam for PL