変数が無名関数かどうかは funcall が invalid-function エラーを発生するかで確認できそう。
(defun lambda-p (var)
(condition-case nil
(progn
(funcall var)
t)
(invalid-function nil)))
(setq str "hoge")
(lambda-p str) ; => nil
(setq lmd (lambda () (format "%s" "huga")))
(lambda-p lmd) ; => t
Elisp の変数が「文字列そのもの」と「文字列を返す関数」のどちらかに関わらず、その変数を文字列として扱いたい場合はこんな感じ。
(defun lambda-to-str (str)
(condition-case nil
(funcall str)
(invalid-function str)))
(setq str "hoge")
(lambda-to-str str) ; => "hoge"
(setq lmd (lambda () (format "%s" "huga")))
(lambda-to-str lmd) ; => "huga"