Tcl: напишите лямбду и карту, используя tcl 8.6

Как мне написать и применить простую лямбда-функцию, используя функции «apply» и «lmap» в tcl 8.6?

map (lambda x -> x*x) [list 1 2 3]

как я могу написать это в Tcl 8.6? Страницы руководства не так понятны для меня.

Возможно, также более продвинутая версия, но я думаю, что могу понять это сам:

lambda y -> map (lambda x -> x*x) y

В основном я хотел бы улучшить эту версию:

proc \x {f val} {
    set res [apply $f $val]
    set res
}

set res [\x {x {expr $x*$x}} 5]
puts "res: $res"

Чтобы я мог просто написать:

set res [\x {expr $x*$x} 5]
puts "res: $res"

tcl
person mrsteve    schedule 11.05.2013    source источник


Ответы (1)


Вот как выглядит lambda:

proc lambda {arguments expression} {
    list ::apply [list $arguments [list expr $expression]]
}

Затем мы делаем это, отмечая, что {*} требуется, потому что внутренний лямбда-термин не может быть командой напрямую, не вызывая других проблем, которые мы не хотели иметь в 8.5 (или 8.6):

set res [lmap x [list 1 2 3] {
    {*}[lambda x {$x * $x}] $x
}]

8.6 lmap синтаксически похож на foreach, поэтому необходим дополнительный уровень приложения. Однако средним программистам на Tcl это легче понять.

Обратите внимание, что лямбда-выражения являются полностью первоклассными значениями, которые можно передавать как угодно (вставлять в переменные, возвращать, сохранять в списке и т. Д.):

set square [lambda x {$x * $x}]

puts "the square of 42 is [{*}$square 42]"

(Вы можете использовать λ для имени команды, если хотите, но мне неудобно печатать на этой клавиатуре. Я не рекомендую использовать \x; Tcl использует обратную косую черту для различных функций экранирования.)

person Donal Fellows    schedule 11.05.2013