Відповіді:
Дивись, жодних паронів!
Функції і функції шаблону D можна назвати як значення, методи (не допоможуть) та властивості.
Я не можу повірити, що ніхто ще цього не сказав. Я перерахую ті, що зберігають байти:
fun()
і fun!()()
скоротити до fun
(якщо немає змінної fun
).fun(par)
скорочується до par.fun
(якщо припускати, що par
не має властивості / методу fun
, а також par
не є виразом, як 5+2
).fun!(T)()
скорочується до fun!T
fun!(T)(par)
скорочується до par.fun!T
(якщо par
не має властивості / методу fun
)І з об’єктами:
new cls()
скорочується до new cls
(Ще комусь JavaScript?)obj.fun()
і obj.fun!()()
скоротити доobj.fun
obj.fun!(T)()
скорочується до obj.fun!T
Останнє, використовувати старі версії . Це дозволяє використовувати застарілі функції, які скорочують ваш код. Щоправда, найкраща порада: D не підходить для коду-гольфу. Це чудова мова, тільки не для коду-гольфу.
D - JavaScript.
Очевидно, що ні. Але, коли мова йде float
, double
і real
, nan
це значення , яке повинно бути оброблено, і, як зазначено в стандарті IEEE 754, NaN не порівняти з рівним собі.
writeln(double.nan == double.nan); // false
Значення,
writeln(value!=value); // only true for nan
шлях коротший, ніж
import std.math;
writeln(isNaN(value));
Очевидно, завжди використовуйте math.isNaN
для реального коду. ;)
D має тип висновку та auto
ключове слово. Якщо об’єкта немає int
, то auto
, ймовірно, коротше.
auto
працює при побудові асоціативного масиву з KeyType[ValueType]
синтаксисом?
auto asd = ["a":1, "b": 2];
працює, але оскільки KeyType[ValueType]
буде замість цього auto
ключового слова, я не знаю, чи завжди це буде працювати з типами, для яких не може бути побудовано літералів
auto arr = ["a": true, "b": 6];
працює, ключі та значення повинні бути сумісних типів
D чудово підходить для ланцюжка методів, але:
str.toLower.strip().split("").sort();
те саме, що
sort(split(strip(str.toLower),""));
і зазвичай це не ланцюжок коротший, що я щойно зрозумів, що дозволяє мені скоротити свою відповідь на " Керування сміттям" : D
Як і C / C ++, вона main
може бути int
або void
, але void main(){}
завжди буде коротшою int main(){return my_func_returning_int;}
.
int main(){return output}
буде коротшим?
import std.stdio;void main(){write(7);}
це те, що потрібно. Я сумніваюся, що питання вимагатиме, щоб програма повертала номер, оскільки багато мов не можуть встановити коди повернення
D, як мова програмування багатопарадигми (Object Functional) систем, схоже, охоплює TIMTOWTDI, або існує більше, ніж один спосіб зробити це.
Справа в суті, написання аргументу програми:
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 потрібен порожній блок і не прийматиме крапку з комою або нічого, як порожнє твердження, в цьому випадку . Зазвичай, або
;
не є.
char*
замість, string
щоб зберегти байт?
function D main parameters must be main() or main(string[] args)
більше того, char
це буквально один символ, char*
є вказівником на буквально один символ і char[]
є масивом символьних літералів (рядки різні). D! = C || C ++
D має кілька типів лямбда-виразів C # -style, які можна призначати та самостійно:
(int a,int b)=>a*b;
auto a=(int a,int b)=>a*b;
Однак, на відміну від C #, типи підписів все ще потрібні, оскільки D не має рівня поширення типу Haskell.
T f(T)(T a,T b){return a + b}
слід зробити висновок про T як int inf(5);
Виклик функції на об'єкт без інших аргументів
reverse(x);
майже завжди можна скоротити до
x.reverse;
голити байт або більше.
Це тому, що .
робить LHS неявний перший аргумент, і шаблонування дозволяє нам вибрати правильну функцію для аргументів.
x.reverse(y, z)
довше через крапки
x.reverse(y,z)
і reverse(x,y,z)
мають однаковий підрахунок байт
x.reverse(y, z)
з x.reverse
?