LINUX.ORG.RU

Требуется помощь: TCL + Lambda


0

0

В общем, надо сделать так, чтобы вот этот код выдал "c1\nc2\nc3\n":

-----------------------CUT-----------------------
#!/usr/bin/tclsh

set cmds [ list "c1" "c2" "c3" ]
set funcs []

foreach cmd $cmds {
	set lambda "lambda_$cmd"
	proc $lambda {} { puts "$cmd" }
	lappend funcs $lambda
}

foreach func $funcs {
	$func
}
-----------------------CUT-----------------------

И да, я знаю, что конкретно ^это^ можно сделать проще. Это
просто минимальный код, чтобы было понятно что именно мне нужно.

P.S. TCL почти не знаю, изучаю на ходу.
Deleted
Ответ на: комментарий от bik

>> - proc $lambda {} { puts "$cmd" } >> + proc $lambda {} "puts $cmd "

Всё гениальное просто! Спасибо =).

Deleted
()

Я более подробно занимался лямбдами, вот что получилосб в итоге. За примерами использования лезть в сорсы tkLOR.

############################################################################
#    Copyright (C) 2008 by Alexander Galanin                               #
#    gaa.nnov@mail.ru                                                      #
#                                                                          #
#    This program is free software; you can redistribute it and/or modify  #
#    it under the terms of the GNU Library General Public License as       #
#    published by the Free Software Foundation; either version 3 of the    #
#    License, or (at your option) any later version.                       #
#                                                                          #
#    This program is distributed in the hope that it will be useful,       #
#    but WITHOUT ANY WARRANTY; without even the implied warranty of        #
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         #
#    GNU General Public License for more details.                          #
#                                                                          #
#    You should have received a copy of the GNU Library General Public     #
#    License along with this program; if not, write to the                 #
#    Free Software Foundation, Inc.,                                       #
#    51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA               #
############################################################################

package provide gaa_lambda 1.1

package require Tcl 8.4

namespace eval ::gaa {
namespace eval lambda {

namespace export \
    lambda \
    deflambda \
    lambdaProc

proc lambdaLowlevel {paramsVar scriptVar argsVar} {
    set params [ uplevel [ list set $paramsVar ] ]
    set script [ uplevel [ list set $scriptVar ] ]
    set args [ uplevel [ list set $argsVar ] ]
    uplevel [ list unset $paramsVar $scriptVar $argsVar ]
    for {set i 0} {$i < [ llength $params ]} {incr i} {
        if { [ lindex $params $i ] != "args" } {
            uplevel [ list set [ lindex $params $i ] [ lindex $args $i ] ]
        } else {
            uplevel [ list set [ lindex $params $i ] [ lrange $args $i end ] ]
        }
    }
    uplevel [ list eval $script ]
}

proc lambdaProc {params script args} {
    if {( [ lindex $params end ] == "args" && [ llength $params ] > [ llength $args ] ) || \
        ( [ lindex $params end ] != "args" && [ llength $params ] != [ llength $args ] )} {
        error "Arguments count mismatch: expected $params, but $args passed."
    }
    ::gaa::lambda::lambdaLowlevel params script args
}

proc lambda {params script args} {
    return [ concat [ list ::gaa::lambda::lambdaProc $params $script ] $args ]
}

proc deflambda {id params script args} {
    uplevel [ list set $id [ concat [ list ::gaa::lambda::lambdaProc $params $script ] $args ] ]
}

}
}

gaa ★★
()
Ответ на: комментарий от gaa

лицензия на пол-экрана - это правильно, злые проприетарщики спят и видят, как украсть твой гениальный код..
если хочешь нормальных примеров - ищи на wiki.tcl.tk по ключевым словам lambda, closure и RS (гуру, который все это разрабатывал)

bik ★★
()
Ответ на: комментарий от bik

>> если хочешь нормальных примеров - ищи на wiki.tcl.tk по ключевым словам lambda, closure и RS (гуру, который все это разрабатывал)

Я про лямбды на wiki.tcl.tk мало что понял. Вообще TCL после C/C++ - это просто вынос мозга... У меня только от синтаксиса уже в глазах рябит...

Deleted
()
Ответ на: комментарий от bik

> лицензия на пол-экрана

enlarge your screen :)

> если хочешь нормальных примеров - ищи на wiki.tcl.tk по ключевым словам lambda, closure и RS (гуру, который все это разрабатывал)

Искал. Из коробки лямбд даже в 8.5 нет, а все предложенные реализации мне не понравились по причине отсутствия возможности указывать не все аргументы, а недостающие дописывать в контексте замыкания.

gaa ★★
()
Ответ на: комментарий от Deleted

> Вообще TCL после C/C++ - это просто вынос мозга...

Ну это как тензорное счисление после школьной геометрии :) Ничего, пообвыкнешь -- начнёшь ужасаться многословности плюсов.

gaa ★★
()
Ответ на: комментарий от gaa

>Ну это как тензорное счисление после школьной геометрии

а по-моему скорей наоборот. Tcl очевиден - чем и хорош в первую очередь. впрочем это так, комментарий от проходившего мимо

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

> Tcl очевиден

Очевидно что он скорее мертв, чем жив, как и perl. Конечно, использовать его еще будут долго, то тенденции это не изменит.

anonymous
()
Ответ на: комментарий от jtootf

> а по-моему скорей наоборот. Tcl очевиден - чем и хорош в первую очередь. впрочем это так, комментарий от проходившего мимо

У него резко больше возможностей. И это не так легко быстро осознать.

gaa ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.