'

30

Понравилась презентация – покажи это...





Слайд 0

Предметно-ориентированные языки и Lisp как средство их построения Дмитрий Бушенко 30


Слайд 1

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


Слайд 2

Пример программы на 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


Слайд 3

Пример программы на DSL Computer: processor: cores -- 2 type -- i386 disk: 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


Слайд 4

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


Слайд 5

DSL и eDSL Внешний DSL Реализуется средствами создания ЯП. Произвольный синтаксис. Чужой по отношению к основному языку проекта. Встроенный DSL Реализуется на базе основного языка. Синтаксис ограничен синтаксисом хостового языка. Тот же язык, на базе которого реализован. 25


Слайд 6

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


Слайд 7

Другой пример 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


Слайд 8

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


Слайд 9

Как добавить сюда управляющие конструкции? 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


Слайд 10

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


Слайд 11

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


Слайд 12

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


Слайд 13

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


Слайд 14

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


Слайд 15

15


Слайд 16

Unless == not if (unless (= a b) (do something)) (if (not (= a b) (do something)) Шаблон: unless Параметры: cond, body (if (not (cond) body) 14


Слайд 17

Unless == not if (defmacro unless [cond body] `(if (not ~cond) ~body)) Шаблон: unless Параметры: cond, body (if (not (cond) body) 13


Слайд 18

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


Слайд 19

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


Слайд 20

(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


Слайд 21

I’ll be back! 09


Слайд 22

Анафорический макрос (defmacro not-nil ([expr then & 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


Слайд 23

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


Слайд 24

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


Слайд 25

Разные типы – разные поля 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


Слайд 26

Расставим скобочки… (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


Слайд 27

(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


Слайд 28

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


Слайд 29

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


Слайд 30

Вопросы 00


×

HTML:





Ссылка: