Как эффективно (память/время) модифицировать все элементы списка в Tcl?

Чтобы оперировать каждым элементом списка, возвращая модифицированный список, различные языки имеют явные конструкции.

В Perl есть map:

perl -e 'my @a = (1..4); print join(q( ), map { $_ * $_ } @a)'
1 4 9 16

В Python есть list comprehensions:

>>> a = (1,2,3,4)
>>> [el*el for el in a]
[1, 4, 9, 16]

Какой самый эффективный способ сделать это в Tcl? Я могу придумать обычный цикл foreach.

set l {}
foreach i {1 2 3 4} {
    lappend l [expr $i * $i]
}
puts $l
1 4 9 16

Это самый быстрый способ?

Что касается эффективности mem, то он строит второй список, один за другим. Если мне не нужен постоянный список, есть ли более эффективный способ?

И, наконец, есть ли что-то более короткое? Я не нашел информации ни здесь, ни в http://wiki.tcl.tk

Ответ:

Как ответил Donal Fellows, самое главное для тестов скорости, вещи должны быть обернуты в proc {}, так как Tcl может оптимизировать. Для Tcl функция "map" обсуждается как будущее усовершенствование. С помощью этой подсказки и дальнейшего поиска я нашел http://wiki.tcl.tk/12848

5
задан cfi 11 October 2011 в 14:38
поделиться