Antworten:
Schau, keine Eltern!
Die Funktionen und Vorlagenfunktionen von D können als Werte, Methoden (hilft nicht) und Eigenschaften aufgerufen werden.
Ich kann nicht glauben, dass dies noch niemand gesagt hat. Ich werde diejenigen auflisten, die Bytes speichern:
fun()und fun!()()verkürzen auf fun(vorausgesetzt, es gibt keine Variable fun).fun(par)verkürzt sich auf par.fun(vorausgesetzt, es parhat keine Eigenschaft / Methode funund ist kein parAusdruck wie 5+2).fun!(T)() verkürzt sich zu fun!Tfun!(T)(par)verkürzt sich auf par.fun!T(vorausgesetzt, es pargibt keine Eigenschaft / Methode fun)Und mit Gegenständen:
new cls()verkürzt sich auf new cls(Mehr JavaScript jemand?)obj.fun()und obj.fun!()()verkürzen aufobj.funobj.fun!(T)() verkürzt sich zu obj.fun!TEine letzte Sache, verwenden Sie alte Versionen . Sie können veraltete Funktionen verwenden, die Ihren Code verkürzen. Der beste Rat: D ist nicht gut für Code-Golf. Es ist eine großartige Sprache, nur nicht für Code-Golf.
D ist JavaScript.
Offensichtlich nicht. Aber im Umgang mit float, doubleund real, nanist ein Wert, der behandelt werden muss und wie angegeben von IEEE 754, NaN nicht mit sich selbst gleich vergleichen.
writeln(double.nan == double.nan); // false
Bedeutung,
writeln(value!=value); // only true for nan
ist viel kürzer als
import std.math;
writeln(isNaN(value));
Natürlich immer math.isNaNfür echten Code verwenden. ;)
D hat Typinferenz und ein autoSchlüsselwort. Wenn das Objekt nicht ist int, autoist es wahrscheinlich kürzer.
autobeim Erstellen eines assoziativen Arrays mit der KeyType[ValueType]Syntax?
auto asd = ["a":1, "b": 2];funktioniert, aber da KeyType[ValueType]anstelle des autoSchlüsselworts verwendet werden würde, weiß ich nicht, ob dies immer mit Typen funktioniert, für die Literale nicht erstellt werden können
auto arr = ["a": true, "b": 6];funktioniert, müssen die Schlüssel und Werte von kompatiblen Typen sein
D eignet sich hervorragend zum Verketten von Methoden, aber:
str.toLower.strip().split("").sort();
ist das gleiche wie
sort(split(strip(str.toLower),""));
und normalerweise ist die nicht verkettete kürzer, was ich gerade festgestellt habe, wodurch ich meine Antwort auf Manage Trash So : D verkürzen kann
Wie C / C ++ mainkann intoder sein void, wird aber void main(){}immer kürzer sein als int main(){return my_func_returning_int;}.
int main(){return output}kürzer wäre?
import std.stdio;void main(){write(7);}ist dies erforderlich. Ich bezweifle, dass eine Frage das Programm dazu zwingen würde, eine Nummer zurückzugeben, da viele Sprachen keine Rückkehrcodes festlegen können
D scheint als Programmiersprache für Multiparadigmensysteme (Object Functional) TIMTOWTDI zu umfassen, oder es gibt mehr als einen Weg, dies zu tun.
Beispiel: Schreiben Sie das Argument des Programms:
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);
}
Beachten Sie, dass die for-Schleife im C-Stil {}als leerer Block erforderlich ist und in diesem Fall kein Semikolon oder nichts als leere Anweisung akzeptiert . Normalerweise oder ;sind No-Ops.
char*anstelle von stringein Byte speichern?
function D main parameters must be main() or main(string[] args)Darüber hinaus charist es buchstäblich ein Zeichen, char*ist ein Zeiger auf buchstäblich ein Zeichen und char[]ist ein Array von Zeichenliteralen (Zeichenfolgen sind unterschiedlich). D! = C || C ++
D hat einige Arten von Lambda-Ausdrücken im C # -Stil, die zugewiesen werden können und eigenständig sind:
(int a,int b)=>a*b;
auto a=(int a,int b)=>a*b;
Im Gegensatz zu C # werden die Signaturtypen jedoch weiterhin benötigt, da D keine Typinferenz auf Haskell-Ebene hat.
T f(T)(T a,T b){return a + b}sollte T als int inf(5);
Aufruf einer Funktion für ein Objekt ohne andere Argumente
reverse(x);
kann fast immer auf verkürzt werden
x.reverse;
ein Byte oder mehr rasieren.
Dies liegt daran, .dass das LHS ein implizites erstes Argument ist und wir durch Vorlagen die richtige Funktion für die Argumente auswählen können.
x.reverse(y, z)ist länger , weil die Punkt
x.reverse(y,z)und reverse(x,y,z)haben die gleiche Byteanzahl.
x.reverse(y, z)zu x.reverse?