70 likes | 212 Views
Curs 7 IA. Macro - uri în Lisp. Macro. Definiție: o funcție care definește o funcție Evaluare în 2 pași: macroexpandare: construirea macro-expresiei evaluarea ei Orice apel de macro trebuie făcut după definiția de macro Pot să existe definiții de macrouri în macrouri
E N D
Curs 7 IA Macro-uriîn Lisp
Macro • Definiție: o funcție care definește o funcție • Evaluare în 2 pași: • macroexpandare: construirea macro-expresiei • evaluarea ei • Orice apel de macro trebuie făcut după definiția de macro • Pot să existe definiții de macrouri în macrouri • O redefinire a unui macro implică necesitatea redefinirii funcțiilor/macrourilor care îl apelează
Definire-evaluare de macro Definire: (defmacro<nume-M> (<parametri->) <corp>) Apel: (<nume-M> <parametri-actuali>) Evaluare: (…context… (<nume-M> <parametri-A>)…) 1(…context… (… corpexpandat…)…) 2(…context… (… corpexpandat…)…)
Apel de macro în macro Definire: (defmacro macro1(…) (ctx1… (macro1 …)…ctx1)) Evaluare: (ctx2… (macro1 …)…ctx2) (ctx2… 1(ctx1… (macro1 …)…ctx1)…ctx2) (ctx2… 2(ctx-eval1… (macro1 …)…ctx-eval1)…ctx2) (ctx2… (ctx-eval1… 1(ctx1… (macro1 …)…ctx1) …ctx-eval1)…ctx2) (ctx2… (ctx-eval1… 2(ctx-eval1… (macro1 …)…ctx-eval1) …ctx-eval1)…ctx2) ș.a.m.d.
Interpretare vs compilare • Apeluri recursive de macro • Interpretare: Da • Compilare: Nu • efectuează toate macroexpandările la momentul compilării • dar evaluarea nu e lansată la compilare ci doar la apel un apel interior de macro nu poate fi expandat el însuși
Apostroful-stânga (backquote) • `(<template>) construiește o listă conform modelului indicat de <template> • La evaluare orice formă a listei va fi copiată, cu excepţia: • formelor prefixate de virgulă (,), care sunt evaluate; • unei liste prefixată de o secvenţă virgulă-at (,@), care provoacă inserarea elementelor listei.
Exemplu de evaluare (defmacro my-if (test da nu)`(if ,test ,da ,nu)) (my-if t (setq x 'da) (setq x 'nu)) 1[testt, da(setq x ‘da), nu(setq x ‘nu)] `(if ,test ,da ,nu)) (if t (setq x 'da) (setq x 'nu)) 2 (if t (setq x 'da) (setq x 'nu)) (setq x 'da) da [x da]