Содержание

Слайд 2

Что это такое DSL?

Предметно-ориентированный язык (Domain Specific Language) – это язык программирования

Что это такое DSL? Предметно-ориентированный язык (Domain Specific Language) – это язык
ограниченной выразительности, фокусирующийся на некоторой предметной области

29

Слайд 3

Пример программы на DSL

Set camera size: 400 by 300 pixels.
Set camera position:

Пример программы на DSL Set camera size: 400 by 300 pixels. Set
100, 100.
Move 200 cm right.
Move 100 inches up.
Move 250 pixels left.
Move 50 points down.
Take a picture.

28

Слайд 4

Пример программы на DSL

Computer:
processor:
cores -- 2
type -- i386
disk:

Пример программы на DSL Computer: processor: cores -- 2 type -- i386
size -- 75
speed -- 7200
interface -- SATA

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);

27

Слайд 5

Семантическая модель

Представление языка

26

Семантическая модель Представление языка 26

Слайд 6

DSL и eDSL

Внешний DSL
Реализуется средствами создания ЯП.
Произвольный синтаксис.
Чужой по отношению к основному

DSL и eDSL Внешний DSL Реализуется средствами создания ЯП. Произвольный синтаксис. Чужой
языку проекта.

Встроенный DSL
Реализуется на базе основного языка.
Синтаксис ограничен синтаксисом хостового языка.
Тот же язык, на базе которого реализован.

25

Слайд 7

eDSL средствами java и ruby

computer()
.processor()
.cores(2)
.speed(2500)
.i386()
.disk()
.size(150)
.disk()

eDSL средствами java и ruby computer() .processor() .cores(2) .speed(2500) .i386() .disk() .size(150)
.size(75)
.speed(7200)
.sata()
.end();

computer(
processor(:cores => 2,
:type => :i386),
disk(:size => 150),
disk(:size => 75,
:speed => 7200,
:interface => :sata))

24

Слайд 8

Другой пример DSL на ruby

[:computer,
[:processor,
[:cores, 2],
[:type, :i386]],
[:disk,
[:size,

Другой пример DSL на ruby [:computer, [:processor, [:cores, 2], [:type, :i386]], [:disk,
75],
[:speed, 7200],
[:interface, :sata]]]

Computer:
processor:
cores -- 2
type -- i386
disk:
size -- 75
speed -- 7200
interface -- SATA

23

Слайд 9

Как добавить сюда управляющие конструкции?

computer()
. . .
.disk()
.size(75)
.speed(7200)
.sata()
.end();

[:computer,
.

Как добавить сюда управляющие конструкции? computer() . . . .disk() .size(75) .speed(7200)
. .
[:disk,
[:size, 75],
[:speed, 7200],
[:interface, :sata]]]

22

Слайд 10

Как добавить сюда управляющие конструкции?

computer()
. . .
.times(2)
.disk()
.size(75)
.speed(7200)
.sata()
.end_times()
.end();

[:computer,
.

Как добавить сюда управляющие конструкции? computer() . . . .times(2) .disk() .size(75)
. .
2.times do |i|
[:disk,
[:size, 75],
[:speed, 7200],
[:interface, :sata]]
end]

21

Слайд 11

Мы, программисты, представляем себя волшебниками, повелителями кода

20

Мы, программисты, представляем себя волшебниками, повелителями кода 20

Слайд 12

A + B * C

A

+

*

B

C

Дерево разбора выражения

19

A + B * C A + * B C Дерево разбора выражения 19

Слайд 13

A + B * C

A

+

*

B

C

Дерево разбора выражения

(

(

)

)

18

A + B * C A + * B C Дерево разбора

Слайд 14

A + B * C

A

+

*

B

C

Дерево разбора выражения

(

(

)

)

17

A + B * C A + * B C Дерево разбора

Слайд 15

Computer:
processor:
cores -- 2
type -- i386

(Computer
(processor
(cores 2)

Computer: processor: cores -- 2 type -- i386 (Computer (processor (cores 2)
(type i386)))

c = new Computer();
P = new Processor();
p.setCores(2);
p.setType(ProcTypes.i386);
c.setProcessor(p);

16

Слайд 17

Unless == not if

(unless (= a b)
(do something))
(if (not (=

Unless == not if (unless (= a b) (do something)) (if (not
a b)
(do something))

Шаблон: unless
Параметры: cond, body
(if (not (cond)
body)

14

Слайд 18

Unless == not if

(defmacro unless
[cond body]
`(if (not ~cond)
~body))

Шаблон: unless
Параметры: cond,

Unless == not if (defmacro unless [cond body] `(if (not ~cond) ~body))
body
(if (not (cond)
body)

13

Слайд 19

Порядок выполнения функций и макросов

12

Компиляция
Макросы

Исполнение
Функции

Порядок выполнения функций и макросов 12 Компиляция Макросы Исполнение Функции

Слайд 20

Инфиксная нотация

11

(defmacro infix [arg1 op arg2]
(list op arg1 arg2))
(infix 2 +

Инфиксная нотация 11 (defmacro infix [arg1 op arg2] (list op arg1 arg2))
5)
7

Слайд 21

(for (i = 0, i < 3, i ++) (println i))

(defmacro for

(for (i = 0, i (defmacro for [args & body] (let [a1
[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

Слайд 22

I’ll be back!

09

I’ll be back! 09

Слайд 23

Анафорический макрос

(defmacro not-nil
([expr then & else]
(let [result (symbol "result")]
`(let

Анафорический макрос (defmacro not-nil ([expr then & else] (let [result (symbol "result")]
[~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

Слайд 24

В C# 4.0 мы добавили новую фантастическую возможность: бла-бла-бла!

Программисты C#

07

В C# 4.0 мы добавили новую фантастическую возможность: бла-бла-бла! Программисты C# 07

Слайд 25

Пример М.Фаулера

SVCLFOWLER 10101MS0120050313
SVCLHOHPE 10201DX0320050315
SVCLTWO x10301MRP220050329
USGE103 x50214..7050329
Как все это распарсить?

06

Пример М.Фаулера SVCLFOWLER 10101MS0120050313 SVCLHOHPE 10201DX0320050315 SVCLTWO x10301MRP220050329 USGE103 x50214..7050329 Как все это распарсить? 06

Слайд 26

Разные типы – разные поля

SVCLFOWLER
4-18: CustomerName
19-23: CustomerID
24-27 : CallTypeCode

Разные типы – разные поля SVCLFOWLER 4-18: CustomerName 19-23: CustomerID 24-27 :
28-35 : DateOfCallString
USGE103
4-8 : CustomerID
9-22: CustomerName
30-30: Cycle
31-36: ReadDate

05

Слайд 27

Расставим скобочки…

(def-reader SVCLFOWLER
[4 18 CustomerName]
[19 23 CustomerID]
[24 27 CallTypeCode]

Расставим скобочки… (def-reader SVCLFOWLER [4 18 CustomerName] [19 23 CustomerID] [24 27
[28 35 DateOfCallString])
(def-reader USGE103
[4 8 CustomerID]
[9 22 CustomerName]
[30 30 Cycle]
[31 36 ReadDate])

04

Слайд 28

(defmacro def-reader [class-name & fields]
(let [method-names (map #(vector (symbol (nth %

(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

Слайд 29

(def-reader fowler.core.ThirdClass
[2 7 field1]
[9 15 field2]
[17 20 field3])

02

(def-reader fowler.core.ThirdClass [2 7 field1] [9 15 field2] [17 20 field3]) 02

Слайд 30

Почувствуй силу!..

01

Почувствуй силу!.. 01
Имя файла: 30.pptx
Количество просмотров: 187
Количество скачиваний: 0