Common Lisp में एक फंक्शन सिर्फ एक ही वैल्यू नहीं, बल्कि कई वैल्यू भी लौटा सकता है। उदाहरण के लिए floor किसी संख्या को शून्य की ओर नीचे की ओर पूर्णांकित करता है और दो वैल्यू लौटाता है: पहली वैल्यू पूर्णांकित संख्या होती है और दूसरी शेष।
(floor 3.5) ; => 3
; 0.5
(कई वैल्यू लौटने पर हम हर वैल्यू को आउटपुट की अलग लाइन पर दिखाएँगे।)
अगर आप चाहते हैं कि कोई फंक्शन कई वैल्यू लौटाए, तो इसके लिए values एक्सेसर इस्तेमाल कीजिए:
(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
; 2
; 3
अगर आपके पास लौटाने के लिए वैल्यू की एक ऐरे है, तो value-list इस्तेमाल कर सकते हैं:
(values-list '(a b c)) ; => a
; b
; c
अगर आपको सिर्फ पहली वैल्यू से मतलब है, तो कुछ खास करने की ज़रूरत नहीं है। भाषा खुद इसे संभाल लेती है:
(+ (values 1 2 3) (values 10 20 30)) ; => 11
लेकिन अगर आप उन बाकी वैल्यू तक पहुँचना चाहते हैं, तो इसके लिए कई फंक्शन इस्तेमाल करने पड़ते हैं।
दो मुख्य मैक्रो हैं multiple-value-list और multiple-value-bind।
इनका इस्तेमाल किसी ऐसी चीज़ को लपेटने के लिए किया जाता है जो कई वैल्यू लौटाती है, और ये सारी वैल्यू पकड़ लेते हैं।
पहला मैक्रो सारी वैल्यू की एक ऐरे बनाता है।
दूसरा मैक्रो आपको हर अलग वैल्यू के लिए वेरिएबल बाँधने देता है।
(multiple-value-list (values 1 2 3)) ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3)
(+ a b c)) ; => 6
ध्यान दीजिए कि वेरिएबल a, b और c सिर्फ multiple-values-bind के अंदर ही स्कोप में रहते हैं।
एक और काम का मैक्रो है nth-value। यह ऐरे के लिए nth जैसा ही है, क्योंकि यह कई वैल्यू के समूह में से "nth" एलिमेंट लौटाता है:
(nth-value 0 (values 1 2 3 )) ; => 1
(nth-value 1 (values 1 2 3 )) ; => 2
(nth-value 2 (values 1 2 3 )) ; => 3