2010-09-18 29 views
17

¿Qué significa el signo de interrogación en la sintaxis de Erlang?Erlang: ¿Qué significa la sintaxis del signo de interrogación?

Por ejemplo:

Json = ?record_to_json(artist, Artist). 

El contexto completo de la fuente se puede encontrar here.

+0

Usado google pero no se le ocurrió nada (para: "sintaxis de signo de interrogación erlang"). Tal vez debería activar el historial web o algo para obtener resultados más relevantes (incluso utilizando las mismas palabras clave, los resultados no son los mismos para todos, especialmente en palabras clave más idiosincrásicas). pero gracias por su comentario ... aún apreciaría que alguien con experiencia en erlang proporcione un contexto más profundo sobre cómo y por qué se usó ... –

+13

@delnan - Google trae a colación esta pregunta – OrangeDog

Respuesta

23

Erlang utiliza un signo de interrogación para identificar macros. Por ej. tener en cuenta el código de abajo:

-ifdef(debug). 
-define(DEBUG(Format, Args), io:format(Format, Args)). 
-else. 
-define(DEBUG(Format, Args), void). 
-endif. 

Como dice la documentación,

macros se expanden durante la compilación. Se reemplazará una simple macro ?Const por Replacement.

Este fragmento de código define una macro llamada DEBUG que se sustituye con una llamada a imprimir una cadena si debug se establece en tiempo de compilación. La macro se utiliza a continuación en el código siguiente así:

?DEBUG("Creating ~p for N = ~p~n", [First, N]), 

Esta declaración se expande y se reemplaza con el contenido apropiadas si se establece debug. Por lo tanto, puede ver los mensajes de depuración solo si se establece debug.

actualización

Gracias a @rvirding:

Un signo de interrogación medios para tratar de ampliar lo que sigue como una llamada a la macro. No hay nada que prohíba usar el nombre del macro (átomo o variable) como un átomo o variable normal. Por lo tanto, en el ejemplo [anterior], puede usar DEBUG como una variable normal, siempre y cuando no lo prefija con ?. Confuso, definitivamente, pero no ilegal.

+3

Para ser quisquilloso: un signo de interrogación significa intentar expandir lo que sigue como una macro llamada. No hay nada que prohíba usar el nombre del macro (átomo o variable) como un átomo o variable normal. Entonces, en su ejemplo, podría usar 'DEBUG' como una variable normal, siempre y cuando no lo prefija con'? '. Confuso, definitivamente, pero no ilegal. – rvirding

+0

@rvirding: ¡Gracias! Lo he tomado descaradamente y lo he agregado a mi respuesta. –

5

Basado en this documentation, creo que es la sintaxis para referirse a una macro.

Y a partir de Learn You Some Erlang:

macros Erlang son muy similares a C# define de '' las declaraciones, que se utiliza principalmente para definir funciones cortos y constantes. Son expresiones simples representadas por texto que será reemplazado antes de compilar el código para la máquina virtual. Tales macros son principalmente útiles para evitar tener valores mágicos flotando alrededor de sus módulos. Una macro se define como un atributo de módulo de con la forma: -define (MACRO, some_value). y se utiliza como? MACRO dentro de cualquier función definida en el módulo. Una macro 'función' podría escribirse como -define (sub (X, Y), X-Y). y usado como? sub (23,47), luego reemplazado por 23-47 por el compilador. Algunas personas usarán macros más complejas, pero la sintaxis básica se mantiene igual.

Cuestiones relacionadas