Spec-Zone.ru › GNU Make

Функция let

Функция let предоставляет способ ограничить область действия переменной. Присвоение именованных переменных в выражении let действует только внутри текста, предоставляемого выражением let, и это присвоение не влияет на эту именованную переменную в любой внешней области действия.

Кроме того, функция let позволяет распаковывать списки, присваивая все неназначенные значения последней именованной переменной.

Синтаксис функции let:

$(let var [var ...],[list],text)

Первые два аргумента, var и list, расширяются до выполнения любых других действий; обратите внимание, что последний аргумент, text, не расширяется одновременно. Затем каждое слово расширенного значения list связывается с каждым из имен переменных var по очереди, причем последнее имя переменной связывается с остатком расширенного list. Другими словами, первое слово list связывается с первой переменной var, второе слово — со второй переменной var и так далее.

Если в var больше имен переменных, чем слов в list, оставшиеся имена переменных var устанавливаются в пустую строку. Если в var меньше имен переменных, чем слов в list, то последняя переменная var устанавливается на все оставшиеся слова в list.

Переменные в var присваиваются как просто расширенные переменные во время выполнения let. См. Два типа переменных.

После того, как все переменные связаны таким образом, text расширяется для получения результата работы функции let.

Например, эта макрос меняет порядок слов в списке, который ей передаётся как первый аргумент:

reverse = $(let first rest,$1,\
            $(if $(rest),$(call reverse,$(rest)) )$(first))

all: ; @echo $(call reverse,d c b a)

выведет a b c d. При первом вызове let расширит $1 до d c b a. Затем она присвоит first значение d и rest значение c b a. Затем она расширит условный оператор, где $(rest) не пусто, поэтому мы рекурсивно вызываем функцию reverse со значением rest, которое теперь c b a. Рекурсивный вызов let присвоит first значение c и rest значение b a. Рекурсия продолжается, пока let не будет вызвана с одним значением a. Здесь first равно a, а rest — пустая строка, поэтому мы не рекурсируем, а просто расширяем $(first) до a и возвращаем, что добавляет b, и т. д.

После завершения вызова reverse переменные first и rest больше не заданы. Если переменные с такими именами существовали до этого, они не будут затронуты расширением макроса reverse.

Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Let-Function.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API