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

Sergey ShishkinSergey Shishkin
2 min read

Самой функции 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» не привязан к совпадающим значениям и, таким образом, экономит место в стеке.

0
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

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