Jun 16, 2009 15:50
Блядские void'ы. Придётся вводить (.net-invoke* ...) для методов, возвращающих void, ибо:
var x = f();является некорректным выражением, если f возвращает void. Ненависть!
Ну вот _зачем_ делать функции, не возвращающие _ничего_? Почему не обойтись возвращением null?? Ну или сделать void полным типом.
lisp,
.net,
мимолетное,
ненависть,
профзаметки
Leave a comment
Reply
Reply
а можешь подробнее расписать задачу, я тогда буду более уверен (или не уверен =)) в том, что в голову пришло
Reply
Каждая языковая конструкция -- макрос (например, .net-invoke, .net-setq, .net-let, etc). Этот макрос разворачивается в собственно лисповый код, генерирующий соотв. код целевого языка. Лисповый код представляет из себя вывод в поток необходимых выражений + возвращение некого значения.
Большинство конструкций разворачиваются лисповый код, который выводит в выходной поток строки вида: "var = ;" (где xxx -- временная переменная, yyy соотв. конструкция хостового языка) и возвращает xxx.
И всё бы хорошо. НО! для некоторых конструкций (например вызова функции, возвращающей void) такой целевой код некорректен. Кодогенератор сам по себе ничего не знает о прототипах функций. Вот и приходится вводить дополнительную конструкцию .net-invoke*, которая будет разворачиваться в "yyyy();".
Такие дела.
Reply
delegate void Func(T arg); // тут надо подумать с арностью, я предпочитаю в таких случаях обходиться кортежами
delegate RT Func(T arg);
class Unit{} // (_|_)
RT Maybe(Func f, T arg){ return f(arg); }
Unit Maybe(Func f, T arg){ f(arg); return new Unit(); }
и генерировать не
var xxx=yyy(...)
а
var xxx=Maybe(yyy, ...)
ну и перегрузкой будет выбираться корректный вариант. вроде такое даже инлайнится.
Reply
Но это somewhat dangerous. Использовать по вкусу и в ограниченных пределах =)
Reply
Leave a comment