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)
Ответ на: комментарий от Joe_Bishop

семантически да (и это очень, очень плохо)

Ну да, действительно. Как можно в Го не писать кучу бойлер плейта. Не допустимо.

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

И поэтому надо добавлять абсолютно лишний код? У тебя и так будет handle там, где будут обрабатываться ошибки. Проброс то зачем писать снова и снова?

но код обработки совершенно другой

Больше ветвлений богу ветвлений.

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

Через GraalVM есть два способа это сделать

Особо не вникал, но неужели на полном серьезе предлагается использовать LLVM IR? Как в таком случае написать что-то серьезнее helloworld-а, использующее внешние библиотеки (mkl, cublas etc)?

kawaii_neko ★★★★
()
Ответ на: комментарий от theNamelessOne
w := check os.Create(dst)
handle err {
	w.Close()
	os.Remove(dst) // (only if a check fails)
}
try {
    fstream w(dst);
} catch(...) {
   // Что-нибудь тут зделать.
}

ИМХО, всё тоже самое. Только добавили бойлерплейта для вложенных вызовов и не убрали ветвления.

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

ИМХО, всё тоже самое

А где автоматический проброс исключений выше по стеку? Есть возможность поместить код обработки в другом фрейме? Покажи, как сделать такое:

void do_something(const char *dst) {
  fstream w(dst);

  // ...
}

int main() {
  try {
    do_something();
  } catch (...) {
    // ...
  }
}

ИМХО, они просто добавили немного сахара к существующей системе обработки ошибок, ничего семантически нового тут нету.

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

А где автоматический проброс исключений выше по стеку?

Только добавили бойлерплейта для вложенных вызовов

Ну т.е. в коде на Го везде будет расставлен check. Это и есть бойлерплэйт.

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

Отчаянно плюсую. Но еще есть некая проблема, что попадание в джава-мир повышает конкуренцию среди разработиков. Если ты новичок и попал в Го, то у тебя есть шанс - тут все новички и переизобретают колеса. Если ты попал в джаву, то это технология с 20-летней обкаткой и спецами занебесного уровня. Я беседу с гошниками время от времени, и когда никто не видит, они быстро съезжают с вопросов технологии на вопросы конкуренции и бизнеса

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

Ты понимаешь, что внутри этого check там неявный return, и никакого «автоматического проброса исключений» там нету? Что этот check внутри do_something работает за счёт неявного блока handle, который автоматически добавляется внутрь do_something и возвращает ошибку? Что если ты не напишешь check в do_something, никакого проброса не будет? Как это подтверждает твою точку зрения, что в «Go 2 добавили исключения»?

С таким успехом можно сказать, что монады в Haskell - это исключения (там есть и настоящие исключения), как и тип Result с сахарком ?/try! в Rust.

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

спецами занебесного уровня
вопросы конкуренции и бизнеса

Ещё одна жертва кровавого энтерпрайза.

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

Почему вы считаете, что исключения обязательно должны быть реализованы в виде неявного обработчика?

В том же Swift тоже есть «исключения». Они даже не выпендривались, как гоферы, и использовали привычные ключевые слова. Но на деле это просто сахар над «кодами возврата».

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

Ты понимаешь, что внутри этого check там неявный return, и никакого «автоматического проброса исключений» там нету?

Да. Я изначально и написал, что ветвления не убрали. Т.е. там, где в плюсах один if, а дальше либо возвраты, либо проброс исключения, тут после всех вызовов if'ы.

Как это подтверждает твою точку зрения, что в «Go 2 добавили исключения»?

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

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

Почему вы считаете, что исключения обязательно должны быть реализованы в виде неявного обработчика?

Потому что я под «исключениями» в контексте данной темы понимаю исключения с автоматическим разматыванием стека. Если вы используете другую терминологию — то я не буду с вами спорить.

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

Ну и плюс изначальная придирка была к фразе «раз уж исключения завозят» в том смысле, что в Go собираются ввести новый механизм обработки ошибок — принципиально в драфте никаких изменений по отношению к текущему положению вещей в Go нету, так что тогда надо говорить не «исключения завозят», а «исключения в Go были всегда».

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

Сейчас исключениями называет что угодно. Смотрите пример с swift.

Error handling in Swift resembles exception handling in other languages, with the use of the try, catch and throw keywords. Unlike exception handling in many languages—including Objective-C—error handling in Swift does not involve unwinding the call stack, a process that can be computationally expensive. As such, the performance characteristics of a throw statement are comparable to those of a return statement.

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

Что характерно, в Rust есть паники, которые разматывают стек. И их можно перехватить и обработать. Но исключениями их не называют.

В Го тоже есть паника, но хз как она устроена.

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

Как в таком случае написать что-то серьезнее helloworld-а, использующее внешние библиотеки (mkl, cublas etc)?

Как я понимаю это делается, чтобы собирать нативные приложения под iOS. Или запускать десктопные приложения без JVM и JIT-а. По поводу внешних либ с инлайнами ассемблера, я не в курсе. Настолько в тему не погружался.

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

Как в таком случае написать что-то серьезнее helloworld-а, использующее внешние библиотеки (mkl, cublas etc)?

Сейчас глянул подробнее. Походу можно подключать такие либы, но только работать оно будет не на JVM, а на nativeimage, т.е. нужно джаву компилировать: https://cornerwings.github.io/2018/07/graal-native-methods/ Подключаешь библиотеку через https://www.graalvm.org/sdk/javadoc/org/graalvm/nativeimage/c/function/CLibra..., а дальше https://www.graalvm.org/sdk/javadoc/org/graalvm/nativeimage/c/function/CFunct...

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

Я беседу с гошниками время от времени, и когда никто не видит, они быстро съезжают с вопросов технологии на вопросы конкуренции и бизнеса

Наверное, они не могут или не хотят поддерживать поддерживать «беседу» с Ява-евангелистом о Ява-технологиях.

Кстати, у вас не найдется времени, чтобы поговорить о Господе нашем, Иисусу Христе?

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

все ответы ты сможешь найти в книге FP for Mortals =)

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

В Го тоже есть паника, но хз как она устроена.

Да примерно также устроена. Паника в го тоже разматывает стек и ее тоже можно перехватить. Но перехватить можно только внутри горутины.

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