LINUX.ORG.RU
ФорумTalks

Кортежи в современных ЯП и устаревший синтаксис

 , ,


0

2

В rust и swift (мб Kotlin тоже) есть типы данных - кортежи (tuple). И все равно для передачи параметров в функцию есть отдельный синтаксис. Можно было же упростить языки, функция может принимать только один параметр и без скобок, как в Хаскеле. Если нужно больше, делай кортеж. Но нет же, повторим C. Что это такое? Инертность?

Огорчает что в таких типа новых и прогрессивных языках такая фигня в синтаксисе.

В swift даже можно давать имена полям, это же как анонимные структуры, которых так не хватало в C. В итоге можно было бы сделать objC стайл для функций. Но разрабов C ужалил.

Ok(())

Считай, что там передается кортеж с обязательной распаковкой.

t184256 ★★★★★
()

Если нужно больше, делай кортеж.

В расте именно так и делается перегрузка методов. Костыль.

RazrFalcon ★★★★★
()

Можно было же упростить языки, функция может принимать только один параметр и без скобок, как в Хаскеле.

Ты про каррирование забыл.

hateyoufeel ★★★★★
()

Сейчас у компилятора всегда есть свобода как оптимизировать передачу аргументов (стек, регистры) или вовсе её заинлайнить. А так ему придётся решать задачу «а вдруг захотят взять адрес от тапла аргументов, перед оптимизацией надо доказать что так не будет».

snizovtsev ★★★★★
()

Чувак изобрел Perl

dem ★★
()
Ответ на: комментарий от hateyoufeel

Ну да, совсем как в Хаскеле будет усложнение. А если как в Хаскеле только без каррирования, тогда упрощение.

vlad9486
() автор топика
Ответ на: комментарий от snizovtsev

а вдруг захотят

Языки ведь компилируются, а захотеть могут только в компайлтайме, а могут и не захотеть. Свобода останется. Пусть докажет, делов то. Компилятор раста и не такое доказывает.

vlad9486
() автор топика
Ответ на: комментарий от Crocodoom

Так я же не предлагаю что-то добавить, а наоборот, убрать :)

vlad9486
() автор топика
Ответ на: комментарий от vlad9486

Компилятор раста и не такое доказывает.

Раста ли? Мне казалось доказывает там больше LLVM. А его разработчики ориентируются на язык, где аргументы не таплами передаются.

snizovtsev ★★★★★
()
Ответ на: комментарий от snizovtsev

Ну может llvm, мне все равно. Я имел ввиду что компилятор раста доказывает времена жизни, иммутабельность и другие растоспецифические вещи, потому ему будет нетрудно.

vlad9486
() автор топика

В кортеже параметры не именованые. В функции аргументы именованые. Так что если тебе так угодно, то у тебя в функцию передается не кортеж, а что-то получше - нормальная структура, которая обьявляется сразу на месте. В некоторых языках похожесть на структуру может быть даже в месте вызова, если есть поддержка именованых параметров

vertexua ★★★★★
()

Да, давайте сделаем как в хаскеле — вместо

fn some_func(foo_x: u64,
             bar_y: u32,
             baz_z: &str,
             oof_z: i32) -> bool {
    ...
}

делать вот эту жуть

someFunc :: Word64 -> Word32 -> String -> Int32 -> Bool
someFunc fooX barY bazZ oofZ = ...

Ведь это так приятно — чертыхаясь сравнивать тип и имя переменной :)

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 4)

Можно было же упростить языки, функция может принимать только один параметр и без скобок, как в Хаскеле.

Без скобок, но зато со стрелками. И в чем упрощение, конкретно?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)

функция может принимать только один параметр

Тогда, во-первых не будет контролироваться количество передаваемых «параметров» (т.к. функция не знает какой кортеж должен быть). А во-вторых будут проблемы со значениями параметров по-умолчанию.

Собственно, тебе и сейчас никто не мешает так делать, передавай свой кортеж и мудохайся с ручным выковыриванием параметров и присваиванием дефолтных значений.

как в Хаскеле

В хаскеле паттерн-матчинг, каррирование и рекурсия помогают решать названные выше проблемы, а не просто «передаём кортеж».

no-such-file ★★★★★
()
Ответ на: комментарий от kirk_johnson

А, а я думал, foo и bar — это так, плейсхолдеры. Если это настоящие имена переменных, тогда да, нужно сличать c типами, как минимум.

Miguel ★★★★★
()
Ответ на: комментарий от vertexua

В свифте можно именовать. Я об этом написал.

vlad9486
() автор топика
Ответ на: комментарий от kirk_johnson

Нет. Я этого не предлагал. Код будет выглядеть точно также в этом случае.

vlad9486
() автор топика
Ответ на: комментарий от tailgunner

Как в Хаскеле, но, внимание, без каррирования. Код в большинстве случаев будет выглядеть точно также. Но в некоторых случаях проще, например

Ok(())
станет
Ok()

vlad9486
() автор топика
Ответ на: комментарий от vlad9486

Достаточно сделать как в C++ — void (в данном случае ()) опционален в некоторых случаях.

kirk_johnson ★☆
()
Ответ на: комментарий от Miguel

Нет, это плейсхолдеры, конечно. Но учитывая, что в хаскеле любят называть переменные одной буквой...

kirk_johnson ★☆
()

Тебе никто не мешает и сейчас делать так.

fn foo( args:( u32, u64, &str ) ){
    let ( arg0, arg1, arg2 ) = args;
    println!("arg0:{}, arg1:{}, arg2:{}", arg0, arg1, arg2);
}

fn main(){
   foo(( 0, 1, "asdf" ));
}


Вопрос только, а нафига?

WatchCat ★★★★★
()
Ответ на: комментарий от WatchCat

Я не хочу делать что-то другое. Можно считать заголовок функции сразу паттерном. Что-бы без двойных скобок и лишней строки let...

Это нужно для упрощения языка и унификации. Вроде серьезных возражений нету. Сделаю-ка rfc для раста, нужно только аккуратно что-бы не сломать обратную совместимость.

vlad9486
() автор топика
Ответ на: комментарий от WatchCat

Для этого надо немного расширить декларацию типа кортежа, что-бы имена полей можно было указывать.

vlad9486
() автор топика
Ответ на: комментарий от vlad9486

Ok(())

станет

Ok()

Вследствие твоего предложения? Не станет.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)

Огорчает, что с этой идеей ты полез зачем-то на ЛОР, а не на специализированные форумы перечисленных ЯП. Уж здесь-то, конечно, всё решат и разрулят.

Virtuos86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.