syntax - tres - Erlang: ¿Qué significa la sintaxis del signo de interrogación?
signo de interrogacion entre parentesis (2)
Basado en esta documentación , creo que es la sintaxis para referirse a una macro.
Y de Learn You Some Erlang :
Las macros de Erlang son muy similares a las sentencias ''#define'' de C, usadas principalmente para definir funciones y constantes cortas. Son expresiones simples representadas por texto que será reemplazado antes de que el código sea compilado para la VM. 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 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), XY). 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 permanece igual.
¿Qué significa el signo de interrogación en la sintaxis de Erlang?
Por ejemplo:
Json = ?record_to_json(artist, Artist).
El contexto completo de la fuente se puede encontrar aquí .
Erlang usa un signo de interrogación para identificar macros . Por ejemplo, considere el siguiente código:
-ifdef(debug).
-define(DEBUG(Format, Args), io:format(Format, Args)).
-else.
-define(DEBUG(Format, Args), void).
-endif.
Como dice la documentación,
Las macros se expanden durante la compilación. Una simple macro
?Const
será reemplazada porReplacement
.
Este fragmento define una macro llamada DEBUG
que se reemplaza por una llamada para imprimir una cadena si la debug
se establece en tiempo de compilación. La macro se usa entonces en el siguiente código:
?DEBUG("Creating ~p for N = ~p~n", [First, N]),
Esta declaración se expande y reemplaza con los contenidos apropiados si se establece la debug
. Por lo tanto, puede ver los mensajes de depuración solo si se establece la debug
.
Actualizar
Gracias a @rvirding :
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 el ejemplo anterior, ¿podría usar
DEBUG
como una variable normal, siempre y cuando no lo prefija?
. Confuso, definitivamente, pero no ilegal.