Differences
This shows you the differences between two versions of the page.
— |
jui:cviko7 [2011/08/16 22:33] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== JUI - 7. cviceni ====== | ||
+ | <code lisp> | ||
+ | ;;makra | ||
+ | ; jmeno, parametry -> dosadi parametry | ||
+ | ; makro vypocita vysledek, ktery je kod (vyraz) | ||
+ | ; vysledek se vrati a potom se spusti a vysledek spusteni je celkovy vysledek | ||
+ | |||
+ | (defmacro set-3 (x) | ||
+ | (list 'setf x 3)) | ||
+ | |||
+ | ;;alternativa s `, kde se nevyhodnocuje vyraz, ale dela se z toho ten seznam | ||
+ | |||
+ | (defmacro set-3 (x) | ||
+ | `(setf ,x 3)) | ||
+ | ;;` zabrani vypoctu, "," zase vyhodnoti a dosadi\ | ||
+ | ; @ expanduje seznam na jednotlive prvky | ||
+ | |||
+ | (set-3 3) | ||
+ | |||
+ | ;definujte makro, ktere zjisti vypis expandovaneho vyrazu, tj. makro vypis | ||
+ | ; (vypis vyraz) -> (pprint (macroexpand-1 'vyraz)) | ||
+ | |||
+ | (defmacro vypis (vyraz) | ||
+ | `(pprint (macroexpand-1 ',vyraz))) | ||
+ | |||
+ | (vypis (1 2 3)) | ||
+ | |||
+ | ;definujte makro n-krat, ktere n-krat provede sve telo | ||
+ | napr (nkrat 5 (princ "x")) | ||
+ | |||
+ | (dotimes (a 5) (princ "x")) | ||
+ | |||
+ | (defmacro nkrat (n &rest akce) | ||
+ | (let ((x (gensym))) | ||
+ | `(dotimes (,x ,n) ,@akce)) | ||
+ | ) | ||
+ | |||
+ | |||
+ | (nkrat 5 (princ "x") (princ "a")) | ||
+ | |||
+ | ;vytvorte makro pro novy prikaz for, kde parametry budou (iter promenna, poc hodnota, koncova hodnota, telo) | ||
+ | (for (x 2 6) (prin1 x)) | ||
+ | |||
+ | (defmacro for ((var start stop) &rest telo) | ||
+ | `(do ( | ||
+ | (,var ,start (1+ ,var)) | ||
+ | ) | ||
+ | ((> ,var , stop)) | ||
+ | ,@telo)) | ||
+ | (for (x 1 2) (prin1 x)) | ||
+ | </code> | ||