SlideShare a Scribd company logo
Предметно-ориентированные языкии Lisp как средство ихпостроенияДмитрий Бушенко30
Что это такое DSL?Предметно-ориентированный язык (Domain Specific Language)– это язык программирования ограниченной выразительности, фокусирующийся на некоторой предметной области29
Пример программы на DSLSet camera size: 400 by 300 pixels.Set camera position: 100, 100.Move 200 cm right.Move 100 inches up.Move 250 pixels left.Move 50 points down.Take a picture.28
Пример программы на DSLc = new Computer();P = new Processor();p.setCores(2);p.setType(ProcTypes.i386);c.setProcessor(p);d = new Disk();d.setSize(75);d.setSpeed(7200);d.setInterface(DiskTypes.SATA);c.setDisk(d);Computer:   processor:      cores -- 2      type -- i386   disk:      size -- 75      speed -- 7200      interface -- SATA27
Представление языкаСемантическая модель26
DSL и  eDSLВстроенный DSLРеализуется на базе основного языка.
Синтаксис ограничен синтаксисом хостового языка.
Тот же язык, на базе которого реализован.Внешний DSLРеализуется средствами создания ЯП.
Произвольный синтаксис.
Чужой по отношению к основному языку проекта.25
eDSLсредствами java и rubycomputer() .processor()  .cores(2)  .speed(2500)  .i386() .disk()  .size(150) .disk()  .size(75)  .speed(7200)  .sata().end();computer( processor(:cores => 2,                     :type => :i386), disk(:size => 150), disk(:size => 75,          :speed => 7200,          :interface => :sata))24
Другой пример DSL на ruby[:computer,   [:processor,       [:cores, 2],       [:type, :i386]],   [:disk,       [:size, 75],       [:speed, 7200],       [:interface, :sata]]]Computer:   processor:      cores -- 2      type -- i386   disk:      size -- 75      speed -- 7200      interface -- SATA23
Как добавить сюда управляющие конструкции?computer() . . ..disk()  .size(75)  .speed(7200)  .sata().end();[:computer,. . .   [:disk,       [:size, 75],       [:speed, 7200],       [:interface, :sata]]]22
Как добавить сюда управляющие конструкции?computer(). . ..times(2)  .disk()    .size(75)    .speed(7200)    .sata().end_times().end();[:computer, . . .2.times do |i|	   [:disk,       [:size, 75],       [:speed, 7200],       [:interface, :sata]]end]21
Мы, программисты, представляем себя волшебниками, повелителями кода20
Дерево разбора выраженияA + B * C+ACB*19
Дерево разбора выраженияA + B * C()+A()BC*18
Дерево разбора выраженияA + B * C()+A()BC*17
c = new Computer();P = new Processor();p.setCores(2);p.setType(ProcTypes.i386);c.setProcessor(p);Computer:   processor:      cores -- 2      type -- i386(Computer    (processor      (cores 2)      (type i386)))16
15
Unless == not if(unless (= a b)(do something))(if (not (= a b) (do something))Шаблон: unlessПараметры: cond,			    body (if (not (cond) body)14
Unless == not ifШаблон: unlessПараметры: cond,			    body (if (not (cond) body)(defmacro unless     [condbody]`(if (not ~cond)       ~body))13
Порядок выполнения функций и макросовКомпиляцияМакросыИсполнениеФункции12
Инфиксная нотация11(defmacro infix [arg1oparg2](list oparg1arg2))(infix 2 + 5)7
(for (i = 0, i < 3, i ++) (println i))(defmacro for [args & body]  (let [a1 (nth args 0)    a2 (nth args 1)        a3 (nth args 2)      a4 (nth args 3)        a5 (nth args 4)a6 (nth args 5)        a7 (nth args 6)     a8 (nth args 7)]    (cond     (not (= a1 a4 a7)) (throw (Exception. "Use the same variable for the cycle"))     (not (= a2 '=)) (throw (Exception. "Use the '=' for the variable assignment"))     (not (contains? #{'> '< '>= '<= '=} a5)) (throw (Exception. "Use one of the operators: =, <, <=, >, >="))     (not (contains? #{'++ '--} a8)) (throw (Exception. "Use one of the operators: ++, --"))     :default (let [op (if (= a8 '++) 'inc 'dec)]                `(loop [~a1 ~a3] (if (not (~a5 ~a1 ~a6))                                   ~a1                                   (do ~@body                                       (recur (~op ~a1)))))))))10
I’ll be back!09
Анафорический макрос(defmacro not-nil  ([exprthen & else]    (let [result (symbol "result")]      `(let [~result ~expr]         (if (not (nil? ~result)) ~then(do ~@else))))))user> (not-nil (+ 2 3) (println result))5user> (not-nil nil (println result) (println "The result is nil!"))The result is nil!08
В C# 4.0 мы добавили новую фантастическую возможность:бла-бла-бла!Программисты C#07
Пример М.ФаулераSVCLFOWLER        10101MS0120050313SVCLHOHPE         10201DX0320050315SVCLTWO           x10301MRP220050329USGE103   x50214..7050329Как все это распарсить?06
Разные типы – разные поляSVCLFOWLER  4-18: CustomerName  19-23: CustomerID  24-27 : CallTypeCode  28-35 : DateOfCallStringUSGE103  4-8 : CustomerID  9-22: CustomerName  30-30: Cycle  31-36: ReadDate05
Расставим скобочки…(def-reader  SVCLFOWLER[4 18 CustomerName]  [19 23 CustomerID]  [24 27 CallTypeCode]  [28 35 DateOfCallString])(def-reader  USGE103  [4 8  CustomerID]  [9 22 CustomerName]  [30 30 Cycle]  [31 36 ReadDate])04
Ad

More Related Content

What's hot (20)

Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
Python Meetup
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
Platonov Sergey
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Mail.ru Group
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Platonov Sergey
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
corehard_by
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
Python Meetup
 
Повышение конверсии через оптимизацию JS
Повышение конверсии через оптимизацию JSПовышение конверсии через оптимизацию JS
Повышение конверсии через оптимизацию JS
Антон Плешивцев
 
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур  Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
it-people
 
Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всём
Ruslan Balkin
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
Alexey Paznikov
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
Badoo Development
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
Alexey Paznikov
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Ontico
 
Hf labs education day. rocket science
Hf labs education day. rocket scienceHf labs education day. rocket science
Hf labs education day. rocket science
Olga Kiseleva
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Sergey Platonov
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
Andrey Akinshin
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
Python Meetup
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
Platonov Sergey
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Mail.ru Group
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Platonov Sergey
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
corehard_by
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
Python Meetup
 
Повышение конверсии через оптимизацию JS
Повышение конверсии через оптимизацию JSПовышение конверсии через оптимизацию JS
Повышение конверсии через оптимизацию JS
Антон Плешивцев
 
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур  Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
it-people
 
Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всём
Ruslan Balkin
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
Alexey Paznikov
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Ontico
 
Hf labs education day. rocket science
Hf labs education day. rocket scienceHf labs education day. rocket science
Hf labs education day. rocket science
Olga Kiseleva
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Sergey Platonov
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
Andrey Akinshin
 

Similar to DSLs in Lisp and Clojure (20)

Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Yandex
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
Alexander Podkhalyuzin
 
User Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAUser Defined Materials in LS-DYNA
User Defined Materials in LS-DYNA
Yury Novozhilov
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
Andrey Karpov
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
Tatyanazaxarova
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
corehard_by
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
Andrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
Pavel Tsukanov
 
Огранизация ввода и вывода данных
Огранизация ввода и вывода данныхОгранизация ввода и вывода данных
Огранизация ввода и вывода данных
Andrey Dolinin
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
Арсений Жижелев
 
DirectX12 Graphics and Performance
DirectX12 Graphics and PerformanceDirectX12 Graphics and Performance
DirectX12 Graphics and Performance
DevGAMM Conference
 
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
CEE-SEC(R)
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
Mikhail Kurnosov
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
Yandex
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
Fedor Vompe
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Yandex
 
User Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAUser Defined Materials in LS-DYNA
User Defined Materials in LS-DYNA
Yury Novozhilov
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
Andrey Karpov
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
Tatyanazaxarova
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
corehard_by
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
Andrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
Pavel Tsukanov
 
Огранизация ввода и вывода данных
Огранизация ввода и вывода данныхОгранизация ввода и вывода данных
Огранизация ввода и вывода данных
Andrey Dolinin
 
DirectX12 Graphics and Performance
DirectX12 Graphics and PerformanceDirectX12 Graphics and Performance
DirectX12 Graphics and Performance
DevGAMM Conference
 
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
CEE-SEC(R)
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
Mikhail Kurnosov
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
Yandex
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
Fedor Vompe
 
Ad

More from Vasil Remeniuk (20)

Product Minsk - РТБ и Программатик
Product Minsk - РТБ и ПрограмматикProduct Minsk - РТБ и Программатик
Product Minsk - РТБ и Программатик
Vasil Remeniuk
 
Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14
Vasil Remeniuk
 
Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14
Vasil Remeniuk
 
Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3
Vasil Remeniuk
 
Testing in Scala by Adform research
Testing in Scala by Adform researchTesting in Scala by Adform research
Testing in Scala by Adform research
Vasil Remeniuk
 
Spark Intro by Adform Research
Spark Intro by Adform ResearchSpark Intro by Adform Research
Spark Intro by Adform Research
Vasil Remeniuk
 
Types by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaTypes by Adform Research, Saulius Valatka
Types by Adform Research, Saulius Valatka
Vasil Remeniuk
 
Types by Adform Research
Types by Adform ResearchTypes by Adform Research
Types by Adform Research
Vasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
Vasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
Vasil Remeniuk
 
Spark by Adform Research, Paulius
Spark by Adform Research, PauliusSpark by Adform Research, Paulius
Spark by Adform Research, Paulius
Vasil Remeniuk
 
Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)
Vasil Remeniuk
 
Spark intro by Adform Research
Spark intro by Adform ResearchSpark intro by Adform Research
Spark intro by Adform Research
Vasil Remeniuk
 
SBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaSBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius Valatka
Vasil Remeniuk
 
Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2
Vasil Remeniuk
 
Testing in Scala. Adform Research
Testing in Scala. Adform ResearchTesting in Scala. Adform Research
Testing in Scala. Adform Research
Vasil Remeniuk
 
Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1
Vasil Remeniuk
 
Cassandra + Spark + Elk
Cassandra + Spark + ElkCassandra + Spark + Elk
Cassandra + Spark + Elk
Vasil Remeniuk
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
Vasil Remeniuk
 
ETL со Spark
ETL со SparkETL со Spark
ETL со Spark
Vasil Remeniuk
 
Product Minsk - РТБ и Программатик
Product Minsk - РТБ и ПрограмматикProduct Minsk - РТБ и Программатик
Product Minsk - РТБ и Программатик
Vasil Remeniuk
 
Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14
Vasil Remeniuk
 
Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14
Vasil Remeniuk
 
Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3
Vasil Remeniuk
 
Testing in Scala by Adform research
Testing in Scala by Adform researchTesting in Scala by Adform research
Testing in Scala by Adform research
Vasil Remeniuk
 
Spark Intro by Adform Research
Spark Intro by Adform ResearchSpark Intro by Adform Research
Spark Intro by Adform Research
Vasil Remeniuk
 
Types by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaTypes by Adform Research, Saulius Valatka
Types by Adform Research, Saulius Valatka
Vasil Remeniuk
 
Types by Adform Research
Types by Adform ResearchTypes by Adform Research
Types by Adform Research
Vasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
Vasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
Vasil Remeniuk
 
Spark by Adform Research, Paulius
Spark by Adform Research, PauliusSpark by Adform Research, Paulius
Spark by Adform Research, Paulius
Vasil Remeniuk
 
Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)
Vasil Remeniuk
 
Spark intro by Adform Research
Spark intro by Adform ResearchSpark intro by Adform Research
Spark intro by Adform Research
Vasil Remeniuk
 
SBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaSBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius Valatka
Vasil Remeniuk
 
Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2
Vasil Remeniuk
 
Testing in Scala. Adform Research
Testing in Scala. Adform ResearchTesting in Scala. Adform Research
Testing in Scala. Adform Research
Vasil Remeniuk
 
Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1
Vasil Remeniuk
 
Cassandra + Spark + Elk
Cassandra + Spark + ElkCassandra + Spark + Elk
Cassandra + Spark + Elk
Vasil Remeniuk
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
Vasil Remeniuk
 
Ad

DSLs in Lisp and Clojure

  • 1. Предметно-ориентированные языкии Lisp как средство ихпостроенияДмитрий Бушенко30
  • 2. Что это такое DSL?Предметно-ориентированный язык (Domain Specific Language)– это язык программирования ограниченной выразительности, фокусирующийся на некоторой предметной области29
  • 3. Пример программы на DSLSet camera size: 400 by 300 pixels.Set camera position: 100, 100.Move 200 cm right.Move 100 inches up.Move 250 pixels left.Move 50 points down.Take a picture.28
  • 4. Пример программы на DSLc = new Computer();P = new Processor();p.setCores(2);p.setType(ProcTypes.i386);c.setProcessor(p);d = new Disk();d.setSize(75);d.setSpeed(7200);d.setInterface(DiskTypes.SATA);c.setDisk(d);Computer: processor: cores -- 2 type -- i386 disk: size -- 75 speed -- 7200 interface -- SATA27
  • 6. DSL и eDSLВстроенный DSLРеализуется на базе основного языка.
  • 8. Тот же язык, на базе которого реализован.Внешний DSLРеализуется средствами создания ЯП.
  • 10. Чужой по отношению к основному языку проекта.25
  • 11. eDSLсредствами java и rubycomputer() .processor() .cores(2) .speed(2500) .i386() .disk() .size(150) .disk() .size(75) .speed(7200) .sata().end();computer( processor(:cores => 2, :type => :i386), disk(:size => 150), disk(:size => 75, :speed => 7200, :interface => :sata))24
  • 12. Другой пример DSL на ruby[:computer, [:processor, [:cores, 2], [:type, :i386]], [:disk, [:size, 75], [:speed, 7200], [:interface, :sata]]]Computer: processor: cores -- 2 type -- i386 disk: size -- 75 speed -- 7200 interface -- SATA23
  • 13. Как добавить сюда управляющие конструкции?computer() . . ..disk() .size(75) .speed(7200) .sata().end();[:computer,. . . [:disk, [:size, 75], [:speed, 7200], [:interface, :sata]]]22
  • 14. Как добавить сюда управляющие конструкции?computer(). . ..times(2) .disk() .size(75) .speed(7200) .sata().end_times().end();[:computer, . . .2.times do |i| [:disk, [:size, 75], [:speed, 7200], [:interface, :sata]]end]21
  • 15. Мы, программисты, представляем себя волшебниками, повелителями кода20
  • 19. c = new Computer();P = new Processor();p.setCores(2);p.setType(ProcTypes.i386);c.setProcessor(p);Computer: processor: cores -- 2 type -- i386(Computer (processor (cores 2) (type i386)))16
  • 20. 15
  • 21. Unless == not if(unless (= a b)(do something))(if (not (= a b) (do something))Шаблон: unlessПараметры: cond, body (if (not (cond) body)14
  • 22. Unless == not ifШаблон: unlessПараметры: cond, body (if (not (cond) body)(defmacro unless [condbody]`(if (not ~cond) ~body))13
  • 23. Порядок выполнения функций и макросовКомпиляцияМакросыИсполнениеФункции12
  • 24. Инфиксная нотация11(defmacro infix [arg1oparg2](list oparg1arg2))(infix 2 + 5)7
  • 25. (for (i = 0, i < 3, i ++) (println i))(defmacro for [args & body] (let [a1 (nth args 0) a2 (nth args 1) a3 (nth args 2) a4 (nth args 3) a5 (nth args 4)a6 (nth args 5) a7 (nth args 6) a8 (nth args 7)] (cond (not (= a1 a4 a7)) (throw (Exception. "Use the same variable for the cycle")) (not (= a2 '=)) (throw (Exception. "Use the '=' for the variable assignment")) (not (contains? #{'> '< '>= '<= '=} a5)) (throw (Exception. "Use one of the operators: =, <, <=, >, >=")) (not (contains? #{'++ '--} a8)) (throw (Exception. "Use one of the operators: ++, --")) :default (let [op (if (= a8 '++) 'inc 'dec)] `(loop [~a1 ~a3] (if (not (~a5 ~a1 ~a6)) ~a1 (do ~@body (recur (~op ~a1)))))))))10
  • 27. Анафорический макрос(defmacro not-nil ([exprthen & else] (let [result (symbol "result")] `(let [~result ~expr] (if (not (nil? ~result)) ~then(do ~@else))))))user> (not-nil (+ 2 3) (println result))5user> (not-nil nil (println result) (println "The result is nil!"))The result is nil!08
  • 28. В C# 4.0 мы добавили новую фантастическую возможность:бла-бла-бла!Программисты C#07
  • 29. Пример М.ФаулераSVCLFOWLER 10101MS0120050313SVCLHOHPE 10201DX0320050315SVCLTWO x10301MRP220050329USGE103 x50214..7050329Как все это распарсить?06
  • 30. Разные типы – разные поляSVCLFOWLER 4-18: CustomerName 19-23: CustomerID 24-27 : CallTypeCode 28-35 : DateOfCallStringUSGE103 4-8 : CustomerID 9-22: CustomerName 30-30: Cycle 31-36: ReadDate05
  • 31. Расставим скобочки…(def-reader SVCLFOWLER[4 18 CustomerName] [19 23 CustomerID] [24 27 CallTypeCode] [28 35 DateOfCallString])(def-reader USGE103 [4 8 CustomerID] [9 22 CustomerName] [30 30 Cycle] [31 36 ReadDate])04
  • 32. (defmacro def-reader [class-name & fields] (let [method-names (map #(vector (symbol (nth % 2)) '[] 'String) fields) methods `( ~@(map #(list 'defn (symbol (str class-name "-" (nth % 2))) [(symbol "this")] `(read-bytes ~(nth % 0) ~(nth % 1) (:data (deref (.state ~(symbol "this")))))) fields)) prefix (str class-name "-")] `(do (gen-class :name ~(str class-name) :prefix ~prefix :init "init" :state "state" :methods [~@method-names [~(symbol "setData") [String] String]]) ~@methods (defn ~(symbol (str prefix "init")) [] [[] (ref {})]) (defn ~(symbol (str prefix "setData")) [this# data#] (dosync (alter (.state this#) assoc :data data#)) ""))))03
  • 33. (def-reader fowler.core.ThirdClass [2 7 field1] [9 15 field2] [17 20 field3])02