Ответы:
Смотри, без парней!
Функции 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, как многопарадигмальный (объектно-функциональный) системный язык программирования, по-видимому, охватывает 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
?