Hola gente!
Leo, si, estoy haciendo el Lexer y el Parser a mano, usando TDD.
Siempre hago eso, si ven otros proyectos ahi en mi GitHub, nunca uso
un generador. Me parece tan facil hacerlo en TDD, y de esta forma, vas
realmente entendiendo como son los elementos del lenguaje que uno esta
implementando. El sistema va creciendo con "baby steps".
Buen punto Leo, lo de TokenType. Podria haberlo puesto despues.
Ayer me quede pensando en este hilo, y los refactor. Vi otro ejemplo
de refactor. Antes en este hilo mencionaba cuando aparecia una
interface en un lenguaje tipado. A mi me aparecio ayer, cuando hice
dos cosas:
- Implementar nuevo test
- Refactorizar para mejorar la implementacion
El resultado en:
https://github.com/ajlopez/ClojSharp/commit/51c678ece96d6d1cef92f36afda8d8fc711ffd8c
En ese interprete Lisp/Clojure que estoy armando, hasta ese momento,
una lista soportaba la evaluacion de algo como
(+ 1 2)
Solo con un Add como cabeza de lista. No soportaba nada mas. Ver en
ese commit, el codigo de List.cs que se saco.
Arme nuevos tests para que List soportara tambien simbolos:
(+ one two)
Ver en ese commit, lo que se agrego a ListTests.cs
Eso llevo a que tuviera que implementar lo que hasta ese momento no
tenia implementado: distinguir entre formas (normales) y formas
especiales (special forms) en Lisp.
(def one 1)
define una variable one, pero def no evalua los simbolos ANTES de ser
ejecutada. Es una special form. Y
(+ one two)
SI EVALUA sus argumentos ANTES de sumar. Todo eso llevo a la
aparicion, en varios pasos (en el commit solo se ve el resultado
final, incluso de algun fix de Source Analysis), de
IForm: para las forms Add y Def
BaseForm: para las forms como Add que evaluan sus argumentos ANTES de
ser aplicadas, y IEvaluable para todo lo que se pueda evaluar en un
contexto (por ahora el contexto tiene un diccionaro de nombre/valor,
para resolver por ejemplo el simbolo one a 1)
No tuve que cambiar los tests anteriores, sino que todo fue resultado de:
- Agregar dos tests
- Refactorizar la implementacion para no tener que soportar solo Add,
o solo Def, y asi.. (en algun momento habia puesto if (fn is Add) y
esas cosas, luego con el refactor, se fueron)
Finalmente, todo quedo en verde, los dos nuevos tests y los anteriores
;-)
Este es otro ejemplo concreto de refactor que se me ocurre, sin
cambiar los tests. Tal vez fue demasiado para un solo commit, pero
fueron varios pasos internos que derivaron por tener Add.cs y Def.cs
con diferente conducta.
Cuando tuve que implementar algo parecido en JavaScript, no necesite
de las interfaces IForm y demas. Creo que lo hice de otra manera:
https://github.com/ajlopez/AjLispJs
Nos leemos!
Angel "Java" Lopez
@ajlopez
2013/3/3 Leo Antoli <
leo.a...@gmail.com>: