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-এর মতো, অর্থাৎ একগুচ্ছ একাধিক মানের মধ্যে থেকে "nতম" এলিমেন্টটি রিটার্ন করে:
(nth-value 0 (values 1 2 3 )) ; => 1
(nth-value 1 (values 1 2 3 )) ; => 2
(nth-value 2 (values 1 2 3 )) ; => 3