Валентин Михов
#HSLIDE
#HSLIDE
#HSLIDE
#HSLIDE
Мета програмиране е код, който пише код
#HSLIDE
#HSLIDE
#HSLIDE
html do
head do
title do
text "Hello To Our HTML DSL"
end
end
body do
h1 class: "title" do
text "Introduction to metaprogramming"
end
end
end#HSLIDE
tag :html do
tag :head do
tag :title do
text "Hello To Our HTML DSL"
end
end
end#HSLIDE
from o in Order,
where: o.created_at > "2017-03-03"
join: i in OrderItems, on: i.order_id == o.id=>
SELECT o.*
FROM orders o
JOIN order_items i ON i.order_id = o.id
WHERE o.created_at > '2017-03-03'#HSLIDE
#HSLIDE
def orders(from_date) do
from o in Order,
where: o.created_at > ^from_date
join: i in OrderItems, on: i.order_id == o.id
end
def user_orders(from_date, user_id) do
from o in orders(from_date),
where: o.user_id == ^user_id
end#HSLIDE
#HSLIDE
- Генерира се като междинен код по време на компилация
- Имаме достъп до него и можем да го променяме чрез макроси
- Можем да генерираме програмно AST и да го вмъкваме в модули
- В elixir, AST много прилича на Lisp
#HSLIDE
iex> quote do: 1 + 2
{
:+,
[context: Elixir, import: Kernel],
[1, 2]
}
iex> quote do: div(10, 2)
{
:div,
[context: Elixir, import: Kernel],
[10, 2]
}#HSLIDE
iex> quote do: 1 + 2 * 3
{
:+,
[context: Elixir, import: Kernel],
[
1,
{
:*,
[context: Elixir, import: Kernel],
[2, 3]
}
]
}#HSLIDE
- Изпълняват се по време на компилация
- Приемат за аргументи AST
- Връщат AST като резултат
#HSLIDE
#HSLIDE
quoteгенерира ASTunquoteвмъква стойността на аргументите в AST-тоunquoteе един вид "интерполация"unquoteни е нужен за да можем да вмъкваме стойности в генерирания код
#HSLIDE
#HSLIDE
iex> value = 12
12
iex> quote do
...> 1 + 2 * value
...> end
{
:+, _,
[
1,
{
:*, _,
[
2,
{:value, [], Elixir}
]
}
]
}
#HSLIDE
iex> value = 12
12
iex> quote do
...> 1 + 2 * unquote(value)
...> end
{
:+, _,
[
1,
{
:*, _,
[2, 12]
}
]
}
#HSLIDE
-
Компилатора изпълняава макроса по време на компилация
-
Генерираното AST съдържа ли макроси?
2.1. ДА -> Макросите се изпълняват и отиваме на стъпка 2.
2.2. НЕ -> Край
#HSLIDE
#HSLIDE
#HSLIDE
#HSLIDE
#HSLIDE
- Макросите имат много добре дефиниран scope
- По подразбиране не можем да променяме scope-а извън макроса
- Можем да използваме
var!за да променяме scope-а отвън
#HSLIDE
#HSLIDE







