SlideShare uma empresa Scribd logo
1 de 31
Предметно-ориентированные языкии Lisp как средство ихпостроения Дмитрий Бушенко 30
Что это такое DSL? Предметно-ориентированный язык (Domain Specific Language)– это язык программирования ограниченной выразительности, фокусирующийся на некоторой предметной области 29
Пример программы на DSL Set 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
Пример программы на DSL c = 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 -- SATA 27
Представление языка Семантическая модель 26
DSL и  eDSL Встроенный DSL ,[object Object]
Синтаксис ограничен синтаксисом хостового языка.
Тот же язык, на базе которого реализован.Внешний DSL ,[object Object]
Произвольный синтаксис.
Чужой по отношению к основному языку проекта.25
eDSLсредствами java и ruby computer()  .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 -- SATA 23
Как добавить сюда управляющие конструкции? 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 + A C B * 19
Дерево разбора выражения A + B * C ( ) + A ( ) B C * 18
Дерево разбора выражения A + B * C ( ) + A ( ) B C * 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)) 5 user> (not-nil nil (println result) (println "The result is nil!")) The result is nil! 08
В C# 4.0 мы добавили новую фантастическую возможность:бла-бла-бла! Программисты C# 07
Пример М.Фаулера SVCLFOWLER        10101MS0120050313 SVCLHOHPE         10201DX0320050315 SVCLTWO           x10301MRP220050329 USGE103   x50214..7050329 Как все это распарсить? 06
Разные типы – разные поля SVCLFOWLER   4-18: CustomerName   19-23: CustomerID   24-27 : CallTypeCode   28-35 : DateOfCallString USGE103   4-8 : CustomerID   9-22: CustomerName   30-30: Cycle   31-36: ReadDate 05
Расставим скобочки… (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

Mais conteúdo relacionado

Mais procurados

Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython Meetup
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsPlatonov Sergey
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.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 scienceOlga Kiseleva
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 

Mais procurados (20)

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

Semelhante a DSLs in Lisp and Clojure

Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech 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-DYNAYury 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_samsonovComputer Science Club
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кодаTatyanazaxarova
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаAndrey Karpov
 
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 PerformanceDevGAMM Conference
 
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...CEE-SEC(R)
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Yandex
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 

Semelhante a DSLs in Lisp and Clojure (20)

Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
User Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAUser Defined Materials in LS-DYNA
User Defined Materials in LS-DYNA
 
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
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Огранизация ввода и вывода данных
Огранизация ввода и вывода данныхОгранизация ввода и вывода данных
Огранизация ввода и вывода данных
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
DirectX12 Graphics and Performance
DirectX12 Graphics and PerformanceDirectX12 Graphics and Performance
DirectX12 Graphics and Performance
 
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
ФИЛП
ФИЛПФИЛП
ФИЛП
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
directx
directxdirectx
directx
 

Mais de 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#14Vasil 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#14Vasil Remeniuk
 
Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3Vasil Remeniuk
 
Testing in Scala by Adform research
Testing in Scala by Adform researchTesting in Scala by Adform research
Testing in Scala by Adform researchVasil Remeniuk
 
Spark Intro by Adform Research
Spark Intro by Adform ResearchSpark Intro by Adform Research
Spark Intro by Adform ResearchVasil Remeniuk
 
Types by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaTypes by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaVasil Remeniuk
 
Types by Adform Research
Types by Adform ResearchTypes by Adform Research
Types by Adform ResearchVasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovVasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovVasil Remeniuk
 
Spark by Adform Research, Paulius
Spark by Adform Research, PauliusSpark by Adform Research, Paulius
Spark by Adform Research, PauliusVasil 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 ResearchVasil Remeniuk
 
SBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaSBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaVasil Remeniuk
 
Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2Vasil Remeniuk
 
Testing in Scala. Adform Research
Testing in Scala. Adform ResearchTesting in Scala. Adform Research
Testing in Scala. Adform ResearchVasil Remeniuk
 
Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1Vasil Remeniuk
 
Cassandra + Spark + Elk
Cassandra + Spark + ElkCassandra + Spark + Elk
Cassandra + Spark + ElkVasil Remeniuk
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхVasil Remeniuk
 

Mais de Vasil Remeniuk (20)

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

DSLs in Lisp and Clojure

  • 1. Предметно-ориентированные языкии Lisp как средство ихпостроения Дмитрий Бушенко 30
  • 2. Что это такое DSL? Предметно-ориентированный язык (Domain Specific Language)– это язык программирования ограниченной выразительности, фокусирующийся на некоторой предметной области 29
  • 3. Пример программы на DSL Set 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. Пример программы на DSL c = 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 -- SATA 27
  • 6.
  • 8.
  • 10. Чужой по отношению к основному языку проекта.25
  • 11. eDSLсредствами java и ruby computer() .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 -- SATA 23
  • 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
  • 17. Дерево разбора выражения A + B * C ( ) + A ( ) B C * 18
  • 18. Дерево разбора выражения A + B * C ( ) + A ( ) B C * 17
  • 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)) 5 user> (not-nil nil (println result) (println "The result is nil!")) The result is nil! 08
  • 28. В C# 4.0 мы добавили новую фантастическую возможность:бла-бла-бла! Программисты C# 07
  • 29. Пример М.Фаулера SVCLFOWLER 10101MS0120050313 SVCLHOHPE 10201DX0320050315 SVCLTWO x10301MRP220050329 USGE103 x50214..7050329 Как все это распарсить? 06
  • 30. Разные типы – разные поля SVCLFOWLER 4-18: CustomerName 19-23: CustomerID 24-27 : CallTypeCode 28-35 : DateOfCallString USGE103 4-8 : CustomerID 9-22: CustomerName 30-30: Cycle 31-36: ReadDate 05
  • 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