Guest User

Untitled

a guest
Jul 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.46 KB | None | 0 0
  1. ;;1.45 Definir una macro MI-DO que tenga exactamente la misma funcionalidad que la macro DO,
  2. ;;pero que además de devolver el valor correspondiente cuando se cumpla la condición de finalización,
  3. ;;devuelva un segundo valor que indique el número de iteraciones que se han realizado. No se deben
  4. ;;utilizar las primitivas DO, DO*, DOLIST, DOTIMES.
  5.  
  6. (defmacro iterar (steps final &rest body)
  7. `(labels ((main ,(mapcar #'car steps)
  8. (if ,(car final) ,(cadr final)
  9. (progn ,@body
  10. (main ,@(apply #'append
  11. (mapcar #'last steps)))))))
  12. (main ,@(mapcar #'cadr steps))))
  13.  
  14. (macroexpand-1 '(do ((total x (1+ total))
  15. (cont y (1- cont)))
  16. ((zerop cont) total) (print cont)))
  17.  
  18. ;;(BLOCK NIL
  19. ;; (LET ((TOTAL X) (CONT Y))
  20. ;; (TAGBODY #:LOOP-3594 (IF (ZEROP CONT) (GO #:END-3595))
  21. ;; (PRINT CONT) (PSETQ TOTAL (1+ TOTAL) CONT (1- CONT))
  22. ;; (GO #:LOOP-3594) #:END-3595 (RETURN-FROM NIL (PROGN TOTAL)))))
  23.  
  24. (macroexpand-1 '(iterar ((total x (1+ total))
  25. (cont y (1- cont)))
  26. ((zerop cont) total) (print cont)))
  27.  
  28. ;; (LABELS ((MAIN (TOTAL CONT)
  29. ;; (IF (ZEROP CONT) TOTAL
  30. ;; (PROGN (PRINT CONT) (MAIN (1+ TOTAL) (1- CONT))))))
  31. ;; (MAIN X Y))
  32.  
  33. (defmacro iterar.con.contador (steps final &rest body)
  34. (let ((c (gensym "counter")))
  35. `(iterar ,(cons `(,c 0 (1+ ,c)) steps)
  36. (,(car final) (values ,(cadr final) ,c))
  37. ,@body)))
Add Comment
Please, Sign In to add comment