Respostas:
Olha, sem parênteses!
As funções e funções de modelo de D podem ser chamadas como valores, métodos (não ajudarão) e propriedades.
Não acredito que ninguém tenha dito isso ainda. Vou listar os que salvam bytes:
fun()
e fun!()()
encurte para fun
(supondo que não haja variável fun
).fun(par)
encurta para par.fun
(assumindo par
que não tem propriedade / método fun
, além de par
não ser uma expressão como 5+2
).fun!(T)()
encurta para fun!T
fun!(T)(par)
reduz para par.fun!T
(supondo par
que não tenha propriedade / método fun
)E com objetos:
new cls()
reduz para new cls
(Mais JavaScript alguém?)obj.fun()
e obj.fun!()()
encurtar paraobj.fun
obj.fun!(T)()
encurta para obj.fun!T
Uma coisa final, use versões antigas . Ele permite que você use recursos obsoletos que diminuem o seu código. Dito isto, o melhor conselho: D não é bom para golfe de código. É uma ótima linguagem, apenas não para o código-golfe.
D é JavaScript.
Obviamente não. Mas, ao lidar com float
, double
e real
, nan
é um valor que deve ser tratado e, conforme especificado pela IEEE 754, o NaN não se compara igual a si mesmo.
writeln(double.nan == double.nan); // false
Significado,
writeln(value!=value); // only true for nan
é muito menor que
import std.math;
writeln(isNaN(value));
Obviamente, sempre use math.isNaN
para código real . ;)
D tem inferência de tipo e uma auto
palavra - chave. Se o objeto não estiver int
, auto
provavelmente é mais curto.
auto
ao criar uma matriz associativa com a KeyType[ValueType]
sintaxe?
auto asd = ["a":1, "b": 2];
obras, mas desde que KeyType[ValueType]
iria no lugar da auto
palavra-chave, eu não sei se isso vai sempre trabalhar com tipos para o qual literais não podem ser construídas
auto arr = ["a": true, "b": 6];
funciona, as chaves e os valores devem ser de tipos compatíveis #
D é ótimo no encadeamento de métodos, mas:
str.toLower.strip().split("").sort();
é o mesmo que
sort(split(strip(str.toLower),""));
e geralmente o não-encadeado é mais curto, o que acabei de perceber, o que me permite encurtar minha resposta para Gerenciar lixo Então : D
Como C / C ++, main
pode ser int
ou void
, mas void main(){}
sempre será menor que int main(){return my_func_returning_int;}
.
int main(){return output}
seria menor?
import std.stdio;void main(){write(7);}
é necessário. Duvido uma pergunta seria mandatar o programa retornar um número, porque muitas línguas não é possível definir códigos de retorno
D, como uma linguagem de programação de sistemas multiparadigmático (Object Functional), parece adotar o TIMTOWTDI ou existe mais de uma maneira de fazê-lo.
Caso em questão, escrevendo o argumento do programa:
import std.stdio, std.array, std.algorithm;
void main(string[] args) {
for(int i=0;i<args.length;writeln(args[i++])){};
foreach(a;args)writeln(a);
each!writeln(args);
}
Observe que o loop for do estilo C requer {}
como bloco vazio e não aceitará ponto-e-vírgula ou nada como uma declaração em branco, neste caso . Geralmente, ou
;
não são ops.
char*
no lugar de string
para salvar um byte?
function D main parameters must be main() or main(string[] args)
além disso, char
é literalmente um caractere, char*
é um ponteiro para literalmente um caractere e char[]
é uma matriz de literais de caracteres (as strings são diferentes). D! = C || C ++
D tem alguns tipos de expressões lambda no estilo C #, que podem ser atribuídas e independentes:
(int a,int b)=>a*b;
auto a=(int a,int b)=>a*b;
No entanto, diferentemente do C #, os tipos de assinatura ainda são necessários porque D não possui inferências de tipo no nível Haskell.
T f(T)(T a,T b){return a + b}
deve inferir T como int emf(5);
Chamando uma função em um objeto sem outros argumentos
reverse(x);
quase sempre pode ser reduzido para
x.reverse;
raspar um byte ou mais.
Isso ocorre porque .
torna o LHS um primeiro argumento implícito e a modelagem permite escolher a função correta para os argumentos.
x.reverse(y, z)
é mais por causa do dot
x.reverse(y,z)
e reverse(x,y,z)
tem a mesma contagem de bytes.
x.reverse(y, z)
com x.reverse
?