pranx

Lisp

Sep 25th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.21 KB | None | 0 0
  1. Implement an enum facility as a Common Lisp macro, defenum, to add functionality similar to Java's enum types.
  2.  
  3. Specfically, the following shows the code expansion of the defenum macro with various arguments. Your defenum must macroexpand to exactly the same code expansion. For this assignment, you are not allowed to use any iteration constructs in your code.
  4.  
  5. (macroexpand '(defenum (day number)
  6. (Sunday 0)
  7. (Monday 1)
  8. (Tuesday 2)
  9. (Wednesday 3)
  10. (Thursday 4)
  11. (Friday 5)
  12. (Saturday 6)))
  13.  
  14. (PROGN
  15. (DEFCONSTANT DAY->NUMBER->SUNDAY 0)
  16. (DEFCONSTANT DAY->NUMBER->MONDAY 1)
  17. (DEFCONSTANT DAY->NUMBER->TUESDAY 2)
  18. (DEFCONSTANT DAY->NUMBER->WEDNESDAY 3)
  19. (DEFCONSTANT DAY->NUMBER->THURSDAY 4)
  20. (DEFCONSTANT DAY->NUMBER->FRIDAY 5)
  21. (DEFCONSTANT DAY->NUMBER->SATURDAY 6)
  22. (LET ((DAY->NUMBER '((0 . SUNDAY) (1 . MONDAY) (2 . TUESDAY) (3 . WEDNESDAY)
  23. (4 . THURSDAY) (5 . FRIDAY) (6 . SATURDAY))))
  24. (DEFUN DAY->NUMBER (NUMBER) (CDR (ASSOC NUMBER DAY->NUMBER)))))
  25.  
  26.  
  27. (macroexpand '(defenum (planet mass radius)
  28. (MERCURY 3.303e+23 2.4397e6)
  29. (VENUS 4.869e+24 6.0518e6)
  30. (EARTH 5.976e+24 6.37814e6)
  31. (MARS 6.421e+23 3.3972e6)
  32. (JUPITER 1.9e+27 7.1492e7)
  33. (SATURN 5.688e+26 6.0268e7)
  34. (URANUS 8.686e+25 2.5559e7)
  35. (NEPTUNE 1.024e+26 2.4746e7)))
  36.  
  37. (PROGN
  38. (DEFCONSTANT PLANET->MASS->MERCURY 3.303e+23)
  39. (DEFCONSTANT PLANET->RADIUS->MERCURY 2439700.0)
  40. (DEFCONSTANT PLANET->MASS->VENUS 4.869e+24)
  41. (DEFCONSTANT PLANET->RADIUS->VENUS 6051800.0)
  42. (DEFCONSTANT PLANET->MASS->EARTH 5.976e+24)
  43. (DEFCONSTANT PLANET->RADIUS->EARTH 6378140.0)
  44. (DEFCONSTANT PLANET->MASS->MARS 6.421e+23)
  45. (DEFCONSTANT PLANET->RADIUS->MARS 3397200.0)
  46. (DEFCONSTANT PLANET->MASS->JUPITER 1.9e+27)
  47. (DEFCONSTANT PLANET->RADIUS->JUPITER 7.1492e+7)
  48. (DEFCONSTANT PLANET->MASS->SATURN 5.688e+26)
  49. (DEFCONSTANT PLANET->RADIUS->SATURN 6.0268e+7)
  50. (DEFCONSTANT PLANET->MASS->URANUS 8.686e+25)
  51. (DEFCONSTANT PLANET->RADIUS->URANUS 2.5559e+7)
  52. (DEFCONSTANT PLANET->MASS->NEPTUNE 1.024e+26)
  53. (DEFCONSTANT PLANET->RADIUS->NEPTUNE 2.4746e+7)
  54. (LET ((PLANET->MASS '((3.303e+23 . MERCURY)
  55. (4.869e+24 . VENUS)
  56. (5.976e+24 . EARTH) (6.421e+23 . MARS)
  57. (1.9e+27 . JUPITER)
  58. (5.688e+26 . SATURN)
  59. (8.686e+25 . URANUS)
  60. (1.024e+26 . NEPTUNE))))
  61. (DEFUN PLANET->MASS (MASS) (CDR (ASSOC MASS PLANET->MASS))))
  62. (LET ((PLANET->RADIUS '((2439700.0 . MERCURY)
  63. (6051800.0 . VENUS) (6378140.0 . EARTH)
  64. (3397200.0 . MARS) (7.1492e+7 . JUPITER)
  65. (6.0268e+7 . SATURN)
  66. (2.5559e+7 . URANUS)
  67. (2.4746e+7 . NEPTUNE))))
  68. (DEFUN PLANET->RADIUS (RADIUS) (CDR (ASSOC RADIUS PLANET->RADIUS)))))
Add Comment
Please, Sign In to add comment