Tcl the Misunderstood (Antirez)
Tcl is a misunderstood programming language offering significant flexibility and expressiveness, treating everything as a command, supporting dynamic typing, and providing powerful macro-like capabilities through eval and uplevel commands.
Read original articleTcl, often dismissed as a toy language, is presented as a powerful and misunderstood programming language. The author, Salvatore Sanfilippo, argues that many misconceptions about Tcl stem from its lack of strong leadership after its creator, John Ousterhout, departed. Despite its limitations, Tcl offers significant programming freedom and expressiveness. The language is built around commands, with everything treated as a command, including control structures like if and while. Tcl's dynamic nature allows for late binding, where types are not strictly enforced, enabling flexibility in programming. The language supports lists as a central structure, and mathematical operations can be performed using the expr command. Procedures can be defined to extend functionality, allowing users to redefine built-in commands. The eval and uplevel commands enable powerful macro-like capabilities, allowing for code evaluation in different contexts. Overall, Tcl's design promotes a unique approach to programming that, while sometimes criticized, offers a robust framework for developers willing to explore its capabilities.
- Tcl is often misunderstood and dismissed as a toy language.
- The language allows for significant programming flexibility and expressiveness.
- Tcl treats everything as a command, including control structures.
- It supports dynamic typing and late binding, enhancing its versatility.
- Tcl provides powerful macro-like capabilities through eval and uplevel commands.
Related
A brief interview with Tcl creator John Ousterhout (2023)
John Ousterhout, creator of Tcl, highlighted its embeddable nature and "everything is a string" philosophy. He reflected on missed opportunities, including Tcl as a browser language. Ousterhout emphasized the importance of practical utility in widely adopted languages like Tcl and Python.
Why You Should Not Use Tcl (1994)
Google Groups no longer supports new Usenet posts. Richard Stallman advises against using Tcl for serious programming due to limitations. Users debate Tcl's suitability, citing its extendability and similarities to Lisp.
Ask HN: Why do people say "Lisp has no syntax"? It has infinite syntax
The author discusses Lisp's syntax, highlighting its list-based structure and challenges with constructs like `cond`. They conclude that Lisp's complexity resembles other languages, despite its unique features.
The Liberating Experience of Common Lisp
The author critiques modern programming languages for their complexity, praising Common Lisp for its stability, unique developer experience, and creative freedom, making it preferable for software development.
Why I Like Tcl
The author appreciates Tcl for its elegant syntax, ease of C integration, and event-driven model, but notes its declining popularity, weak type system, and lack of modern libraries.
- Many users appreciate Tcl's extensibility and clean code, particularly in relation to integrating native code.
- Some users express frustration with Tcl's syntax and its confusion stemming from C-like conventions.
- There is a desire for modernization in Tcl, including features like closures and better GUI development tools.
- Users recognize Tcl's power in scripting and configuration, especially in tools like Expect.
- Some comments highlight Tcl's unique characteristics, such as its regex engine and its use in projects like SQLite.
31 points|pmarin|16 years ago|17 comments
https://news.ycombinator.com/item?id=389107
181 points|zeitg3ist|12 years ago|110 comments
https://news.ycombinator.com/item?id=4920831
131 points|throwaway344|11 years ago|45 comments
https://news.ycombinator.com/item?id=7069642
182 points|goranmoomin|2 years ago|79 comments
This means that "" and {} are expected to work a certain way from C and when you hit Tcl you are HORRIBLY confused.
It's especially confusing as {} is simply quoting and has nothing to do with scope. The fact that Tcl is written such that {} is used with indentation in if-statements muddies the issue even further.
I suspect that a choice of ` (backtick) for Tcl " and " instead of Tcl {} would have made Tcl way less confusing to the vast majority of programmers.
I understand why things weren't done that way--having the ability to know that your quote has different characters for open vs close is very valuable for efficient parsing.
Nevertheless, the Tcl choices were unfortunate given the way history played out.
Unfortunately most fall for the more popular Clean Code and it's derivatives.
Edit: The book is "A Philosophy of Software Design"
Reading through this article, the memoize implementation does have an issue which is if the memoized command wants to call uplevel or upvar it'll get the wrong stack frame. If I were writing this I'd structure it so it's used like
proc myMemoizingProcedure { ... } {
memoize {
... the rest of the code ...
}
}
such that it can just `uplevel` the code. Or better yet I'd make `memoize` replace the `proc` keyword (or perhaps `memoize proc myMemoizingProcedure …`).EDIT: I suppose memoizing makes no sense in a procedure that wants to use upvar or uplevel though, because memoizing only works for pure functions.
https://linux.die.net/man/1/expect
I really like that it, like the article mentions, just looks like config for basic scripts but also scales to whatever you need it to do.
https://github.com/athas/EggsML/blob/master/concieggs/hooks/...
A line that contains a regex pattern for matching regex patterns.
TCL was chosen here because its regex engine isn't too powerful.
As a self-taught novice programmer that started with QBasic and had moved on to Turbo Pascal, I found Tcl to be very confusing and it left a rather negative impression.
Reading this page now though, it seems a lot more logical and reasonable than it appeared at the time.
For a long while, when I might have used Tcl/TK, I instead used Runtime Revolution/Livecode (a cross-platform HyperCard clone) which had a very nice system for interactively drawing programs.
I'd really like for there to be an agreed-upon standard option for graphical program development which was interactive and cross-platform.
That's where it gets really criminal: Dynamic scoping rules. There is no lexical scoping and hence no closures. If you use `uplevel`, your procedure works or doesn't, depending on the caller. There is a reason Tcl is the last language that uses this braindead mechanism.
Related
A brief interview with Tcl creator John Ousterhout (2023)
John Ousterhout, creator of Tcl, highlighted its embeddable nature and "everything is a string" philosophy. He reflected on missed opportunities, including Tcl as a browser language. Ousterhout emphasized the importance of practical utility in widely adopted languages like Tcl and Python.
Why You Should Not Use Tcl (1994)
Google Groups no longer supports new Usenet posts. Richard Stallman advises against using Tcl for serious programming due to limitations. Users debate Tcl's suitability, citing its extendability and similarities to Lisp.
Ask HN: Why do people say "Lisp has no syntax"? It has infinite syntax
The author discusses Lisp's syntax, highlighting its list-based structure and challenges with constructs like `cond`. They conclude that Lisp's complexity resembles other languages, despite its unique features.
The Liberating Experience of Common Lisp
The author critiques modern programming languages for their complexity, praising Common Lisp for its stability, unique developer experience, and creative freedom, making it preferable for software development.
Why I Like Tcl
The author appreciates Tcl for its elegant syntax, ease of C integration, and event-driven model, but notes its declining popularity, weak type system, and lack of modern libraries.