Si escriboevaluación en tiempo
enum chars = digits ~ uppercase;
se pueden concatenar la cadena en tiempo de compilación? Supongo que lo hará. Si lo reemplazo con un literal de cadena o una función CTFE, no puedo medir ninguna diferencia de rendimiento significativa (incluso llamándola cien millones de veces). Me sale una diferencia si reemplazo enum con const. Me han dicho que es ineficiente escribirlo así. Pensé que era algo conveniente y no veo la ineficiencia. (Por cierto, la línea está en una función que se llama recursivamente).
El código completo (la conversión a un sistema de numeración con una base diferente)
import std.string;
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
static string sign;
if (n < 0) {
n *= -1;
sign = "-";
}
enum chars = digits ~ uppercase;
size_t r = cast(size_t)(n % b);
if (n == r) {
return sign ~ chars[r];
}
return toBase((n - r)/b, b) ~ chars[r];
}
Editar: actualización de código, en respuesta a los comentarios, no es relevante para la cuestión
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
enum chars = digits ~ uppercase;
long r = n % b;
char c = chars[cast(size_t) abs(r)];
if (n == r) {
return (n < 0 ? "-" : "") ~ c;
}
return toBase((n - r)/b, b) ~ c;
}
se olvidó de restablecer la cadena de signos (puede usar 'scope (exit) sign =" ";' para eso) así 'toBase (-10,10)' seguido de 'toBase (10,10)' dará el mismo resultado –
Derecha. Ja ja ja, la primera vez que uso una variable estática. Difícil. Esa cosa de alcance (salida) es realmente útil ¿no? Estoy un poco sorprendido de que una llamada recursiva no califique como una salida de alcance. – fwend
un osciloscopio (salir) se ejecuta cuando el marco de pila actual se saca de la pila (como intentar ... finalmente realmente pero sin la sangría adicional) la recursión no hace eso –