2010-01-06 28 views
8

he visto algunas buenas compilador Java hacks en donde se puede replace assertions by throw-exception statements, puede tener AUTOGENERADAS properties para los campos y así sucesivamente ...Sobrecarga de operadores Plugin para Java

Me preguntaba ...

¿Es posible hackear el compilador de Java para que admita la sobrecarga del operador?

EDIT:

No es que me falta la sobrecarga de operadores en Java o algo así. Solo quiero saber si es posible implementarlo usando los hacks mencionados en los enlaces que he dado arriba. Por lo tanto, no me sugiera que cambie a otro idioma como Scala (que ya estoy aprendiendo de todos modos: D).

EDIT:

Por favor, dime si es posible hacerlo utilizando JSR 269 o algo por el estilo. : |

Gracias.

+0

Debe cambiar a Sca ... oh espera ... – skaffman

+2

me gustaría ir preguntar en el grupo Proyecto Lombok - Reinier Zwitserloot y Roel Spilker están realizando muchos ataques de compilación en una variedad de herramientas/compiladores, por lo que probablemente puedan orientarlo en la dirección correcta: http://groups.google.com/group/project-lombok – McDowell

+0

Me parece que uno podría hackear el compilador para hacer cualquier cosa posible en la teoría del compilador. Votando hacia abajo. –

Respuesta

5

En respuesta a la pregunta editada, la única forma de implementar verdadero sobrecarga del operador en Java es agregarlo al idioma. Esto significa que o bien tiene que cambiar el compilador para compilar su código o escribir un preprocesador que convierta su código a Java estándar. Para el primero, puede descargar una implementación casi completa de FOSS java desde GNU o el proyecto OpenJDK. Para este último, puede escribir su propio analizador usando cosas como JavaCC, etc. (los ejemplos están en este page) o puede usar JFront como base para agregar su propia sintaxis.

+1

¿Por qué tendría que modificar el idioma (sintaxis) para hacer eso? La carga del operador es un problema semántico. No debería tener que cambiar las etapas de análisis, aparte de la desambiguación del identificador. – xcut

+0

¿Cómo agregaría la sobrecarga del operador sin modificar la sintaxis? Debería agregar una palabra clave 'operator' o permitir' '' ',' -', etc. como nombres de funciones. Ambos requieren cambiar qué sintaxis es aceptable. –

+0

Me doy cuenta de que puede hacerlo proporcionando métodos especiales dentro de cada clase, como __sum __(), etc. Tenga en cuenta que solo mencioné el análisis junto con la escritura de un preprocesador. –

1

Si desea sobrecargar el operador, puede considerar cambiarse a Scala. El código de Scala es interoperable con sus clases de Java y admite la sobrecarga del operador.

2

JFront es un pre-procesador para el lenguaje Java que le permite implementar la sobrecarga del operador para sus propias clases. Lamentablemente, no parece agregar esta capacidad a las clases estándar (BigInteger et al. Sería un gran candidato para esto).

+0

Sería un buen truco si pudiera hacerlo para las clases de la API 'java. *', Pero supongo que usa bytecode o modificación de fuente, que no es una opción para 'java. *' (Sin algún footwork de carga de clases sofisticado) , de todas formas). – skaffman

1

Otro enfoque es utilizar las librerías Groovy ya que, Groovy ya tiene sobrecarga del operador.

https://o24j.dev.java.net/

La implementación actual utiliza maravilloso para la sobrecarga. Este enfoque tiene un inconveniente: las bibliotecas geniales tienen que ser entregadas con el proyecto.

2

Puede utilizar la inyección de código de bytes para reemplazar un tipo como flotador con su propio tipo . Esto se puede hacer después de la compilación sin cambiar el compilador.

+0

¿Cómo me ayudaría eso a lograr lo que quiero? ¿Puedes por favor ser más claro? –

+0

puede escribir todo su código usando float (por ejemplo) con operadores, etc. y usar reemplazo de código byte para cambiar el código para usar el tipo que desee. –

4

Es posible implementar la sobrecarga del operador Java utilizando JSR 269 con algunos hacks.Mira plugins java-oo para javac y Eclipse JDT:

http://amelentev.github.com/java-oo/

+0

Se ve bien. Funciona en BigInteger, etc. como está. – Dukeling