2012-03-27 11 views
6

Puramente como ejercicio en casa, con el objetivo de comprender mejor algunos aspectos básicos del lenguaje, traté de volver a implementar la función Ord, pero me encontré con un problema.Implementación de la función Ord en Delphi

De hecho, la función existente Ord puede aceptar los argumentos de una variedad de diferentes tipos (AnsiChar, Char, WideChar, Enumeration, Integer, Int64) y puede volver número entero o Int64.

No puedo averiguar cómo declarar varias versiones de la misma función.

¿Cómo se debe codificar esto en Delphi?

Respuesta

9

Ord no se pueden codificar en Delphi. Aunque puede usar the overload directive para escribir varias funciones con el mismo nombre, no puede escribir la función Ord de esa manera porque funciona para una cantidad arbitraria de tipos de argumentos sin necesidad de definiciones múltiples. (No importa cuántas Ord sobrecargas que escribe, que siempre se puede llegar a un tipo que sus funciones no van a aceptar, pero que la voluntad del compilador.)

funciona de esa manera debido a compilador magia. El compilador conoce Ord y todos los tipos ordinales del programa, por lo que realiza las acciones de la función en línea. Otras funciones de magia del compilador incluyen Length (magia porque acepta tipos de matriz arbitraria), Str (magia porque acepta modificadores de anchura y precisión) y ReadLn (magia porque acepta un número arbitrario de parámetros).

+0

Esta es la respuesta correcta a la pregunta a la que se hace referencia en el título. – boileau

+0

No estoy del todo convencido de que 'ord' sería * imposible * de hacer en Delphi actual al usar el parámetro sin tipo + algún lío RTTI. ¡Pero concedido, al menos sería enormemente poco práctico! –

+0

@Joonas, sin tipo significa que hay * no * tipo. No puede obtener información de tipo de algo que no tiene ningún tipo. Si sugirieras usar * genéricos *, entonces podría haber alguna esperanza. –

12

No puedo averiguar cómo declarar varias versiones de la misma función.

Se llama function overloading. Los parámetros de entrada deben ser diferentes para cada versión, el tipo de devolución no importa. Por ejemplo:

function Ord(X: Char): Integer; overload; 
begin 
    // Whatever here 
end; 

function Ord(X: Integer): Integer; overload; 
begin 
    // Something 
end; 

// etc. 
+4

Aunque tenga en cuenta que 'ord' es una función mágica especial en lugar de una función Pascal normal. Para llevar a casa ese punto, recuerde que 'ord' existió mucho antes de que la función sobrecargada se añadiera al idioma. –

+0

Es cierto, y si se vuelve a implementar con fines de aprendizaje, mejor llamarlo de otra manera que 'ord'! –

+2

Como nota al comentario de David: La implementación de Ord en realidad no es nada, ya que no produce código de operación extra. Se declaró camino de regreso en la descripción original de Pascal de N.Wirth y solo le dice al compilador que ignore el error de tipo. Así que de hecho: mal ejemplo ... –

Cuestiones relacionadas