о void

Jun 16, 2009 15:50

Блядские void'ы. Придётся вводить (.net-invoke* ...) для методов, возвращающих void, ибо:

var x = f();является некорректным выражением, если f возвращает void. Ненависть!
Ну вот _зачем_ делать функции, не возвращающие _ничего_? Почему не обойтись возвращением null?? Ну или сделать void полным типом.

lisp, .net, мимолетное, ненависть, профзаметки

Leave a comment

Comments 17

wizzard0 June 16 2009, 13:24:28 UTC
а нельзя вкрутить какой-то синтаксический сахар вроде unit() или другой bottom type под это дело?

Reply

dark_aurel June 16 2009, 14:07:45 UTC
Что ты имеешь в виду? Можно поподробнее?)

Reply

wizzard0 June 16 2009, 14:15:15 UTC
мм..

а можешь подробнее расписать задачу, я тогда буду более уверен (или не уверен =)) в том, что в голову пришло

Reply

dark_aurel June 16 2009, 15:01:20 UTC
Задача заключается в генерации C# кода из S-expressions. Это не конечная цель, это одна из важных вспомогательных задач, т.к. поверх этих S-expressions строятся все-возможные DSL.

Каждая языковая конструкция -- макрос (например, .net-invoke, .net-setq, .net-let, etc). Этот макрос разворачивается в собственно лисповый код, генерирующий соотв. код целевого языка. Лисповый код представляет из себя вывод в поток необходимых выражений + возвращение некого значения.

Большинство конструкций разворачиваются лисповый код, который выводит в выходной поток строки вида: "var = ;" (где xxx -- временная переменная, yyy соотв. конструкция хостового языка) и возвращает xxx.

И всё бы хорошо. НО! для некоторых конструкций (например вызова функции, возвращающей void) такой целевой код некорректен. Кодогенератор сам по себе ничего не знает о прототипах функций. Вот и приходится вводить дополнительную конструкцию .net-invoke*, которая будет разворачиваться в "yyyy();".

Такие дела.

Reply


ironcream June 16 2009, 14:33:53 UTC
Ловлю себя на том, что дико интересно :)
Интересно читать возмущения по поводу void.
Постоянно просто кожу на Java.
Кстати возвращать null тут не хороший тон - можно спровоцировать NullPointerException.
Эх... только привыкать тебе.
А то если наллов навозвращаешь, не поймут тебя товарищи дотнетовцы.

Reply

dark_aurel June 16 2009, 15:11:37 UTC
Кстати возвращать null тут не хороший тон - можно спровоцировать NullPointerException...
Который тут был бы вполне допустим, ибо нефиг разыменовывать результат функции, которая его "не имеет".
И я возмущаюсь в первую очередь против того, возвращаемого значения _нет_. Т.е. я не могу получить это значение (пусть даже и для того, чтобы его потом просто отбросить). Собственно, это является классической проблемой с неполным типом void.

Эх... только привыкать тебе.

Вот ещё, привыкать) Я уж скорее CL для .NET реализую ^_^. и будет у меня всё возвращать значение. А наружу уж так и быть, напишу обёртку, где лишние значения будут игнорироваться.

А то если наллов навозвращаешь, не поймут тебя товарищи дотнетовцы.

А мой код товарищи дотнетовцы (обычно под этим словом понимаются C#/VB.NET-программисты) ни так, ни так не поймут, ибо он на лиспе) А нагенерённый читать не надо, не для того он.

Reply

ironcream June 17 2009, 07:21:35 UTC
Ну да.
Я ж о том.
В лиспе там же ж всё, вроде, списки какие-то возвращает?
В общем воид тебе не по душе :) Эт точно.
А я вот так привык и ничё. Живу :)

Reply

wizzard0 June 16 2009, 17:06:28 UTC
для таких целей, походу, делается не нулл а отдельный "нетип"

Reply


andy128k June 22 2009, 09:07:04 UTC
Возвращать null вместо void -- только энтропию вселенной зря увеличивать.

Дарю идею:

delegate object F();
var x = (new F(() => { ... ; return null; })).Invoke();

Reply

dark_aurel June 22 2009, 09:17:20 UTC
И? При использовании такой штуки всё-равно функции, возвращающие void надо обрабатывать "по-особому" (в моём случае -- форма .net-invoke*). А такое у меня уже есть)

Reply

andy128k June 22 2009, 09:18:46 UTC
ВСЕ вызовы так оборачивай.

Reply

dark_aurel June 22 2009, 10:36:47 UTC
Я наверное тормоз, но как ты собираешься в данном случае получать возращаемое значение тех функций, которые его таки возращают? О_о

Reply


Leave a comment

Up