Відповіді:
Дивись, жодних паронів!
Функції і функції шаблону D можна назвати як значення, методи (не допоможуть) та властивості.
Я не можу повірити, що ніхто ще цього не сказав. Я перерахую ті, що зберігають байти:
fun()і fun!()()скоротити до fun(якщо немає змінної fun).fun(par)скорочується до par.fun(якщо припускати, що parне має властивості / методу fun, а також parне є виразом, як 5+2).fun!(T)() скорочується до fun!Tfun!(T)(par)скорочується до par.fun!T(якщо parне має властивості / методу fun)І з об’єктами:
new cls()скорочується до new cls(Ще комусь JavaScript?)obj.fun()і obj.fun!()()скоротити доobj.funobj.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?