Как Scalding DSL переводится в обычный код Scala?

Помогите, пожалуйста, разобраться, как Scalding DSL транслируется в обычный код Scala.

https://github.com/twitter/scalding/wiki/Fields-based-API-Reference#sortBy

Например:

val fasterBirds = birds.map('speed -> 'doubledSpeed) { speed : Int => speed * 2 }

Вопросы:

  1. Каким соглашениям я должен следовать, чтобы добавить свои собственные функции в Scalding map,reduce, groupBy,sort и `scanLeft?
  2. Как Scalding переводит выражения в таких полях, как `'inpFld -> 'outFld, в код Scala?
  3. Какие структуры данных/функции создает транслятор Scalding? Где их найти в исходниках Scalding?

Спасибо!


person DarqMoth    schedule 12.07.2014    source источник


Ответы (1)


Это обычный код Scala. Одна из сильных сторон Scala заключается в ее расширяемости. Синтаксис позволяет программисту расширять синтаксис программ для создания предметно-ориентированных языков. Это особенно полезно при использовании базовых библиотек.

Предметно-ориентированный язык Scala не столько переводит, сколько позволяет вам отложить применение кода до подходящего времени. Символ галочки (') означает, что следующий набор символов является символом, встроенным типом данных. Оператор -> — это синтаксический сахар, который можно выразить так же, как и запятую, но визуально он передает понятие «перевод» или «от этого к тому».

Предметно-ориентированный язык, на который вы смотрите, не создает структур, хотя похоже, что он создает функтор. В этом случае виртуальная машина Java видит его как экземпляр Function1[Type,Type], у которого есть метод apply, который принимает свой аргумент и возвращает результат, вычисляемый предоставленным кодом.

person Bob Dalgleish    schedule 12.07.2014
comment
Было бы полезно увидеть, какой еще код требуется для того, чтобы val fasterBirds = birds.map('speed -> 'doubledSpeed) { speed : Int => speed * 2 } скомпилировалось без ошибок в Scala. - person DarqMoth; 12.07.2014
comment
@ om-nom-nom Какая часть спецификации Scala касается использования символа галочки (') для обозначения символа и оператора -› в качестве синтаксического сахара? Где я могу прочитать об этом? Спасибо! - person DarqMoth; 13.07.2014
comment
Возможно, вам придется начать с самого начала. Вот хорошая отправная точка: docs.scala-lang.org /tutorials/tour/tour-of-scala.html - person Bob Dalgleish; 14.07.2014
comment
Я знаю базовый Scala, спасибо. Я спрашивал, как эта форма collection.fun('x->'g){...} транслируется в обычный вызов функции, как передаются аргументы. Я думаю, что fun должна быть каррированной функцией, и у них должен быть какой-то механизм для передачи аргументов в виде `символов. Я думаю, что кто-нибудь может привести грубый пример этого, не беспокойтесь, я найду себя. - person DarqMoth; 14.07.2014