Yanıtlar:
Bak, ebeveyn yok!
D işlevleri ve şablon işlevleri değerler, yöntemler (yardımcı olmaz) ve özellikler olarak adlandırılabilir.
Henüz kimsenin bunu söylemediğine inanamıyorum. Bayt kaydedenleri listeleyeceğim:
fun()
ve fun!()()
kısaltın fun
(değişken olmadığı varsayılarak fun
).fun(par)
için kısaltır par.fun
(varsayarak par
bir özellik / yöntemi vardır fun
sıra sıra, par
gibi bir ekspresyon olmayan 5+2
).fun!(T)()
kısaltmak fun!T
fun!(T)(par)
kısaltır par.fun!T
( par
özelliği / yöntemi olmadığı varsayılarak fun
)Ve nesnelerle:
new cls()
için kısaltır new cls
(Daha JavaScript herkes?)obj.fun()
ve obj.fun!()()
kısaltobj.fun
obj.fun!(T)()
kısaltmak obj.fun!T
Son bir şey, eski sürümleri kullanın . Kodunuzu kısaltan kullanımdan kaldırılmış özellikleri kullanmanızı sağlar. Bununla birlikte, en iyi tavsiye: D kod golfü için iyi değildir. Harika bir dil, sadece kod golf için değil.
D JavaScript'dir.
Belli ki değil. Ama uğraşırken float
, double
ve real
, nan
IEEE 754 tarafından belirtildiği gibi, ele ve gereken bir değer, NaN kendisiyle eşit karşılaştırmak değildir olduğunu.
writeln(double.nan == double.nan); // false
anlam,
writeln(value!=value); // only true for nan
çok daha kısa
import std.math;
writeln(isNaN(value));
Açıkçası, her zaman gerçek kod math.isNaN
için kullanın . ;)
D, tür çıkarımına ve bir auto
anahtar kelimeye sahiptir. Nesne değilse int
, auto
muhtemelen daha kısadır.
auto
ile ilişkilendirilebilir bir dizi oluştururken çalışır mı KeyType[ValueType]
?
auto asd = ["a":1, "b": 2];
çalışır, ancak anahtar kelimenin KeyType[ValueType]
yerine gideceğinden, auto
bunun her zaman hazır bilgi yapıları oluşturulamayan türlerle çalışıp çalışmayacağını bilmiyorum
auto arr = ["a": true, "b": 6];
çalışır, anahtarlar ve değerler uyumlu türlerde olmalıdır
D yöntem zincirleme konusunda harikadır, fakat:
str.toLower.strip().split("").sort();
aynıdır
sort(split(strip(str.toLower),""));
ve genellikle sigara zincirleme bir ben sadece bana cevabım kısaltmak sağlayan, fark, hangi kısadır Yani çöp yönetme : D
C / C ++ gibi, main
olabilir int
ya da void
, ancak void main(){}
her zaman daha kısa olacaktır int main(){return my_func_returning_int;}
.
int main(){return output}
daha kısa olmaz mı?
import std.stdio;void main(){write(7);}
gerekli olan şey budur. Pek çok dil dönüş kodları ayarlayamadığından , bir sorunun programın bir sayı döndürmesini zorunlu kılacağından şüpheliyim
D, bir çokaradigm (Nesne Fonksiyonel) sistem programlama dili olarak, TIMTOWTDI'yi kucaklıyor gibi görünüyor veya Bunu Yapmanın Birden Fazla Yolu Var.
Durumda, programın argv yazarak:
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);
}
C stili for-loop'un {}
boş blok olarak gerekli olduğunu ve bu durumda noktalı virgül veya boş bir ifade olarak hiçbir şey kabul etmeyeceğini unutmayın . Genellikle veya
;
hiç ops.
char*
yerine string
bir byte kaydetmek için?
function D main parameters must be main() or main(string[] args)
dahası, char
kelimenin tam anlamıyla bir karakter, kelimenin tam anlamıyla bir karakterin char*
işaretçisi ve char[]
karakter değişmezleri dizisidir (dizeler farklıdır). D! = C || C ++
D, atanabilen ve tek başına kullanılabilen birkaç tür C # tarzı lambda ifadesine sahiptir:
(int a,int b)=>a*b;
auto a=(int a,int b)=>a*b;
Bununla birlikte, C # 'dan farklı olarak, D'nin Haskell düzeyinde tip çıkarımları olmadığı için imzanın türleri hala gereklidir.
T f(T)(T a,T b){return a + b}
anlaması gerekir T olarak int olarakf(5);
Başka bir bağımsız değişkeni olmayan bir nesnenin işlevini çağırma
reverse(x);
neredeyse her zaman kısaltılabilir
x.reverse;
bir bayt veya daha fazlasını tıraş etmek için.
Çünkü .
LHS örtük bir ilk argüman yapar ve şablonlama argümanlar için doğru işlevi seçmemize izin verir.
x.reverse(y, z)
olduğunda, nokta nedeniyle daha uzun
x.reverse(y,z)
ve reverse(x,y,z)
aynı bayt sayısına sahip.
x.reverse(y, z)
mı x.reverse
?