2010-07-13 12 views
7

A Domanda puramente teorica su Tcl.Funzioni anonime Tcl

Seguendo this question stavo pensando a quale sarebbe il modo migliore per implementare le funzioni anonime in Tcl.

Il risultato finale dovrebbe essere permettendo uno sviluppatore per passare un proc completo come argomento per anohter proc:

do_something $data {proc {} {input} { 
    puts $input; 
}}; 

che sarebbe simile a quella di javascript

do_something(data, function (input) { 
    alert(input); 
}); 

ora, naturalmente, questo non lo farà lavoro OOTB. Stavo pensando a qualcosa del genere:

proc do_something {data anon_function} { 
    anon_run $anon_function $data 
} 
proc anon_run {proc args} { 
    set rand proc_[clock clicks]; 
    set script [lreplace $proc 1 1 $rand]; 
    uplevel 1 $script; 
    uplevel 1 [concat $rand $args]; 
    uplevel 1 rename $rand {}; //delete the created proc 
} 

Questo funziona. Ma speravo di ottenere suggerimenti per un modello migliore di questo, in quanto non è molto elegante e non utilizza le fantastiche funzionalità Tcl. Per lo più mi piacerebbe sbarazzarmi di chiamare manualmente anon_run.

risposta

11

In Tcl 8.5, è possibile utilizzare il comando apply. (! consigliato)

proc do_something {data anon_function} { 
    apply $anon_function $data 
} 
do_something $data {{input} { 
    puts $input 
}} 

Naturalmente, se si sta strutturando i tuoi callback come prefissi di comando, allora si può fare questo:

proc lambda {arguments body} { 
    # We'll do this properly and include the optional namespace 
    set ns [uplevel 1 namespace current] 
    return [list ::apply [list $arguments $body $ns]] 
} 

proc do_something {data command} { 
    {*}$command $data 
} 

do_something $data [lambda {input} { 
    puts $input 
}] 

Se si utilizza 8.4 o prima, è necessario il code from the Tcler's Wiki come sostituto, ma sii consapevole che tali soluzioni sono solo semanticamente equivalenti (nella migliore delle ipotesi); non sono equivalenti alle prestazioni.

+0

Inoltre, a differenza di Javascript non fa chiusure. Le chiusure sono semanticamente complicate in Tcl perché in realtà non si adattano al modello di datatype di Tcl, e i termini lambda come sopra rendono questo problema particolarmente ovvio (non è un grosso problema con le procedure, ma semplicemente una questione di programmazione semplice). –

+0

Apprezzo la risposta dettagliata e ben spiegata. –

+0

E ho effettivamente hackerato una [forma limitata di chiusure] (https://chiselapp.com/user/kbk/repository/tclquadcode/artifact/9cd98bc023dd3ef1?ln=353,382) per uno dei miei progetti. –

Problemi correlati