LINUX.ORG.RU
ФорумTalks

Go2 draft: generics, error handling & error values

 


0

5

Драфты generics и расширения системы обработки ошибок тут. Сейчас ещё можно повлиять на то, как это будет в итоге сделано.

Generics

contract Addable(t T) {
	t + t
}

func Sum(type T Addable)(x []T) T {
	var total T
	for _, v := range x {
		total += v
	}
	return total
}

Error handling

func CopyFile(src, dst string) error {
	handle err {
		return fmt.Errorf("copy %s %s: %v", src, dst, err)
	}

	r := check os.Open(src)
	defer r.Close()

	w := check os.Create(dst)
	handle err {
		w.Close()
		os.Remove(dst) // (only if a check fails)
	}

	check io.Copy(w, r)
	check w.Close()
	return nil
}

★★★★

Последнее исправление: Davidov (всего исправлений: 1)
Ответ на: комментарий от foror

такая аура

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

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

Отлаживать питон ну очень просто, а рефакторить - да, и надо много тестов и четкое описание взаимодействий. Это, к сожалению, беда большинства динамических языков. Но факт есть факт, я намеренно спрашивал разработчиков на Python про синтаксис, так что тут я не голословен.

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

Отлаживать питон ну очень просто

У тебя какой-то другой Python.

Но факт есть факт, я намеренно спрашивал разработчиков на Python про синтаксис, так что тут я не голословен.

Синтаксис да, но это даже не написание кода, а набор текста.

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

Ну вот пока что можно оставить фидбек. Всем заинтересованным предлагаю этим воспользоваться (ping urxvt).

Если будет время попробую разобраться, почему не захотели <> и тоже напишу.

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

Если будет время попробую разобраться, почему не захотели <> и тоже напишу.

Да, сначала нужно с их позицией ознакомиться.

urxvt ★★★★★
()

А скольковизгу было, что дженерики не нужны ;)

grim ★★☆☆
()

Error handling

Они таки решили добавить исключения, но сделали как обычно в Го?

А как вернуть (nil, err), если у функции два возвращаемых значения?

А вообще хорошо. Дженерики в Го нужны. И для методов классов тоже.

Сделают нормально, может даже опять пользоваться начну.

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

в 21 веке изначально делать ущербный ЯП отвергая опыт индустрии за последние 20 лет

Может, это хитрый план. Если бы изначально сделали со всеми известными наворотами, то его бы мало кто стал учить из-за сложности. А теперь, когда набралась приличная база пользователей, уже можно усложнять.

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

С ПМ все стало сильно лучше в последнее время. Иммутабельность и энамы были бы полезны. А что не так с defer?

feofan ★★★★★
()

магия check и handle

надеюсь, в окончательный вариант это дерьмо не пойдёт

Joe_Bishop
()
Ответ на: комментарий от Ivan_qrt

Они таки решили добавить исключения, но сделали как обычно в Го?

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

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

<> изначально был очень плохим выбором для шаблонов. С той поры ничего не изменилось, только говноеды втащили это в другие езычки.

Joe_Bishop
()

А зачем эти ваши женерики нужны?

SuoiCat
()
Ответ на: комментарий от MLP_Fan

partial application из функционального программирования.

На самом деле нет, скорее как HOF с сахаром для множественных списков аргументов, что есть в ML'е, Scala и в Ceylon'е.

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

Честно говоря, не вижу проблемы. Какую ты видишь альтернативу и какие такая альтернатива даст преимущества?

feofan ★★★★★
()

Блин, у них есть хоть какие-то аргументы в пользу такого синтаксиса, ну кроме "шобы не как у всех"?

ya-betmen ★★★★★
()
Ответ на: комментарий от RazrFalcon

а чем такой код хуже:

	defer func() {
		if tx.Error != nil {
			tx.Rollback()
			return
		}
		tx.Commit()
	}()
Или я неправильно понимаю сущность паттерна?

А если тебе понадобился скоуп меньше функции, никто не мешает тебе этот скоуп сделать лямбдой. Такой код я тоже видел.

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 1)
Ответ на: комментарий от Ivan_qrt

Это поэтому они предлагают почти тоже

семантически да (и это очень, очень плохо), но код обработки совершенно другой

но с проверкой на каждом вызове?

и это правильно: ошибки – это часть бизнес-логики

Joe_Bishop
()
Ответ на: комментарий от ya-betmen

шобы не как у всех

как у всех сейчас, к сожалению, идиотский выбор <> пошедший из плюсов. Почему идиотский? Потому что

  • Значки <> – слишком мелкие, их плохо заметно (у меня 1.0-1.0, если что). Это самый важный недостаток, потому что программы читают люди. Пример убого проектируемого раста должен быть учтён всеми, не стоит повторять их ошибок. В их случае замена <> на [] серьёзно бы облегчила восприятие этих Vec<Rc<RefCell<Box<Trait>>>>.
  • Серьёзное усложнение грамматики.
Joe_Bishop
()
Ответ на: комментарий от tailgunner

Три пары скобок. Милота.

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

bread
()
Ответ на: комментарий от Joe_Bishop

Значки <> – слишком мелкие, их плохо заметно (у меня 1.0-1.0, если что). Это самый важный недостаток

facepalm.jpg

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

Специально для тебя перепишу пример на go
locker.Lock()
defer locker.Unlock()

Ты видишь, что написал в 2 раза больше кода (как минимум)?

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

Значки <> – слишком мелкие

Начнем с того, что это вообще не скобки. И тот, кто придумал их заюзать как скобки, просто больной ублюдок. А дальше пошли полчища утят разносить эту бациллу.

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

То есть твой код состоит исключительно из обработки ресурсов и не содержит бизнес логики? Иначе не сходится.

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

То есть твой код состоит исключительно из обработки ресурсов и не содержит бизнес логики?

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

Иначе не сходится.

Посчитай строки.

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

Начнём с того, что defer нужно самому писать, а у меня он автоматом. У меня деструктор может любой код содержать.

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

посчитал. Получилось 5 непустых строк против 6 непустых строк. В какой системе счисления разница «в два раза минимум»?

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

С этим я и не спорил

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 1)
Ответ на: комментарий от Joe_Bishop

В их случае замена <> на [] серьёзно бы облегчила восприятие этих Vec<Rc<RefCell<Box<Trait>>>>.
Vec<Rc<RefCell<Box<Trait>>>>
Vec[Rc[RefCell[Box[Trait]]]]

/0

Меня до сих пор бесит что в питоне к туплам нужно через [] обращаться. Вечно путаю с массивами. Особенно учитывая что питон динамический.

RazrFalcon ★★★★★
()
Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Нужно defer самому писать, да. Не вижу в этом большой проблемы.

У меня деструктор может любой код содержать.

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

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

Вот тут объясняют, почему решили не использовать <>.

When parsing code within a function, such as v := F<T>, at the point of seeing the < it’s ambiguous whether we are seeing a type instantiation or an expression using the < operator. Resolving that requires effectively unbounded lookahead. In general we strive to keep the Go parser simple.

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

Получилось 5 непустых строк против 6 непустых строк

А надо было считать строки кода:

Go:

    locker.Lock()
    defer locker.Unlock()

C++:

     QMutexLocker locker(&mutex);

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

Не вижу в этом большой проблемы.

Это шутка? А если мне нужно написать её дважды? Трижды? 100500 раз?

Гоферам конечно не привыкать, с такой-то обработкой ошибок, но это клиника.

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

С каких пор парсинг стал ботлнеком? Насколько я знаю, в том же расте конкретно парсинг занимает лишь малую долю всего процесса компиляции.

Ну и как бы приоритеты должны быть такие: читаем -> пишем -> парсим. Ставить парсинг на первое место - бред. Это же не json какой-нибудь.

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

С каких пор парсинг стал ботлнеком?

как появились ИДЕ и автокомплит, подсветка ошибок налету и т.д.

вообще одним из преимуществ го была заявлена быстрая компиляция
правда она уже стала не такой быстрой

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от foror

В джаве GC с низкими таймингами запилили, даже две, компилирование в нативный код готово, новый простой интероп с сями готово, шебанг готово, коурутины и value type на подходе

Так а главная проблема java - тотальная безумная жирнота во всём - разве решена?

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

Так а главная проблема java - тотальная безумная жирнота во всём - разве решена?

На подходе. Но если не нуб, то и на сегодняшней джаве это решаемо. Я вот щас спокойненько загрузил весь граф транзакций биткоин блокчейна в 18 Гб оперативки на джаве. Если будешь юзать для этого дефолтный HashMap, то конечно у тебя всё упадёт. И на твоём Go тоже всё упадёт, если будешь юзать дефолтную карту. А если поищешь нужную либу, то всё летает.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 2)
Ответ на: комментарий от theNamelessOne

А разве в существующем коде таких проверок сейчас нет (в таком виде)?

Есть. Я про то и говорю, что можно было избавиться, раз уж исключения завозят. Но нет.

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

Вам надо в IDEA работать. Ибо у них всё настолько лагает, что я даже не знаю.

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