در 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