مسیر
/
Common Lisp
Common Lisp
/
برنامه‌ی درسی
/
مقادیر چندگانه
مق

مقادیر چندگانه در Common Lisp

3 تمرین

درباره‌ی مقادیر چندگانه

در 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
ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود

مقادیر چندگانه را یاد بگیرید

تمرین کردن قفل شده است

برای تمرین مقادیر چندگانه قفل 1 تمرین دیگر را باز کنید