Ответы:
Смотри, без парней!
Функции 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, как многопарадигмальный (объектно-функциональный) системный язык программирования, по-видимому, охватывает TIMTOWTDI, или существует более одного способа сделать это.
Например, написание программы argv:
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 #, которые могут быть назначены и автономны:
(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 вf(5);
Вызов функции для объекта без других аргументов
reverse(x);
почти всегда можно сократить до
x.reverse;
побрить байт или больше.
Это потому, что .делает LHS неявным первым аргументом, а шаблоны позволяют нам выбрать правильную функцию для аргументов.
x.reverse(y, z)он длиннее из-за точки
x.reverse(y,z)и reverse(x,y,z)имеют одинаковое количество байтов.
x.reverse(y, z)с x.reverse?