4 ms·
A huge, seriously annoying problem with TCL is lack of deterministic cleanup for resources. If you don't manually close a filehandle, for example, it will leak.
by a8da6b0c91d 11y ago
A huge, seriously annoying problem with TCL is lack of deterministic cleanup for resources. If you don't manually close a filehandle, for example, it will leak. Doing this sort of bookkeeping in 2015 is infuriating.
- sebcat 11y agoproc with {file as name block} { uplevel 1 [list set $name $file] uplevel 1 [list eval $block] uplevel 1 [list close $file] } with [open foo.txt w] as file { puts $file "Hello, World!" } I'm sure it's possible to do it in a cleaner way without [set], but my Tcl is a bit rusty.
- a8da6b0c91d 11y agoStill leaks on an exception. That's also an annoying construct to be forced to use.
- nilkn 11y agoYou could easily wrap the middle uplevel in a catch block to handle exceptions, and this sort of "with" construct is pretty common in a lot of very popular languages today. While it would be nice if this were baked into the language, it's pretty astonishing how extensible Tcl is without even having to touch the realm of C extensions.
- srean 11y agoI think this precisely one of Tcl's strengths. Few other languages apart from Lisp and Tcl lets you write your own control flow syntax from within the language (and at runtime).
- sigzero 11y agoI like the "with". Python has that construct. It's not annoying and easy to remember.
- sigzero 11y agoThis illustrates how you can use Tcl to ensure that files get closed even when errors happen by combining catch, close and return (from the Tcl manual): proc withOpenFile {filename channelVar script} { upvar 1 $channelVar chan set chan [open $filename] catch { uplevel 1 $script } result options close $chan return -options $options $result }
- eviltwinskippy 11y agoProgramming must by hard for you. Have a cookie.
- AnimalMuppet 11y agoGarbage collecting languages will free memory, but that's all they're good for. C++ destructors will let you close a filehandle, but I know of no other language that will deterministically clean up non-memory resources. So: What language(s) did you have in mind that do this right?
- a8da6b0c91d 11y agoMany scripting languages in practice do reference counting GC that will reliably and deterministically clean up resources other than memory.
- sigzero 11y ago"Many" includes Tcl there. I have no idea why you think differently. Tcl has had it since the 8.X series started (at least).
- a8da6b0c91d 11y agoNot for tcloo objects, channels and file handles. I don't think you get it. In sane languages like C++ you can expect a destructor to call itself no matter where a function exited.
- sigzero 11y agoC++ is not a scripting language. Give me a scripting language that does that so I can research and compare.
- a8da6b0c91d 11y agoperl: sub do_stuff { my $thing = Thing->new; # no need to manually destroy thing. Its DESTROY method will be called at the closing brace. }
- 11y ago