Треки
/
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 вправу, щоб практикувати концепцію Множинні значення