Bosque language
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 19.04.19 06:52
Оценка: 5 (2)
Новый язык от Microsoft research, в котором нет циклов — Bosque.
Сделан для анализа данных, но на богомерзком JS. Обзор языка.
Re: Bosque language
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 23.04.19 05:25
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Новый язык от Microsoft research, в котором нет циклов — Bosque.

N>Сделан для анализа данных, но на богомерзком JS. Обзор языка.

База в виде JS — мощный задел на распространенность. Можно легко притянуть куда надо и не надо, демонстрируя свою прогрессивность и утонченный вкус в выборе инструмента.

PS Кто знает как бы сложилась судьба Nemerle, был бы он написал на JS?
Re: Bosque language
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 24.04.19 10:03
Оценка: 3 (1)
Здравствуйте, Nuzhny, Вы писали:

N>Новый язык от Microsoft research, в котором нет циклов — Bosque.


Я когда на реддите увидел ссылку и открыл их описание языка, подумал, что первое апреля. Слов важных много, а особых отличий от обычных языков, кроме переименования некоторых ключевых слов, на первый взгляд и не видно. Надо подробнее почитать.

Обзор языка.

The big three
Marron's technical paper explores potential sources of programming language complexity that Bosque tries to deal with. But he says eliminating mutable state, loops, and reference equality represent the big three.


Занятно. У нас в компании есть свой in-house ЯП, там как раз те же три свойства присутствуют. Есть всякие массивы и ленивые последовательности, есть filter/map/fold etc., а циклов в явном виде нет, и рекурсии одно время тоже не было, да и сейчас не используется. Но только все равно, достаточно же сделать
arr.length |> iota |> map(i => ...)
, и вот уже считай цикл по i вдоль массива arr...
Re[2]: Bosque language
От: AlexRK  
Дата: 25.04.19 07:20
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Занятно. У нас в компании есть свой in-house ЯП, там как раз те же три свойства присутствуют. Есть всякие массивы и ленивые последовательности, есть filter/map/fold etc., а циклов в явном виде нет, и рекурсии одно время тоже не было, да и сейчас не используется. Но только все равно, достаточно же сделать
arr.length |> iota |> map(i => ...)
, и вот уже считай цикл по i вдоль массива arr...


А этот язык секретный? Информацию о нем можно "выдавать" или запрещено? Было бы интересно о нем узнать поподробнее.
Re[3]: Не Bosque language
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 25.04.19 10:26
Оценка: 9 (2)
Здравствуйте, AlexRK, Вы писали:

ARK>А этот язык секретный? Информацию о нем можно "выдавать" или запрещено? Было бы интересно о нем узнать поподробнее.


Не секретный, в начале мая на dconf мои коллеги будут про него что-то рассказывать. Но он активно развивается и меняется, пока что не очень интересный.
Контекст: есть инвестиционный фонд, в нем некоторое количество аналитиков и исследователей, которым надо играться с данными, анализировать риски, строить отчеты. До этого у них был Excel, SQL и несколько разнородных финансовых систем. Плюс у разных команд накопился какой-то код на Плюсах, Шарпе, Джаве, Питоне и Ди. Запилили свой нарочито ограниченный интеграционный язык, интерпретатор которого умеет взаимодействовать с самым разным имеющимся кодом на разных языках, говорить с БД, и доступен как в отдельном репле, так и прямо из Экселя. В итоге аналитикам не надо сразу учить "настоящее" программирование на взрослых языках, где легко прострелить ногу, но возможностей у них стало намного больше, чем было с их Экселем, плюс все теперь в скриптах с контролем версий, проектами-ветками-мерджами в гитлабе, с тестами. Культурно!

Выглядит сейчас код на нем так:
posInfLinkerBreakeven_Net(iso, ent, pfolio, subPfolio) => (greeksByPfolio
                                                           |> byEPS(ent, pfolio, subPfolio)
                                                           |> filterCountry(countries[iso])
                                                          ).usdInfDelta |> sum

bucketByTenorFactorsAndWeight(bs, keyToWeight, tnrFactors) =>
    tnrFactors
    |> keys
    |> mapa(tf => ((bs
                    |> filterTenors( tenorsInTenorFactor[tf] ))[keyToWeight]
                    |> sum) / tnrFactors[tf])

fxVegaByUnderlier (ent, pfolio, subPfolio) =>
{
    dataEPS = fxVegaByPfolio
              |> byEPS(ent, pfolio, subPfolio)

    in dataEPS.underlierInfo
       |> sort
       |> uniq
       |> mapa(ulier => {"FxUnderlier" : ulier, "FxVegas" : dataEPS |> fxVegaUnderlier(ulier)})
}

posEquityStressScenario(charc, ent, pfolio, subPfolio) =>
{
    ranking = (if (charc[$-2] >= '0') && (charc[$-2] <= '9')
                 then charc[$-2:$]
                 else charc[$-1:$]
              ) |> parseInteger

    // Get data
    filtered = eqSpotGrouped[pfolio]
                        |> filterEntity(ent)
                        |> filterSubPortfolio(pfolio, subPfolio)

    sums = filtered
        |> groupByCols(["underlierInfo"])
        |> mapa(g => (g.group |> pivot(["scenarioName"], { "plBase" : sum })).plBase |> min)
        |> sort

    in sums[ranking - 1]
}

posIndexRollCS01(creditIndex, ent, pfolio, subPfolio) =>
{
    retCS01 = 0.0
    seriesData = cs01ByPfolio
                 |> byEPS(ent, pfolio, subPfolio)
                 |> cs01sPerSeries(creditIndex)

    seriesData = if tableLen(seriesData) >= 2 then seriesData else {"CS01" : [0.0, 0.0]}

  in abs(seriesData.CS01[$-1] - seriesData.CS01[$-2])
}

pivot__tableSlice(tableIn, start, end) => tableIn |> keys |> fold((r, k) => r |> addEntry(k, tableIn[k][start : end]), {})

pivot__sortedIndex(r) => iota(len(r)) |> sortBy((aI, bI) => r[aI] < r[bI])


Есть лямбды и передача первоклассных функций-замыканий туда-сюда, данные иммутабельны, if-else возвращает значение, есть литералы для массивов и "объектов" (хэш-таблиц со строковыми ключами), ряд операций вроде map ленивые, возвращают рэнджи (в терминологии Ди), поэтому композиция из нескольких map/filter не создает промежуточных массивов. Все сводится к функциям (раскинутым по модулям) и выражениям, никаких циклов, никаких записей в массивы. Типы пока что проверяются в рантайме, но скоро добавлю их вывод и статическую проверку. Реализован в виде довольно тупого интерпретатора на D. Благодаря статической интроспекции в D, подключать нативный код очень легко, все поля и методы нативных структур и объектов автоматически становятся видны из интерпретатора, и там тоже есть своя интроспекция, можно видеть содержимое модулей и объектов, имена и типы полей/методов.
Я занимаюсь сердцем интерпретатора, еще несколько человек добавляют "конечности" — то, через что он общается с экселем, БД и другими системами и кодобазами.

Из анекдотов: зимой у нас в гите появилась ветка с говорящим названием a_stack_would_be_nice. Ибо после некоторых смелых оптимизаций оказалось, что стало можно рекурсивно вызывать ф-ии (раньше рекурсия была запрещена), но полноценного стека не было — рекурсивный вызов затирал локальные переменные вызывающей ф-ии. Но реальный код при этом продолжал работать, т.к. на практике рекурсия не использовалась. Осознав беду, стек добавили. Но по-прежнему, если нет рекурсии, то вызов ф-ии не вызывает выделения памяти — место для локальных переменных преаллоцировано заранее. Это, правда, привело к другой проблеме: при выходе из ф-ии ее локальные переменные оставались живыми в памяти и мешали сборке мусора, держась за ненужные уже данные. Так появилась ветка let_it_go, где их научили отпускать, больше не держаться.

Отдельное спасибо языку Раст: при редактировании скриптов на нашем ЯП народ просто выбирает в своем редакторе синтаксис Раста, и подсветка кода готова. Свою делать не понадобилось.
Отредактировано 25.04.2019 10:33 D. Mon . Предыдущая версия .
Re[4]: Не Bosque language
От: MadHuman Россия  
Дата: 25.04.19 10:58
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Есть лямбды и передача первоклассных функций-замыканий туда-сюда, данные иммутабельны, if-else возвращает значение, есть литералы для массивов и "объектов" (хэш-таблиц со строковыми ключами), ряд операций вроде map ленивые, возвращают рэнджи (в терминологии Ди), поэтому композиция из нескольких map/filter не создает промежуточных массивов. Все сводится к функциям (раскинутым по модулям) и выражениям, никаких циклов, никаких записей в массивы. Типы пока что проверяются в рантайме, но скоро добавлю их вывод и статическую проверку. Реализован в виде довольно тупого интерпретатора на D. Благодаря статической интроспекции в D, подключать нативный код очень легко, все поля и методы нативных структур и объектов автоматически становятся видны из интерпретатора, и там тоже есть своя интроспекция, можно видеть содержимое модулей и объектов, имена и типы полей/методов.

DM>Я занимаюсь сердцем интерпретатора, еще несколько человек добавляют "конечности" — то, через что он общается с экселем, БД и другими системами и кодобазами.

с первого взгляда от F# не отличиш

в конвейерном операторе, например
x |> byEPS(ent, pfolio, subPfolio)
куда результат от предвыражения подставляется? в 1-й параметр функции? или последний?
это такая замена каррирования?

вообще идеи интересные, у нас в команде примерно подобные роятся в умах.. и примерно назначение схожее — прикладникам (аналитики и тп) дать инструмент для запросов к данным, тк sql они не любят.
а вот ФП понимают гораздо проще. и я их понимаю и согласен)
Re[5]: Не Bosque language
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 25.04.19 11:09
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>с первого взгляда от F# не отличиш


Да, с F# немало сходства, потом может стать еще больше, это вообще хороший образец для подражания. Только к отступам у нас синтаксис нечувствителен.

MH>в конвейерном операторе, например

MH> x |> byEPS(ent, pfolio, subPfolio)
MH>куда результат от предвыражения подставляется? в 1-й параметр функции? или последний?
MH>это такая замена каррирования?

x |> f(a,b)
автоматически превращается в
f(x,a,b)


Это прямой аналог того, что в D сделано, только там точка вместо |>.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.