Я прихожу из домена dotnet, но в последнее время смотрю на возможности альтернативных языков программирования. Ничего серьезного, просто несколько бит тут и там. Недавно я обнаружил Scala, и я очень очарован этим. Несмотря на недетерминированное вмешательство, я провел несколько промежуточных проверок вещей, которые важны для меня на С#, и я чувствую себя довольно удовлетворенными: функциональные понятия - тик, ad-hoc полиморфизм - тик, аннотации - тик, отражение и codegen - тик.
Теперь я думаю о том, как можно запрограммировать аналог библиотеки обработки JSON, который я реализовал в С# 4.0, с помощью DLR и "динамического" синтаксического сахара. Вот набор функций, который я ищу:
- Удобный просмотр и построение исходного JSON.
- Автоматическое преобразование между JSON и собственными объектами/коллекциями (в его общем виде проблема неразрешима, хотя можно определить соглашения, которые будут работать 95% времени - и это хорошо для меня).
Новые возможности С# 4.0 рока здесь, поскольку они позволяют мне переопределять доступ к члену и набирать типы для выполнения полностью настраиваемой логики (если переменная в С# 4.0 вводится как "динамическая", то все, что вы делаете с ней, будет скомпилировано в вызовы программируемым методам с разумным поведением по умолчанию - см. DynamicMetaObject.BindXXX методы в MSDN для получения дополнительной информации). Например. У меня есть избыточные типы прикладов для сериализации/десериализации объектов .NET и доступа членов для управления сырым JSON, чтобы я мог написать следующий код:
var json = Json.Get("http://some.service");
if (json.foo) Console.WriteLine((Foo)json.foo);
json.bars = ((List<Bar>)json.bars).DoSomething();
Конечно, это не идеально, поскольку динамическое связывание в С# 4.0 имеет проблемы с методами расширения и типом вывода, и, кроме того, код по-прежнему чувствует себя довольно тяжеловесным. Но в любом случае это намного лучше, чем использование всех этих (JsonObject) json [ "quux" ]) [ "baz" ] Я использовал в С# 3.5.
Некоторые базовые исследования показывают, что Scala не имеет выделенных языковых функций, которые поддерживают позднюю привязку. Тем не менее, существует так много трюков, что, возможно, их можно использовать вместе, чтобы создать терпимую эмуляцию кода, показанного выше (или даже лучше - я почти уверен, что это возможно). Не могли бы вы посоветовать мне что-то здесь?