This is the module I wrote for my own .emacs to solve this problem. My basic approach seems to be similar in intent to Maxim Kim's solution (rotating through a list of themes), but I think mine is more modular and may therefore be more accessible to an outsider. On the other hand, I don't have any of Kim's persistence features.
Here is the relevant code, leaving off variable declarations and package commentary:
(defun multitheme--enable (theme)
"As `enable-theme', but load the theme if necessary.
(if (custom-theme-p theme)
(defun multitheme-cycle ()
"Cycle between the themes in `multitheme-base-theme-list'.
If none of these themes is currently active, instead enable the
first element of `multitheme-base-theme-list'.
Also re-enable `multitheme-overtheme' so it remains \"on top\" of
the base theme.
If a theme to be enabled is not yet defined, attempt to load it
first (using `load-theme'). Respect `custom-safe-themes'.
After all theme changes have been made, run
(when (require 'validate nil :noerror)
(let ((themes (-drop-while
(lambda (thm) (not (custom-theme-enabled-p thm)))
;; Cycle base theme
(if (null themes)
(multitheme--enable (car multitheme-base-theme-list))
(disable-theme (car themes))
(multitheme--enable (or (cadr themes)
;; Reassert overtheme
;; Run hooks