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

Презентация:



Advertisements
Похожие презентации
Информатика ЕГЭ Уровень А5. Вариант 1 Определите значения переменных a, b, c после выполнения следующего фрагмента программы: a:=5; b:=1; a:=a+b; if a>10.
Advertisements


ИД «Первое сентября». Журнал «Физика» 2/ Роза ветров 9 ИД «Первое сентября». Журнал «Физика» 2/2014.

Типовые расчёты Растворы
Управляемая кодогенерация Денис С. Мигинский. Основные режимы работы среды исполнения Lisp Интерпретация – основной режим Компиляция Исполнение скомпилированного.
Маршрутный лист «Числа до 100» ? ? ?
Красноярск Владивосток Вологда Спутник TERRA, 1000 м день 1. 04:30-05: :00-07:00 ночь 1. 15:30-16: :00-18:00 день 1. 04:30-05: :00-07:00.


Урок повторения по теме: «Сила». Задание 1 Задание 2.
НА ТЕМУ СОДЕРЖАНИЕ ВИТАМИНОВ В ПРОДУКТАХ Выполнили ученицы 8 А класса : Шикунова Анастасия Ильина Алена.
Тренировочное тестирование-2008 Ответы к заданиям КИМ Часть I.
Michael Jackson
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
Ребусы Свириденковой Лизы Ученицы 6 класса «А». 10.
Школьная форма Презентация для родительского собрания.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Test 6 Вопрос 1. Как можно уничтожить объект в Java? a)присвоить null всем ссылкам на объект b)вызвать Runtime.getRuntime().gc() c)вызвать метод finalize()
Презентация к уроку по математике (1 класс) по теме: Наглядность для 1-2 классов по математике "Числовы домики" (состав чисел). Авторская разработка
Транксрипт:

Предметно-ориентированные языки и 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 Computer: processor: cores -- 2 type -- i386 disk: size speed 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

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

DSL и eDSL Внешний DSL Реализуется средствами создания ЯП. Произвольный синтаксис. Чужой по отношению к основному языку проекта. Встроенный DSL Реализуется на базе основного языка. Синтаксис ограничен синтаксисом хостового языка. Тот же язык, на базе которого реализован. 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 speed 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 + * B C Дерево разбора выражения 19

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

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

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

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 (defmacro unless [cond body] `(if (not ~cond) ~body)) Шаблон: unless Параметры: cond, body (if (not (cond) body) 13

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

Инфиксная нотация 11 (defmacro infix [arg1 op arg2] (list op arg1 arg2)) (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? #{'> ' = ', >=")) (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 (recur (~op ~a1))))))))) 10

Ill be back! 09

Анафорический макрос (defmacro not-nil ([expr then & else] (let [result (symbol "result")] `(let [~result ~expr] (if (not (nil? ~result)) ~then (do 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 10101MS SVCLHOHPE 10201DX SVCLTWO x10301MRP USGE103 x Как все это распарсить? 06

Разные типы – разные поля SVCLFOWLER 4-18: CustomerName 19-23: CustomerID : CallTypeCode : DateOfCallString USGE : 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

(defmacro def-reader [class-name & fields] (let [method-names (map #(vector (symbol (nth % 2)) '[] 'String) fields) methods `( #(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 [~(symbol "setData") [String] String]]) (defn ~(symbol (str prefix "init")) [] [[] (ref {})]) (defn ~(symbol (str prefix "setData")) [this# data#] (dosync (alter (.state this#) assoc :data data#)) "")))) 03

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

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

Вопросы 00