(defun generate-keys-arg (list &optional (default-val t)) "Takes in a list lie '(home login users register) and outputs '(&key (home t) (login t) (users t) (register t))" (append (list '&key) (mapcar (lambda (entry) (list entry default-val)) list))) (defun symbol-to-downcase-str (symbol) "Returns a downcase string of symbol eg home becomes 'home'" (string-downcase (symbol-name symbol))) (defun append-n-to-symbol (n symbol) "appends n to a eg (append-n-to-symbol '/' 'home) '/home'" (let ((name (symbol-to-downcase-str symbol))) (concatenate 'string n name))) (defun gen-url-from-symbol (symbol) "concatenates '/' to the start of symbol and returns as a string" (append-n-to-symbol "/" symbol)) (defun capitalize-nth-char (n string) "Capitalizes nth character in string eg (capitalize-nth-char 2 'abcdef') -> 'aBcdef'" (string-upcase string :start (1- n) :end n)) (defun capitalize-1st-char (string) (capitalize-nth-char 1 string)) ;;;;macro am try to write that when evaluated with the args '(home login users register) would gen a function like the one at the bottom (defmacro generate-navigation-bar (list-of-entries) `(defun navigation-bar `(generate-keys-arg ,list-of-entries) (flet ,@(mapcar (lambda (entry) `(entry () (when ,entry (with-html (:li :class "navigation-item" :href ,(gen-url-from-symbol entry) :data-popover "" ,(capitalize-1st-char (symbol-to-downcase-str entry))))))) `,list-of-entries))) `(with-html (:nav :class "navigation" (:section :class "container" (:a :class "navigation-title" :href "/" (:img :class "img" :src ,(get-standard-image) :height "15") (:h1 :class "title" ,(get-title))) (:ul :class "navigation-list float-right" ,(mapcar (lambda (entry) (list entry)) list-of-entries)))))) (defun navigation-for-webpages (&key (home-nav t) (login-nav t) (users-nav t) (register-nav t)) (flet ((home () (when home-nav (with-html (:li :class "navigation-item" (:a :class "navigation-link" :href "/" :data-popover "" "Home"))))) (login () (when login-nav (with-html (:li :class "navigation-item" (:a :class "navigation-link" :href "/login" :data-popover "" "Login"))))) (users () (when users-nav (with-html (:li :class "navigation-item" (:a :class "navigation-link" :href "/users" :data-popover "" "Users"))))) (register () (when register-nav (with-html (:li :class "navigation-item" (:a :class "navigation-link" :href "/register" :data-popover "" "Register")))))) (with-html (:nav :class "navigation" (:section :class "container" (:a :class "navigation-title" :href "/" (:img :class "img" :src (get-standard-image) :height "15") (:h1 :class "title" (get-title))) (:ul :class "navigation-list float-right" (home) (login) (users) (register))))))) ;;;;edit (defun generate-navigation-html (entry) `(,entry nil (when ,entry (with-html (:li :class "navigation-item" :href ,(gen-url-from-symbol entry) :data-popover "" ,(capitalize-1st-char (symbol-to-downcase-str entry))))))) (defun generate-navigations-html (entries) (mapcar #'generate-navigation-html entries)) (defmacro generate-navigation-bar (list-of-entries) `(defun navigation-bar `(generate-keys-arg ,list-of-entries) (flet ,(generate-navigations-html list-of-entries) (with-html (:nav :class "navigation" (:section :class "container" (:a :class "navigation-title" :href "/" (:img :class "img" :src ,(get-standard-image) :height "15") (:h1 :class "title" ,(get-title))) ,(append `(:ul :class "navigation-list float-right" ,@(mapcar (lambda (entry) (list entry)) list-of-entries)))))))))