История изменений
Исправление tailgunner, (текущая версия) :
Они есть в стандартной библиотеке и в виде сторонних пакетов.
Это не в счет (ADT библиотечными средствами можно сделать и в Си++, но оператор match сделать уже невозможно). Вот это:
return expr.match!(
(double num) => "%g".format(num),
(string var) => var,
(BinOp bop) => "(%s %s %s)".format(
pprint(*bop.lhs),
bop.op,
pprint(*bop.rhs)
)
);
оператором match не является - это switch по типу. Нет destructuring, нет guards. Для сравнения, Rust: https://doc.rust-lang.org/book/second-edition/ch18-03-pattern-syntax.html Как первые два примера сделать на D? Я подозреваю, что это невозможно, но просто на всякий случай спрашиваю.
Конечно поддержка языком была бы элегантнее, но говорить что в Ди просто нет ADT это неверно.
Только так и верно. Потому что в D _нет_ ADT. Средствами D можно изобразить что-то похожее.
Кстати:
Они есть в стандартной библиотеке и в виде сторонних пакетов. Тот taggedalbebraic. Этот пакет очень активно используется.
То, что их много (больше одного) разных делает их гораздо менее полезными, чем один, но стандартный.
Исправление tailgunner, :
Они есть в стандартной библиотеке и в виде сторонних пакетов.
Это не в счет (ADT библиотечными средствами можно сделать и в Си++, но оператор match сделать уже невозможно). Вот это:
return expr.match!(
(double num) => "%g".format(num),
(string var) => var,
(BinOp bop) => "(%s %s %s)".format(
pprint(*bop.lhs),
bop.op,
pprint(*bop.rhs)
)
);
оператором match не является - это switch по типу. Нет destructuring, нет guards. Для сравнения, Rust: https://doc.rust-lang.org/book/second-edition/ch18-03-pattern-syntax.html Как первые два примера сделать на D? Я подозреваю, что это невозможно, но просто на всякий случай спрашиваю.
Конечно поддержка языком была бы элегантнее, но говорить что в Ди просто нет ADT это неверно.
Только так и верно. Потому что в D _нет_ ADT. Средствами D можно изобразить что-то похожее.
Исправление tailgunner, :
Они есть в стандартной библиотеке и в виде сторонних пакетов.
Это не в счет (ADT библиотечными средствами можно сделать и в Си++, но оператор match сделать уже невозможно). Вот это:
return expr.match!(
(double num) => "%g".format(num),
(string var) => var,
(BinOp bop) => "(%s %s %s)".format(
pprint(*bop.lhs),
bop.op,
pprint(*bop.rhs)
)
);
оператором match не является - это switch по типу. Нет destructuring, нет guards. Для сравнения, Rust: https://doc.rust-lang.org/book/second-edition/ch18-03-pattern-syntax.html Как первые жва примера сделать на D? Я подозреваю, что это невозможно, но просто на всякий случай спрашиваю.
Конечно поддержка языком была бы элегантнее, но говорить что в Ди просто нет ADT это неверно.
Только так и верно. Потому что в D _нет_ ADT. Средствами D можно изобразить что-то похожее.
Исходная версия tailgunner, :
Они есть в стандартной библиотеке и в виде сторонних пакетов.
Это не в счет (ADT библиотечными средствами можно сделать и в Си++, но оператор match сделать уже невозможно). Вот это:
return expr.match!(
(double num) => "%g".format(num),
(string var) => var,
(BinOp bop) => "(%s %s %s)".format(
pprint(*bop.lhs),
bop.op,
pprint(*bop.rhs)
)
);
оператором match не является - это switch по типу. Нет destructuring, нет guards. Для сравнения, Rust: https://doc.rust-lang.org/book/second-edition/ch18-03-pattern-syntax.html Как первые жва примера сделать на D? Я подозреваю, что это невозможно, но просто на всякий случай спрашиваю.
Конечно поддержка языком была бы элегантнее, но говорить что в Ди просто нет ADT это неверно.
Только так и верно. Потому что в D _нет_ ADT. Средствами D можно изобразить что-то похожее.