Odpowiedzi:
Spójrz, żadnych parens!
Funkcje D i funkcje szablonów można wywoływać jako wartości, metody (nie pomogą) i właściwości.
Nie mogę uwierzyć, że nikt jeszcze tego nie powiedział. Wymienię te, które oszczędzają bajty:
fun()
i fun!()()
skróć do fun
(zakładając, że nie ma zmiennej fun
).fun(par)
skraca się do par.fun
(zakładając, że par
nie ma właściwości / metody fun
, a także par
nie jest wyrażeniem podobnym do 5+2
).fun!(T)()
skraca się do fun!T
fun!(T)(par)
skraca się do par.fun!T
(zakładając, że par
nie ma właściwości / metody fun
)I z przedmiotami:
new cls()
skraca się do new cls
(Więcej osób w JavaScript?)obj.fun()
i obj.fun!()()
skrócić doobj.fun
obj.fun!(T)()
skraca się do obj.fun!T
I ostatnia rzecz, użyj starych wersji . Pozwala korzystać z przestarzałych funkcji, które skracają kod. To powiedziawszy, najlepsza rada: D nie nadaje się do golfa kodowego. To świetny język, nie tylko do gry w golfa.
D to JavaScript.
Oczywiście, że nie. Ale kiedy masz do czynieniafloat
, double
i real
, nan
jest wartością, z którą trzeba sobie i, jak określono w IEEE 754, NaN nie porównuje się z samym sobą.
writeln(double.nan == double.nan); // false
Znaczenie,
writeln(value!=value); // only true for nan
jest o wiele krótszy niż
import std.math;
writeln(isNaN(value));
Oczywiście, zawsze używać math.isNaN
dla prawdziwego kodu. ;)
D ma wnioskowanie typu i auto
słowo kluczowe. Jeśli obiekt nie jest int
, auto
to prawdopodobnie jest krótszy.
auto
działa podczas budowania tablicy asocjacyjnej ze KeyType[ValueType]
składnią?
auto asd = ["a":1, "b": 2];
działa, ale ponieważ KeyType[ValueType]
miałby miejsce zamiast auto
słowa kluczowego, nie wiem, czy to zawsze będzie działać z typami, dla których literałów nie można zbudować
auto arr = ["a": true, "b": 6];
działa, klucze i wartości muszą być kompatybilnych typów
D doskonale nadaje się do łączenia metod, ale:
str.toLower.strip().split("").sort();
jest taki sam jak
sort(split(strip(str.toLower),""));
i zwykle ten niepowiązany z łańcuchem jest krótszy, co właśnie zdałem sobie sprawę, co pozwala mi skrócić moją odpowiedź na Manage Trash So : D
Podobnie jak C / C ++, main
może być int
lub void
, ale void main(){}
zawsze będzie krótszy niż int main(){return my_func_returning_int;}
.
int main(){return output}
podać jako liczbę całkowitą, nie byłoby krótsze?
import std.stdio;void main(){write(7);}
jest to, czego potrzeba. Wątpię, czy pytanie wymagałoby od programu zwrotu numeru, ponieważ wiele języków nie może ustawić kodów powrotu
D, jako język programowania systemów wieloparadigmowych (Object Functional), wydaje się obejmować TIMTOWTDI, czyli istnieje więcej niż jeden sposób, aby to zrobić.
Przykładem jest napisanie argv programu:
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);
}
Zwróć uwagę, że pętla for-style w stylu C wymaga {}
pustego bloku i w tym przypadku nie zaakceptuje średnika ani niczego jako pustej instrukcji . Zwykle lub
;
nie ma operacji.
char*
zamiast string
zapisać bajt?
function D main parameters must be main() or main(string[] args)
ponadto char
jest dosłownie jednym znakiem, char*
jest wskaźnikiem dosłownie jednego znaku i char[]
jest tablicą literałów znakowych (łańcuchy są różne). D! = C || C ++
D ma kilka typów wyrażeń lambda w stylu C #, które można przypisać i autonomicznie:
(int a,int b)=>a*b;
auto a=(int a,int b)=>a*b;
Jednak w przeciwieństwie do C #, typy podpisu są nadal potrzebne, ponieważ D nie ma wnioskowania na poziomie Haskell.
T f(T)(T a,T b){return a + b}
Należy wnioskować T jako int wf(5);
Wywołanie funkcji na obiekcie bez innych argumentów
reverse(x);
prawie zawsze można je skrócić
x.reverse;
ogolić bajt lub więcej.
Wynika to z faktu, .
że LHS jest domyślnym pierwszym argumentem, a szablony pozwalają nam wybrać odpowiednią funkcję dla argumentów.
x.reverse(y, z)
jest on dłuższy z powodu kropki
x.reverse(y,z)
i reverse(x,y,z)
mają tę samą liczbę bajtów.
x.reverse(y, z)
się x.reverse
?