El problema"
Defina una función log
(u otro nombre de 3 letras) que, cuando se llame, registrará / imprimirá / escribirá (lo que sea el valor predeterminado para el idioma en cuestión) tanto la instrucción (como fuente) como el primer argumento. En otras palabras:
i=777
j=333
log(i) //outputs: "log(i) 777"
log(i+j+1) //outputs: "log(i+j+1) 1111"
Para todos los propósitos prácticos, la salida i: 777
sería suficiente, pero en algunos idiomas hay bibliotecas de reflexión muy específicas para eso, y eso no sería un desafío, por lo que toda la instrucción debería salir.
Inspiración
La inspiración para esto fue para mí y otro programador que discutía cuán irritante es que a menudo (con depuradores incorrectos), escribes cosas como console.log("i:", i)
, a continuación, creamos una solución de JavaScript (bastante loca) (solo nodo) (genera i: 777
más que la línea completa de fuente), que fue sorprendentemente largo y me recordó a codegolfing y me hizo preguntarme qué mejor les iría a otros idiomas (especialmente el golf de código).
Bonos
-10% : sin lectura de archivos (más allá del compilador)
PD. Esta es mi primera 'pregunta' aquí, así que siéntase libre de señalar cualquier error que haya cometido.
help/on-topic
(se menciona, pero no considero que valga la pena comprobar cómo se describió allí).Respuestas:
C
(40-10% = 36)(38-10% = 34.2)Tenga en cuenta que, en C, una
log
función solo se puede definir para un tipo específico. Por lo tanto, estalog
"función" solo tomaint
argumentos.Una solución más general especifica cómo imprimir el argumento, además del argumento en sí:
que se usaría como, por ejemplo,
lg2("%s", "I'm a string");
olg2("%f", 3.1415)
.fuente
x
sean necesarios.Python (65-10% = 58.5)
Esto supone que su código está en un archivo (produce una salida impar si se invoca en el intérprete interactivo):
Ha sido probado en Python 2.7.6.
Ejemplo:
salidas
fuente
C ++
1217167-10% = 60.3Usado así:
Salidas:
fuente
#define log(x)printf("log(%s) %d\n",#x,x)
pero eso solo funcionará con números enteros.Rebol3 - 31.5 (35 - 10%)
Aquí hay una implementación simple acortada de @draegtun que funciona bien para números:
Ejecutarlo produce:
Puede ser mucho más flexible (para mostrar la forma de tipos no numéricos) en 42.3 caracteres (47 - 10%)
La salida:
fuente
Javascript (325)
Creo que esta es la
log
función que estás buscando:Uso
Salida
Código largo
Solo funciona cuando el script se coloca dentro
<script>
etiqueta que se coloca en el.html
documento porque envía una solicitudlocation.href
para obtener el código fuente. JSfiddle, F12 Dev Tool Console, los.js
archivos incrustados no funcionarán, estoy tratando de que esté disponible en todas partes ...De todos modos, esta pregunta es interesante.
fuente
Scala - (221 - 10%) = 198.9
Yay macros! Este es en realidad exactamente el tipo de cosas para las que son.
Versión legible:
Ejemplo:
Salidas:
Como la adición es una llamada al método en Scala, agrega esa sintaxis detallada de nuevo, ¡pero está bastante cerca! También es un poco más detallado en algunos otros casos.
fuente
golpe (21-10% = 18.9)
Esta:
Luego use
log
como usaríaecho
:o
Este método hará todo lo que se requiera; Como beneficio adicional, también se imprimirá información adicional, pero ninguna regla explícita lo prohíbe.
fuente
GOLPETAZO
Los argumentos no se pasan usando "(...)" en BASH, así que dejo que la salida de 'log ()' se ajuste a ese estilo:
fuente
$((...))
puede ser$[...]
en su lugar, pero no conté los caracteres, por lo que no importa hasta ahora.Clojure
¡La homoiconicidad tiene sus beneficios!
Usar:
Veamos qué pasa con
macroexpand
:fuente
x
, ¿realmente necesita usar un gensym intermedio (es decirx#
)? Creo que solo evaluarás la expresión una vez (por cierto, no soy un experto en Clojure)Julia, 51 * 0.9 = 45.9
Alternativamente, pero no cumple con las reglas
fuente
Tcl, 42,3 (47 - 10%)
Uso:
Editar : pequeña mejora
fuente
Lisp común: 119,7 (133-10%)
@
porquelog
es la función de logaritmo estándar y bloqueado por defecto (al menos en SBCL). Además,@
solo tiene un personaje de largo.progn
, tomando un número variable de argumentos, pero imprime a la salida estándar. En aplicaciones reales, probablementesignal
una condición con una expresión S en lugar de imprimir una salida separada por espacios.(@ x)
se pueda usar siempre quex
se use.prin1
, queread
producen una cadena habilitada. Esto es útil cuando se intenta reproducir expresiones registradas.Resultados de muestra:
Y finalmente, si registro lo anterior
defmacro
, tengo la versión sin golf:fuente
PHP 138
No puede volver
log
a declarar en PHP sin usar otro módulo (APD
), así que en sulogg
lugar, puedo volver a enviarlo con unlog
ejemplo si es necesario. Eso es menor, pero más pecaminoso, supongo, es que esto supone que la función de registro está en una línea por sí misma. Puedo actualizar mi respuesta según lo dictado por los comentarios.salida de ejemplo:
fuente
JavaScript
5553Uso:
Salida:
DEBE utilizar comillas dobles, de lo
"
contrario no funcionará.fuente
log("i:", i)
... no creo que no se pueda hacer sin'
o"
en js ... puedes hacerlo más pequeño usandoconsole.log('log('+o+')'+eval(x))
pero la salida no coincidirá con la línea de código (a quién le importa)arguments.callee.caller.toString()
, pero no pude averiguar qué línea es cuál cuando tienes dos registros.