+77 голосов |
В Visual Studio 2010 будет новый компилятор С++, поддерживающий ряд конструкций С+0X. Самая интересная, пожалуй, - лямбда-функции и выражения. Синтаксис описания лямбда-функции вполне вменяемый:
Вишнёвая часть в этом примере, [=] - селектор захвата, указывающий принцип доступа лямбда-функции к переменным из области видимости. ['] - доступ к переменным осуществляется по ссылке, [=] - по значению. Полезный селектор. С его помощью можно и гарантировать, что лямбда-функция будет "из мира функционального программирования", то есть гарантированно не изменяющей состояний переменных, и строить хитрые императивные конструкции.
Синяя часть, (char cc), в общем случае (тип имя, тип имя, ...), - список параметров лямбда-функции.
Красная, ->char, в общем случае ->тип или просто ->, оператор объявления лямбда-функции и тип возвращаемого ею значения (тип может быть опущен).
В фигурных скобках, обозначенное фиолетовым, { return cc+0x20; } - собственно тело функции.
Ну и, наконец, зелёные скобки - вызов лямбда-функции и передача ей параметра.
В общем, весьма мило. Единственное "но" - если лямбда-функции будут использоваться в коде, где много операций обращения к полям структур или классов, можно будет сломать мозги. Впрочем, в С++ сломать мозги можно миллионами способов, богатый на это дело язык.
Ещё для С++ нашёлся весьма симпатичный встраиваемый скриптовый язык - ChaiScript. Чтобы не городить свой. Правда, у него зачем-то странный символ, похожий на ночной горшок.
Но не этим он симпатичен. Язык маленький и простой, синтаксически "привычный", с зачатками функционального, что главное - в отличие от прочих встраиваемых языков он создавался специально для C++, поэтому не требует никаких дополнительных штуковин, типа межъязыковых "обёрток" интерфейсов и программ для их генерации. API минимальный, для полноценной работы достаточно меньше 10 вызовов.
Функциональные "штучки" в нём понятны из примера, показывающего, что функции - полноценные анонимные объекты первого класса.:
var add2 = fun(x, y) { x + y }
var add1 = fun(x, f) { f(3,x) }
print( add2(3, 4) )
print( add1(2, add2) )
Реализация небольшая, использует библиотеку Boost.
Использовать очень просто, несмотря на зачаточную документацию.
Лицензия - BSD.
Кстати, о лицензиях. Каждый месяц в очередной крестовый поход во имя Единственно Правильной Лицензии отправляется новый крестоносец. Вот в своём блоге Zed Shaw, автор Mongrel , в очередной раз объяснился о том, почему он выбрал GPL. А в другом блоге, Objects In Motion, высказано мнение, когда хороша GPL, когда - BSD. И мнение тоже не мальчка, но мужа, как-никак, Numpy и Scipy - проекты известные, неигрушечные, вовсе не однодневки, востребованные в научном сообществе и высоко котирующиеся. Так что оба мнения весьма интересны. И вот особенно интересное:
разница в выборе GPL или BSD лицензии это "...всего лишь способ определиться, какое сообщество вы хотите сформировать вокруг своего проекта. Если сообщество будет состоять из эгоистичных входящих в него ненадолго оппортунистов, тогда действительно защищайте свой код и себя с помощью GPL. Если сообщество должно быть образовано большим количеством нормальных коммерческих разработчиков, с помощью GPL вы только их отпугнёте".
Ready, set, buy! Посібник для початківців - як придбати Copilot для Microsoft 365
+77 голосов |