Деструктуризация с помощью «let»

Самой функции let был посвящен отдельный пост с подробным описанием, в рамках “лексического анализа”, но без примеров. Но в связи с тем, что есть отдельная статья, хоть и не авторская, есть повод привести ряд прецедентов … в контексте деструктуризации.
В дополнение к обычным вызовам 'let' с одной парой символ/значение
(let A 1
.. )
или списку пар символ/значение
(let (A 1 B 2 C 3)
.. )
также поддерживает вложенные структуры символов:
(let ((A . Z) (1 2 3 4))
(list A Z) )
-> (1 (2 3 4))
(let (X 3 ((A . B) (C D) E . F) '((1 2 3) (4 5 6) 7 8 9) Y 4)
(list X A B C D E F Y) )
-> (3 1 (2 3) 4 5 7 (8 9) 4)
(let (((A . B) (C) . D) '((1 2 3) (4 5 6) 7 8 9))
(list A B C D) )
-> (1 (2 3) 4 (7 8 9))
Речь идет о pil64, но судя по всему это справделиво и для pil21 …
Аналогичной цели можно достичь с помощью 'use' и 'match'
(use (@A @B @C @D)
(and
(match '((@A . @B) (@C . @) . @D) '((1 2 3) (4 5 6) 7 8 9))
(list (car @A) @B (car @C) @D) ) )
-> (1 (2 3) 4 (7 8 9))
но это довольно утомительно и некрасиво.
Вы можете использовать 'NIL' в качестве заполнителя, чтобы игнорировать части шаблона:
(let (((A . NIL) NIL NIL D) '((1 2 3) (4 5 6) 7 8 9))
(trail T) )
-> (A 1 D 8)
«NIL» не привязан к совпадающим значениям и, таким образом, экономит место в стеке.
Subscribe to my newsletter
Read articles from Sergey Shishkin directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Sergey Shishkin
Sergey Shishkin
Всегда чему-то учусь!