TCL - вернуть переменную против упвара и изменить - PullRequest
3 голосов
/ 24 июня 2011

Хотел бы посоветоваться с профессионалами TCL для лучшей практики.

Допустим, вы хотите составить список с конкретными данными, используя процедуру.Какой путь лучше?

proc processList { myList } {
   upvar $myList list_
    #append necessary data into list_
}

proc returnList {} {
    set list_ {} 
    #append necessary data into list_
    return $list_
}

set list1 {}
processList list1

set list2 [returnList ]

Какой из этих методов рекомендуется?

РЕДАКТИРОВАТЬ: Извините, но я не могу понять консенсус (и объяснение) людей, которые ответилина этот вопрос.

Ответы [ 3 ]

6 голосов
/ 24 июня 2011

Я практически всегда использую второй метод:

proc returnList {} {
    set result {}
    # ... accumulate the result like this ...
    lappend result a b c d e
    return $result
}
set lst [returnList]

Практически нет разницы в использовании памяти или скорости, но мне легче думать функционально.Кроме того, в Tcl 8.5 вы можете относительно просто разделить список результатов (если это то, что вам нужно):

set remainderList [lassign [returnList] firstValue secondValue]

При этом вы получите a в $firstValueb в secondValue и c d e в $remainderList.

3 голосов
/ 24 июня 2011

Первая опция изменяет существующий список, тогда как вторая создает новый список. Для лучшего сравнения я бы добавил параметр к returnList() и создал бы возвращаемое значение из этого параметра.

Учитывая это, разница заключается в способе передачи параметров - по ссылке или по значению - и в объеме памяти, необходимом для каждой операции.

У второго метода нет побочных эффектов, но он может быть очень трудоемким, если список огромен.

Нет общего правила рекомендовать одно над другим. Мое собственное правило - начинать со второго пути, если другие ограничения не приводят к этому.

0 голосов
/ 05 марта 2014

Какой будет синтаксис для эквивалента:

set lst [returnList]

Если вы хотите вернуть более одного списка одновременно?

Я подумал, что если вы сделаете что-то вроде этого:

return [$list1 $list2]

Он должен был вернуть список списков, к которым вы могли бы затем получить доступ с помощью lindex.Но это не совсем то, что он делает.Это действительно просто возвращает вам два списка, без внешних фигурных скобок, группирующих их в один список.В Perl вы можете сделать что-то вроде:

($var1, $var2) = process_that_returns_two_values;

Но я не думаю, что "set" позволяет это в Tcl.

...