Pull to refresh

Comments 7

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

С тех пор, как попробовал Lisp, — нет, не бывало.
Roslyn и прочие подобные «расширители» языка — это, конечно, круто. Но когда, чтобы получить какую-то банальную фичу, нужно писать вот такую кучу кода и по сути вручную допиливать компилятор с помощью нетривиального API, то желание это изучать и использовать значительно снижается.

Такие вещи нужно встраивать в сам язык. Кроме упомянутого мной Лиспа с его макросами, есть Template Haskell, есть Nemerle, да даже обычный C имеет не самую сильную, но зато удобную и поэтому широко используемую макросистему (не говоря уже про бесконечные возможности расширения препроцессора C).
ну как я уже говорил, Roslyn на самом деле не совсем для расширения языка делается, это уж мои проблемы, что я попытался использовать его таким неспецификационным образом.)
Возможно поэтому получилось коряво. Возможно это можно сделать как-то по другому и без использования Рослина, но я, честно, не знаю. Просто хотелось попробовать Roslyn, а писать какой-то банальный code fix не очень хотелось.
Хм. Ткните пожалуйста в макро-систему на С которая позволяет работать с AST во время компиляции и встроена в компилятор? Я просто сколько на С не писал такого чуда не видел. А #define и в C# есть.
ещё раз говорю: не самую сильную, зато удобную систему макросов. речь о том, что инструмент должен быть удобным, иначе смысл его исползования сильно снижается.
а как распарсятся «true? test?.ChainTest: a» и «test?.ChainTest? a: b»? :)
в первом случае фигня, он забывает про " :a"
testStr = true ? test != null ? test.ChainTest : null;

во втором, если предполагается, что ChainTest — булево поле, то вроде нормально:
testStr = test != null ? test.ChainTest ? a : b : null;

Да я думаю, это не единственные каверзные случаи :) Просто не было такой задачи, выискать все каверзные случаи.
Когда информация хранится в БД, да и просто для сокращения количества проверок на null, мы используем принудительную инициализацию значений методами расширения .ToDefault(this object, string Value ), ToInt(this object, int Value ) и т.д.

В этих методах проверяется исходное значение на null и происходит инициализация дефолтным при необходимости.

Код получается чистый, вполне читабельный.
Sign up to leave a comment.

Articles