The following is the first thing that popped into my head (a simple tree walk and replace of symbol names).
It should be noted that the question was about importing symbols and the following does not do that. It simply adds the ugly package-name:: part for you.
(defmacro with-symbols-from ((package-name &rest symbols) &body body)
(let ((f-symbols (loop :for s :in symbols :collect
(intern (symbol-name s) package-name))))
`(progn
,@(loop :for symbol :in symbols :for f-symbol :in f-symbols
:with body = body
:do (setf body (subst f-symbol symbol body :test #'eq))
:finally (return body)))))
Usage example:
CL-USER> (with-symbols-from (:cffi foreign-alloc mem-aref)
(let ((a (foreign-alloc :int)))
(setf (mem-aref a :int) 1)
(mem-aref a :int)))
1
The above expanded to:
(PROGN
(LET ((A (CFFI:FOREIGN-ALLOC :INT)))
(SETF (CFFI:MEM-AREF A :INT) 1)
(CFFI:MEM-AREF A :INT)))