Requisitos
- Use el repo de GitHub dado por la asignación de esta tarea partiendo de la práctica anterior
- Modifique
set
para que podamos modificar un elemento de un array:$ cat examples/set-arr-arr-3.egg do( :=(x, arr[4, 3, arr[2, arr[9, 3],1]]), =(x, 2, 1, 1, 5), # x[2][1][1] = 5 print(<-(x,2,1,1)) # x[2][1][1] is 5 )
- Modifique el
<-
oelement
para que pueda acceder a un array multidimensional como en el ejemplo anteriorprint(<-(x,2,1,1)) # x[2][1][1] is 5
- Modifique las operaciones de adición, and (
&&
), or (||
) multiplicación, división y restas para que en vez de dos operandos puedan recibir un número arbitrario:+(4,5,2,1) # 12
- Modifique las operaciones de menor, mayor,
<=
,>=
,==
, etc. para que en vez de dos operandos puedan recibir un número arbitrario:<(2,a,5) # true if 2 < a and a < 5 same as 2 < a < 5
- Modifique el traductor y la evaluación para que el punto (
m.a
) permita acceder a los campos y un programa como este funcione
Cuando se ejecuta debería producir:$ cat examples/mapmap.egg do { :=(m, map("a": map("x": array[70, 100]), "b": array[2,3])), print( m), # { a: { x: [ 70, 100 ] }, b: [ 2, 3 ] } print(m.a), # { x: [ 70, 100 ] } print(m.b), # [ 2, 3 ] print(m.a.x.1), # 100 print(m.b.1), # 3 }
$ bin/egg.js examples/mapmap.egg { a: { x: [ 70, 100 ] }, b: [ 2, 3 ] } { x: [ 70, 100 ] } [ 2, 3 ] 100 3
Modifique el intérprete para que se pueda acceder a los elementos de un array o map usando la notación corchete:
$ cat examples/array-3.egg do( def(x, array[array[1,4], fun(x,y, +(x,y)),7]), print(x[1](5,9)), # 14 print(x[0, 1]), # 4 print(x[0][1]) # 4 ) $ bin/egg.js examples/array-3.egg 14 4 4
Debería funcionar también con hashes:
$ cat examples/map-bracket.egg # Implemented. Accesing an element of a map do { :=(m, map["a":1,"b":2]), print("m = ", m), print("m[a] = ",m["a"]), # 1 print("m[b] = ",m["b"]), # 2 =(m, 'c', 3), # Future syntax? =(m[c], 3) print("m[c] = ",m["c"]), # 3 print("m = ", m), } $ bin/egg.js examples/map-bracket.egg m = { a: 1, b: 2 } m[a] = 1 m[b] = 2 m[c] = 3 m = { a: 1, b: 2, c: 3 }
- Proyecto: Modifique el lenguaje para que incorpore expresiones regulares extendidas como en este ejemplo:
$ cat examples/regexp.egg /* Not implemented: regexp example */ do { :=(d, / (?<year> \d{4} ) -? # year (?<month> \d{2} ) -? # month (?<day> \d{2} ) # day /x), print(d.test("2015-02-22")), # true :=(m, d.exec("2015-02-22")), /* [ '2015-02-22', '2015', '02', '22', index: 0, input: '2015-02-22', year: '2015', month: '02', day: '22' ] */ print(m.year) # 2015 }
Expanda el lenguaje para que permita el uso de librerías como en el ejemplo que sigue. Este es un ejemplo de cliente:
$ cat examples/require/client.egg do { :=(z, require("examples/require/module.egg")), print(z.inc(4)) }
y este sería el código en el módulo:
$ cat examples/require/module.egg # module. Exports z do { :=(z, map("inc": ->(x, +(x,1) ) # end fun ) # end map ), # end of := z # el último valor será exportado }
Repase el vídeo Como implementar la funcionalidad de "require". Aquí tiene un enlace al Repo correspondiente al vídeo.
- Memoize las librerías para que no se carguen dos veces
- Procure añadir esta funcionalidad sin tocar el código principal usando el strategy pattern + registry pattern
Añada pruebas, integre con circleci, publique el módulo npm
Recursos
- Eloquent JS: Chapter 11. Project: A Programming Language
- El lenguaje egg: repo en GitHub
- Repo interpreter-egg
- NodeJS Readline gist
- En el repo ULL-ESIT-PL-1617/interpreter-egg se muestra como hacer un bucle REPL
- XRegExp
- Tests. Mocking and Stubbing
- Repase el vídeo Como implementar la funcionalidad de "require"
- Repo correspondiente al vídeo