| (in-package :clache) | |
| (use-syntax :annot) | |
| (defun symbol-fqn (symbol) | |
| "Return a fully qualified name of SYMBOL in string. For | |
| example, (symbol-fqn 'if) will return \"COMMON-LISP:IF\"." | |
| (declare (symbol symbol)) | |
| (format nil "~A:~A" | |
| (package-name (symbol-package symbol)) | |
| (symbol-name symbol))) | |
| (defun object-to-string (object) | |
| "Convert OBJECT into string by using PRINC-TO-STRING if OBJECT is | |
| not a symbol, or by using SYMBOL-FQN if OBJECT is a symbol." | |
| (if (symbolp object) | |
| (symbol-fqn object) | |
| (princ-to-string object))) | |
| (defun md5-hex-string (string) | |
| "Return a MD5 digest of STRING in hex string." | |
| (let* ((octets (babel:string-to-octets string)) | |
| (digest (ironclad:digest-sequence 'ironclad:md5 octets)) | |
| (hex-string (format nil "~{~2,'0X~}" (coerce digest 'list)))) | |
| (string-downcase hex-string))) | |