Список становится вложенным списком при прохождении через процедуру - PullRequest
0 голосов
/ 07 ноября 2019

Я новичок, который недавно изучил некоторые TCL и недавно столкнулся с удивительным внутренним процессом TCL, который я не могу объяснить. У меня есть код ниже:

proc print_items{args} {
    foreach item $args {
        puts $item
    }
}

set arr "A B C D"
print_items $arr

Я ожидал, что результат будет:

A
B
C
D

, но это было:

A B C D

При ближайшем рассмотрении. Я заметил, что $ args не был плоским списком, который я думал, но вместо этого был

> puts $args
{A B C D}
> llength $args
1

Это означает, что сам $ args должен был быть перенесен в другой список, т.е. $ args должен был быть таким, когда получен процедурой: {{ABCD}}

Итак, мой вопрос: почему TCL оборачивает уже сформированный список в другой список, когда передается в print_items? Это очень отличается от других языков программирования, которые я сделал. При каких обстоятельствах аргумент включается в другую структуру данных (т.е. в другой список, словарь, массив и т. Д.)?

1 Ответ

3 голосов
/ 07 ноября 2019

Ключевое слово "args" в аргументах процедуры имеет особое значение. Он собирает все параметры в список tcl. Например:

proc foo { param1 param2 args } {
    # here:
    #     $param1 = alice
    #     $param2 = bob
    #     $args = {alice1 bob1 alice2 bob2}
}
foo alice bob alice1 bob1 alice2 bob2

Таким образом, ответ на ваш вопрос таков: не используйте специальное слово «args» в качестве аргумента prodecure, потому что он обрабатывается особым образом. Попробуйте использовать любое другое имя для процедуры agrument.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...