3 ms·
Shows how long it's been since I last used Tcl! Still, Tcl's anonymous functions aren't quite what many people consider to be lambdas: % set inc {x {expr
by groovy2shoes 15y ago
Shows how long it's been since I last used Tcl!
Still, Tcl's anonymous functions aren't quite what many people consider to be lambdas:
% set inc {x {expr $x + 1}}
% apply $inc 1
2
% apply $inc 1
2
% $inc 1
invalid command name "x {expr $x + 1}"
% inc 1
1
This works fine with `apply`, but if you treat it like a normal function, it does some strange things. Conversely, functions that are defined with `proc` aren't compatible with `apply` unless you wrap them up.
I'm not saying it's inadequate, just that the anonymous functions don't quite work how you expect lambdas to work.
- bch 15y agoI can't speak to what most people expect from lambdas; I force myself use Tcl's [apply] occasionally just to try slightly different paradigms, so I appreciate your commentary. One thing to note though, your final [inc 1] has nothing to do w/ $inc. In the interactive REPL (which I'm assuming you used), Tcl will (by default) essentially autocomplete commands if it can, and [inc] completed to [incr], which is "increment". [incr] adds (by default) 1 to the named variable and returns its result. In this case, the variable name happens to be "1", later accessible via "$1", or [set 1], for example. [edit: I erroneously initially described the "1" in [incr 1] as the integer constant 1; @groovy2shoes reply below reflects my original error. This does go to show another neat feature of Tcl: no keywords.]
- groovy2shoes 15y agoI didn't know that tclsh autocompletes commands; that's pretty neat. In this case, it looks like [incr 1] is incrementing a variable called 1, and appears to start from zero if the variable isn't initialized. I find Tcl's command model interesting because it leads to a very tiny semantics. A few years ago I spent a lot of time thinking about how it could be extended to have lambdas, and I couldn't come up with a way that wouldn't break the command model in some way or another. They aren't something Tcl needs to have, I just thought it'd be convenient. (Tcl's evaluation model allows you to simulate higher-order procs, which, along with `apply`, covers many use cases of lambda).
- bch 15y agoYa -- interactive tclsh has a few creature-features. The autocomplete we're discussing, automatic fall-through to exec as if via sh(1), command history, history editing, and perhaps more I'm forgetting. kamloops$ tclsh8.6 % info commands up* update uplevel upvar % uptime 7:17PM up 1 hr, 7 users, load averages: 0.06, 0.12, 0.17 % ls fu ls: fu: No such file or directory child process exited abnormally % ls -ld fu ls: fu: No such file or directory child process exited abnormally % ^fu^foo ls -ld foo -rwxr-xr-x 1 joe users 7300 Mar 23 2011 foo % history 1 info commands up* 2 uptime 3 ls fu 4 ls -ld fu 5 ls -ld foo 6 history % !2 uptime 7:20PM up 1:03, 7 users, load averages: 0.13, 0.12, 0.16
- groovy2shoes 15y ago> automatic fall-through to exec as if via sh(1) That explains why X11.app launched that one time I forgot a `$` before my `x`...
- bch 15y agoThat sounds likely. Note that is strictly for interactively typed commands. Witness: kamloops$ cat ls.tcl #!/usr/pkg/bin/tclsh8.6 ls foo kamloops$ ./ls.tcl invalid command name "ls" while executing "ls foo" (file "./ls.tcl" line 3) kamloops$ tclsh8.6 % source ls.tcl invalid command name "ls" % ls foo foo % Now, back to your regularly scheduled Lua topic :)
- bch 15y ago@groovy2shoes (and anybody else who's interested in modern (or historic, for that matter) Tcl), you should drop by #tcl on irc.freenode.net. We'd love to have you visit.
- bch 15y agoTo my point of no keywords, and touching on the interesting model @groovy2shoes is talking about here[1]: $ tclsh % set a set set % puts $a set % $a b 9 9 % set b 9 % set set set set % $set set set % rename set foo % foo set set % foo a set % foo a 9 9 % puts $a 9 % [1] http://news.ycombinator.com/item?id=3536419 http://news.ycombinator.com/item?id=3536419 [edit: formatting]