всячина: С++, лицензии

15 июль, 2009 - 12:46Андрей Зубинский

В 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 вы только их отпугнёте".