Jinymi slovy, nejaka funkce, ktera transformuje reprezentaci programu predtim nez se prevese na AST nebo na target. Zkratka nejaky predchroupani at uz jakyhokoliv typu.
No ono to právě není jedno, jakýho typu. Buď pracuju s textem, aniž bych znal jeho význam, nebo pracuju s AST. To je úplně něco jinýho a má to výrazně jiné možnosti.
Elixir ma myslim prave jednoduchou a homoikonickou reprezentaci AST.
No asi je to otázka, čemu chceš říkat "jednoduchá". Každopádně kdybys měl napsat AST tak, aby ti vygenerovalo nějaký kód, tak bys z toho moc nadšenej nebyl, je to trochu opruz. Jak jsem ale řekl, v drtivé většině případů to nepotřebuješ dělat.
Vsemozny konstrukce jako classy jsou implementovany prave pres manipulaci AST, pokud si vzpominam.
Elixir žádné classy nemá a makra se nepoužívají zas tak často (autor jazyka správně tvrdí, že zlaté pravidlo je "dokud to jde udělat funkcí, udělejte to funkcí"). Takže to si spíš asi s něčím pleteš.
Pokud do quotace muzes vlozit parametr, pak se podle me jedna o tzv. quasiquotaci.
abcd - text
"abcd" - quotovany text, neboli string
f"abcd {n}" - quasiquotovany string, neboli string interpolation
Tohle vůbec nechápu. S interpolací to, o čem jsem mluvil, nemá nic společnýho.
quote je taková trochu speciální funkce, která:
1. se spouští při překladu
2. vložíš do ní normální blok kódu a ona ti vrátí příslušný AST
3. tj. když do toho kódu vpašuješ parametr, quote ti ho vpašuje do toho AST, aniž bys AST musel "ručně" upravovat (provádět operace přímo nad daty AST)
$ iex
Erlang/OTP 21 [erts-10.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> quote do if f(1) do 1 else 2 end end
{:if, [context: Elixir, import: Kernel], [{:f, [], [1]}, [do: 1, else: 2]]}
iex(2)> f(1)
** (CompileError) iex:2: undefined function f/1
- na tomhle vidíš:
1. quote skutečně "cituje" svůj parametr (převádí ho na AST) - používám tam fci f/1, která není definovaná a ničemu to nevadí, protože se v tuhle chvíli nevolá
2. to elixirovské AST je fakt celkem komplikované (a tohle je ještě jednoduchý příklad, mohl bych ukázat složitější), není to jako v Lispu