O problema"
Defina uma função log
(ou outro nome de três letras) que, quando chamada, registrará / imprimirá / gravará (qualquer que seja o padrão para o idioma em questão), tanto a instrução (como fonte) quanto o primeiro argumento. Em outras palavras:
i=777
j=333
log(i) //outputs: "log(i) 777"
log(i+j+1) //outputs: "log(i+j+1) 1111"
Para todos os propósitos práticos, o resultado i: 777
seria suficiente, mas em algumas línguas existem bibliotecas de reflexão muito específicas para isso, e isso não seria um desafio, portanto, toda a instrução deve ser gerada.
Inspiração
A inspiração para isso foi eu e outro programador discutindo o quão irritante é que, muitas vezes (com depuradores ruins), você escreve coisas como console.log("i:", i)
, a seguir, criamos uma solução javascript (apenas louca) (somente nó) (ela gera, em i: 777
vez de toda a linha de fonte), que foi surpreendentemente longa e me lembrou o codegolfing e me fez pensar em quanto melhor as outras línguas (especialmente o golfe por código) se sairiam.
Bónus
-10% : Nenhuma leitura de arquivo (além do compilador)
PS. Esta é a minha primeira 'pergunta' aqui, portanto, sinta-se à vontade para apontar os erros que cometi.
help/on-topic
(é mencionado, mas não achei que valesse a pena verificar a maneira como foi descrita lá).Respostas:
C
(40 -10% = 36)(38 -10% = 34,2)Observe que, em C, uma
log
função pode ser definida apenas para um tipo específico. Portanto, essalog
"função" recebe apenasint
argumentos.Uma solução mais geral especifica como imprimir o argumento, além do próprio argumento:
que seria usado como por exemplo
lg2("%s", "I'm a string");
oulg2("%f", 3.1415)
.fonte
x
sejam necessários.Python (65 -10% = 58,5)
Isso pressupõe que seu código esteja em um arquivo (ele produz uma saída ímpar se invocado no intérprete interativo):
Foi testado no Python 2.7.6.
Exemplo:
saídas
fonte
C ++
1217167 -10% = 60,3Usado assim:
Saídas:
fonte
#define log(x)printf("log(%s) %d\n",#x,x)
mas isso funcionará apenas com números inteiros.Rebol3 - 31,5 (35 - 10%)
Aqui está uma implementação simples abreviada de @draegtun que funciona bem para números:
Em execução, ele produz:
Pode ser muito mais flexível (para exibir a forma de tipos não numéricos) em 42,3 caracteres (47 - 10%)
A saída:
fonte
Javascript (325)
Eu acho que esta é a
log
função que você está procurando:Uso
Resultado
Código longo
Só funciona quando o script é colocado dentro da
<script>
tag, que é colocada no.html
documento porque envia uma solicitaçãolocation.href
para obter o código-fonte. JSfiddle, F12 Dev Tool Console,.js
arquivos incorporados não funcionarão, estou tentando disponibilizá-lo em qualquer lugar ...Enfim, esta questão é interessante.
fonte
Scala - (221 - 10%) = 198,9
Yay macros! Na verdade, esse é exatamente o tipo de coisa para a qual eles servem.
Versão legível:
Exemplo:
Saídas:
Como a adição é uma chamada de método no Scala, ela adiciona novamente a sintaxe detalhada, mas é bem próxima! Também é um pouco mais detalhado em alguns outros casos.
fonte
bash (21 - 10% = 18,9)
Este:
Então use
log
como você usariaecho
:ou
Este método fará tudo o que for necessário; como bônus, algumas informações extras também serão impressas, mas nenhuma regra explícita as proíbe.
fonte
BATER
Os argumentos não são passados usando "(...)" no BASH, então deixo a saída de 'log ()' se encaixar nesse estilo:
fonte
$((...))
pode ser, em$[...]
vez disso, mas eu não contei os caracteres, por isso não importa até agora.Clojure
A homoiconicidade tem seus benefícios!
Usar:
Vamos ver o que está acontecendo com
macroexpand
:fonte
x
, você realmente precisa usar um gensym intermediário (ie.x#
)? Eu acho que você avaliará a expressão apenas uma vez (btw, eu não sou especialista em Clojure) #Julia, 51 * 0,9 = 45,9
Como alternativa, mas não cumprindo as regras
fonte
Tcl, 42,3 (47 - 10%)
Uso:
Edit : pequena melhoria
fonte
Lisp comum - 119,7 (133 -10%)
@
porquelog
é a função de logaritmo padrão e bloqueado por padrão (pelo menos na SBCL). Além disso,@
tem apenas um caractere.progn
, obtendo um número variável de argumentos, mas imprime na saída padrão. Em aplicações reais, eu provavelmentesignal
uma condição com uma expressão S em vez de imprimir uma saída separada por espaço.(@ x)
possa ser usada sempre quex
for usada.prin1
, que produz umaread
cadeia de caracteres -able. Isso é útil ao tentar reproduzir expressões registradas.Saídas de amostra:
E, finalmente, se eu registrar
defmacro
o item acima , tenho a versão não destruída:fonte
PHP 138
Você não pode redefinir
log
no PHP sem usar outro módulo (APD
), entãologg
, em vez disso, posso reenviar com olog
exemplo, se necessário. Isso é menor, mas mais pecador, eu acho, é que isso pressupõe que a função log esteja em uma linha por si só. Eu posso atualizar minha resposta como ditado pelos comentários.saída de exemplo:
fonte
JavaScript
5553Uso:
Resultado:
Você DEVE usar aspas duplas,
"
caso contrário não funcionará.fonte
log("i:", i)
... acho que não pode ser feito sem'
ou"
em js ... você pode diminuir usando,console.log('log('+o+')'+eval(x))
mas a saída não coincide com a linha de código (quem se importa)arguments.callee.caller.toString()
, mas não consegui descobrir qual linha é qual quando você tem dois logs.