
{"id":1914,"date":"2024-11-21T10:26:00","date_gmt":"2024-11-21T10:26:00","guid":{"rendered":"https:\/\/avant-iconic.com\/?p=1914"},"modified":"2025-02-25T15:17:16","modified_gmt":"2025-02-25T15:17:16","slug":"tcl-9","status":"publish","type":"post","link":"https:\/\/avant-iconic.com\/en\/tcl-9\/","title":{"rendered":"Tcl 9 \u2013 das Nischen-Wunder bekommt eine Neuauflage"},"content":{"rendered":"\n<div class=\"wp-block-stackable-image stk-block-image has-text-align-right stk-block stk-f65be2b\" data-block-id=\"f65be2b\"><style>.stk-f65be2b .stk-img-wrapper{width:100% !important;height:350px !important;}:where(.stk-hover-parent:hover,  .stk-hover-parent.stk--is-hovered) .stk-f65be2b .stk-img-wrapper::after{background-color:#000000B3 !important;}<\/style><figure><span class=\"stk-img-wrapper stk-image--shape-stretch\"><img loading=\"lazy\" decoding=\"async\" class=\"stk-img wp-image-2255\" src=\"https:\/\/avant-iconic.com\/wp-content\/uploads\/2024\/11\/Tcl9.svg\" width=\"500\" height=\"250\" alt=\"Tcl 9\"\/><\/span><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Am 26. September war es endlich so weit: Ein neues <a href=\"https:\/\/www.tcl-lang.org\/software\/tcltk\/9.0.html\" target=\"_blank\" rel=\"noopener\">Major-Release<\/a> der Programmiersprache Tcl (ausgesprochen &#8222;Tickle&#8220;, wie das englische Wort f\u00fcr &#8222;kitzeln&#8220;) ist erschienen. F\u00fcr die Sprache, die sonst eher auf evolution\u00e4re Entwicklung, R\u00fcckw\u00e4rtskompatibilit\u00e4t und Library-Unterst\u00fctzung setzt, ist das ein entscheidender Schritt.<\/p>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-ea7b9b3\" data-block-id=\"ea7b9b3\"><p class=\"stk-block-text__text\">Tcl besticht seit seinen fr\u00fchen Tagen mit innovativer Funktionalit\u00e4t, die es noch gar nicht so lange in anderen Programmiersprachen gibt, wie etwa eventbasierter Ein- und Ausgabe und Variablen-Traces. Die Innovation h\u00f6rt auch nicht auf \u2013 in den letzten Minor-Releases sind etwa &#8222;Reflected Channels&#8220;, also frei scriptbare Ein- und Ausgabekan\u00e4le, Tailcalls, Coroutinen mit voll bidirektionaler Kommunikation sowie unbegrenzte Ganzzahlen als Standard hinzugekommen \u2013 alles Konstrukte, die elegante und vor allem einfache L\u00f6sungen erm\u00f6glichen, die in anderen Programmiersprachen viel wuchtiger ausfallen w\u00fcrden.<\/p><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Hier ein kleines Code-Beispiel, um zu zeigen, was in Tcl geht:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>namespace import tcl::mathop::*\n\nproc printSquare { varName index operation } {\n  upvar $varName value\n  puts &#91;* $value $value]\n}\n\nproc main {} {\n  set tracedVar 1\n  trace add variable tracedVar write printSquare\n\n  while 1 {\n    incr tracedVar\n    after 1000\n  }\n}\n\nmain <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Code sieht man, dass es m\u00f6glich ist, mit Traces live benachrichtigt zu werden, wenn sich eine Variable \u00e4ndert. Das ist ein Alleinstellungsmerkmal von Tcl, da das nicht wie in anderen Sprachen, wie JavaScript, auf Objekte beschr\u00e4nkt ist, sondern mit allen Werten funktioniert. Au\u00dferdem kann man sehen, dass mathematische Operatoren einfach als Befehle eingebunden werden k\u00f6nnen. Die eckigen Klammern <code>[ ]<\/code> sind die Syntax f\u00fcr einen verschachtelten Befehlsaufruf. Wir rufen also den <code>puts<\/code>-Befehl mit dem Resultat der Multiplikation auf, und zwar immer, wenn <code>tracedVar<\/code> einen neuen Wert bekommt.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-8e97ef8\" id=\"neuheiten-in-tcl-9\" data-block-id=\"8e97ef8\"><h2 class=\"stk-block-heading__text\">Neuheiten in Tcl 9<\/h2><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Nun legt Tcl 9 einen darauf. Das mit Spannung erwartete Release, das im September endlich das Licht der Welt erblickt hat, wagt es nun, viele Innovationen einzuf\u00fchren, f\u00fcr die unter der Haube und in der C-API jedoch einiges umgestellt werden musste. Darunter befinden sich diverse Performance-Verbesserungen, eine Komplett\u00fcberholung der Unicode-Verarbeitung und abstrakte Listen, mit denen die C-API so aufgebohrt wurde, dass sie Daten in und aus Tcl-Skripten streamen kann, \u00fcber die die Skripte einfach iterieren k\u00f6nnen. Auch ein Highlight: Unterst\u00fctzung f\u00fcr Single-File-Deployment, bisher ein eigenes Paket, ist nun integriert. Es folgt in n\u00e4chster Zeit auch noch Unterst\u00fctzung f\u00fcr Unix-Domain-Sockets, um lokale Interprozesskommunikation noch effizienter zu machen.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-f483f90\" id=\"merkmale-von-tcl\" data-block-id=\"f483f90\"><h2 class=\"stk-block-heading__text\">Merkmale von Tcl<\/h2><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Die Sprache weist einen hohen Grad an Abstraktion auf, und Boilerplate l\u00e4sst sich fast immer vermeiden. Dadurch wird nicht nur Code eingespart, sondern auch viele Fehlerquellen reduziert \u2013 ganz nach dem Motto &#8222;Define errors out of existence&#8220;, gepr\u00e4gt vom Vater der Sprache, John Ousterhout. Eine Besonderheit, die in diesem Zusammenhang nicht unerw\u00e4hnt bleiben sollte, ist, dass Tcl nicht den <a href=\"https:\/\/www.infoq.com\/presentations\/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare\/\" target=\"_blank\" rel=\"noopener\">milliardenschweren Fehler<\/a> der Null-Referenzen eingegangen ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">M\u00f6glich ist das unter anderem dadurch, dass Tcl relativ konsequent Kopier-Semantik umsetzt. Das hei\u00dft, auch Listen (in anderen Sprachen als Arrays bekannt) und Dictionaries verhalten sich, als w\u00fcrden sie kopiert, wenn man sie als Parameter \u00fcbergibt. Es ist ungef\u00e4hr so, als w\u00fcrde man in JavaScript immer den <code>...<\/code>-Operator in einem neuen Array oder Objekt benutzen. Unter der Haube l\u00e4uft das aber optimierter ab, als in JavaScript, und man muss sich nie mit Referenz-Fehlern und diversen Fernwirkungen herumschlagen. Gerade f\u00fcr die funktionale Programmierung ist das ein geniales Feature, wie wir finden. Einen Spread-&#8222;Operator&#8220; gab es in Tcl \u00fcbrigens schon vor JavaScript, man schreibt ihn <code>{*}<\/code>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nachtrag: Der <a href=\"https:\/\/www.infoq.com\/presentations\/Simple-Made-Easy\/\" target=\"_blank\" rel=\"noopener\">Beitrag von Rich Hickey \u00fcber den Unterschied zwischen &#8222;Simple und Easy&#8220;<\/a> greift mehrere Themen auf, wo auch Tcl, wie Clojure und Haskell, die Seite von &#8222;simple&#8220; repr\u00e4sentiert. Wo es m\u00f6glich ist, ist Tcl jedoch auch gleichzeitig &#8222;easy&#8220;. Das macht die Sprache so einzigartig.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tcl mag auf den ersten Blick etwas unscheinbar oder aus der Zeit gefallen erscheinen, aber dieser Eindruck ist nicht berechtigt. Tcl-Code und -Unterst\u00fctzung befinden sich in der Git- sowie SQLite-Distribution, in den allermeisten FPGA- und VDHL-Tools sowie in vielen Telefonanlagen. Weitere Anwendungen sind <a href=\"https:\/\/www.eggheads.org\/\" target=\"_blank\" rel=\"noopener\">Chatbots<\/a>, <a href=\"https:\/\/www.flightaware.com\/\" target=\"_blank\" rel=\"noopener\">Flug-Tracking<\/a> und <a href=\"https:\/\/de.decentespresso.com\/\" target=\"_blank\" rel=\"noopener\">Kaffeemaschinen<\/a>. Schlussendlich die Kr\u00f6nung: Jeder, der die Standard-Python-Distribution verwendet, hat auch Tcl installiert. Denn Python enth\u00e4lt eine komplette Version von Tcl und Tk. Das unterstreicht nachdr\u00fccklich, wie kompakt und leichtgewichtig Tcl geblieben ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Plattformunterst\u00fctzung ist breit: Alle modernen unixoiden Betriebssysteme, darunter auch macOS, sowie Windows ab 7 werden unterst\u00fctzt, daneben gibt es noch <a href=\"https:\/\/www.androwish.org\/home\/home\" target=\"_blank\" rel=\"noopener\">AndroWish<\/a> f\u00fcr Android, mit dem auch <a href=\"https:\/\/avant-iconic.com\/services\/#app\">App-Entwicklung<\/a> m\u00f6glich ist. Die Sprache ist gleichzeitig eine C-Bibliothek und kann somit auch \u00fcberall eingebettet werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir sind weiterhin \u00fcberzeugt von Tcl und nutzen diese Sprache aktiv, vor allem f\u00fcr alles, was mit Automatisierung zu tun hat.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-e60cc00\" id=\"der-eigene-weg-von-tcl-und-was-man-daraus-lernen-kann\" data-block-id=\"e60cc00\"><h2 class=\"stk-block-heading__text\">Der eigene Weg von Tcl \u2013 und was man daraus lernen kann<\/h2><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Eines der Geheimnisse von Tcl ist der Fokus auf Explizitheit. Vieles, was in anderen Sprachen implizit ist und subtile Bugs verursacht, wird expliziert und durch eigene Befehle abgebildet. Das Setzen von Variablen, das Indizieren einer Liste oder das Erzeugen eines Dictionaries etwa sind explizite Schritte mit eigenen Befehlen. Das l\u00e4uft vermeintlich dem Gedanken von Abstraktion und Boilerplate-Vermeidung zuwider, entpuppt sich aber als robustes Sicherheitsfeature. Die Sprache ist so gut strukturiert, dass man explizites Type-Checking wie in TypeScript oder neueren Python-Versionen niemals vermisst.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-a4586a8\" id=\"typisierung-in-tcl\" data-block-id=\"a4586a8\"><h3 class=\"stk-block-heading__text\">Typisierung in Tcl<\/h3><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Um Typen muss man sich in Tcl praktisch keine Sorgen machen, denn Werte <em>haben<\/em> (zumindest konzeptionell) gar keine Typen in Tcl. Stattdessen erwarten Befehle ihre Argumente in einem gewissen Format, etwa Integer, <em>Entier<\/em> (einer unbegrenzten Ganzzahl), Dictionary, Liste, Datum oder JSON. So implementiert Tcl eine Art strukturelle Typisierung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tcl ist eine homoikonische Sprache, \u00e4hnlich wie Lisp oder Forth. Das bedeutet, dass Tcl-Code auch ein spezieller Datentyp ist. Das macht Tcl extrem geeignet f\u00fcr Metaprogrammierung, dom\u00e4nenspezifische Sprachen und <a href=\"https:\/\/www.magicsplat.com\/blog\/meta-html\/index.html\" target=\"_blank\" rel=\"noopener\">transformierendes Parsen<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-83fbb1a\" id=\"ubersichtlichkeit-und-pragmatismus\" data-block-id=\"83fbb1a\"><h3 class=\"stk-block-heading__text\">\u00dcbersichtlichkeit und Pragmatismus<\/h3><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Zuletzt eine etwas subjektive Bewertung, die aber auch von vielen Tcl-Neulingen geteilt wird: Tcl-Code ist sehr \u00fcbersichtlich und gut lesbar. Zum einen liegt das an der Explizitheit der Sprache und daran, dass die Basis-Syntax extrem simpel ist. Zum anderen aber auch an sinnvollen Abstraktionen und <a href=\"https:\/\/wiki.tcl-lang.org\/page\/little+language\" target=\"_blank\" rel=\"noopener\">&#8222;little languages&#8220;<\/a>, die in anderen Sprachen oft nur durch umfangreiche Libraries (wie <code>date-fns<\/code> oder <code>lodash<\/code> in JavaScript) bereitgestellt werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tcl ist bis ins kleinste Detail durchdacht. So akzeptiert etwa der Befehl <code>lmap<\/code>, das Pendant zu map in vielen anderen Sprachen, anstandslos auch <code>break<\/code>&#8211; und <code>continue<\/code>-Befehle. Dadurch ersetzt lmap gleich auf einen Schlag <code>filter<\/code>, <code>find<\/code>, <code>some<\/code> und viele Anwendungen von <code>reduce<\/code>. Und jeder, der <code>break<\/code>&#8211; und <code>continue<\/code> kennt, versteht auch den Tcl-Code sofort:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set remotesRaw &#91;exec -ignorestderr git remote -v]\nset remotes &#91;lmap remoteRawLine &#91;split $remotesRaw \\n] {\n  split $remoteRawLine\n}]\nset pushOrigin &#91;lmap remote $remotes {\n  lassign $remote name uri typeInParens\n  if {\n    $name eq {origin} &amp;&amp;\n    $typeInParens eq {(push)}\n  } {\n    set uri\n  } else {\n    continue\n  }\n}]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Tcl-Code zum Beispiel findet unter den Git-Remotes in einem Repository genau die Origin-Remote und speichert sie in einer Variable. Hier der \u00e4quivalente, idiomatische Python-Code:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import subprocess\n\nremote_output = subprocess.check_output(&#91;'git', 'remote', '-v'], stderr=subprocess.DEVNULL).decode('utf-8')\nremotes = &#91;line.split() for line in remote_output.splitlines()]\npush_origin = next(remote&#91;1] for remote in remotes\n                  if remote&#91;0] == 'origin' and remote&#91;2] == '(push)')<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hier erkennt man einen deutlichen Unterschied, denn Tcl erlaubt es durch seine flexiblen Syntaxen und Ausf\u00fchrungsmodelle, den Code viel selbsterkl\u00e4render zu gestalten, als das in Sprachen wie Python m\u00f6glich ist. Im Gegensatz zu Python, das oft auf unterschiedliche Kurz- und Langformen der Syntax setzt, hat Tcl einheitliche Befehle, die sich nach Lego-Prinzip kombinieren lassen. Streng gelintetes JavaScript oder TypeScript hat daher \u00fcbrigens auch eine etwas Tcl-artige Struktur.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-15a5f2b\" id=\"weitere-highlights\" data-block-id=\"15a5f2b\"><h2 class=\"stk-block-heading__text\">Weitere Highlights<\/h2><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Tcl verf\u00fcgt \u00fcber ein integriertes <a href=\"https:\/\/www.tcl-lang.org\/man\/tcl\/TclCmd\/tcltest.htm#M6\" target=\"_blank\" rel=\"noopener\">Test-Framework<\/a>, das unserer Meinung nach eines der besten auf dem Markt ist. Es basiert auf dem Prinzip &#8222;Ein Assert pro Test&#8220; und integriert diesen direkt in die Syntax. Jeder Test hat einen menschenlesbaren Titel ohne unn\u00f6tigen <code>CamelCase<\/code>. Au\u00dferdem verf\u00fcgt das Framework \u00fcber ein Matcher-System, um die Asserts flexibler zu machen, und \u00fcber ein Constraint-System, mit dem man Test nur unter bestimmten Bedingungen (z.B. Plattformen oder CI-Umgebungen) ausf\u00fchren kann. Gerade letzteres ist ungemein praktisch und fehlt in den meisten Frameworks. Hier ein Beispieltest, direkt aus dem <a href=\"https:\/\/core.tcl-lang.org\/tcl\/file?name=tests\/string.test&amp;ci=trunk\" target=\"_blank\" rel=\"noopener\">Tcl-Core<\/a>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>test string-4.13.$noComp {string first, start index} -body {\n    run {string first \u7266 abc\u7266x end-2}\n} -result 3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In der heutigen Welt, wo Sicherheitsupdates mehrmals t\u00e4glich ausgespielt werden, ist nat\u00fcrlich auch das Thema DoS omnipr\u00e4sent. Bei JavaScript und Python sind <a href=\"https:\/\/owasp.org\/www-community\/attacks\/Regular_expression_Denial_of_Service_-_ReDoS\" target=\"_blank\" rel=\"noopener\">ReDoS<\/a>-Attacken h\u00e4ufig ein Problem. In Tcl nicht, denn die Regex-Engine verwendet einen <a href=\"https:\/\/swtch.com\/~rsc\/regexp\/regexp1.html\" target=\"_blank\" rel=\"noopener\">Algorithmus<\/a>, der prinzipbedingt Strings in unter-exponentieller Zeit matcht. Dabei sind die regul\u00e4ren Ausdr\u00fccke genauso m\u00e4chtig wie auch in anderen Sprachen. PostgreSQL verwendet die Engine von Tcl und profitiert daher ebenso von diesen Sicherheitsvorteilen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der <a href=\"https:\/\/core.tcl-lang.org\/tcl\/dir?ci=tip\" target=\"_blank\" rel=\"noopener\">Tcl-Core-Code<\/a> ist von \u00e4u\u00dferst hoher Qualit\u00e4t und, wie f\u00fcr Programmiersprachen mittlerweile \u00fcblich, unter einer permissiven Lizenz verf\u00fcgbar. Er zeigt gut, wie man in C wart- und erweiterbare Systeme entwirft. Jeder C-Programmierer sollte sich den Tcl-Source einmal zu Gem\u00fcte f\u00fchren, um wertvolle Best Practices daraus zu \u00fcbernehmen.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-f009ccb\" id=\"nachteile-von-tcl\" data-block-id=\"f009ccb\"><h2 class=\"stk-block-heading__text\">Nachteile von Tcl<\/h2><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Kein Artikel bei AVANT ICONIC kommt ohne eine ausgewogene Betrachtung von Trade-Offs aus. Nicht anders ist es hier. Auch wenn ich zugegebenerma\u00dfen begeistert von der Sprache bin, muss ich einige Einschr\u00e4nkungen und Probleme einr\u00e4umen.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-6196192\" id=\"eingeschrankte-tool-unterstutzung\" data-block-id=\"6196192\"><h3 class=\"stk-block-heading__text\">Eingeschr\u00e4nkte Tool-Unterst\u00fctzung<\/h3><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr Tcl gibt es einen soliden Linter namens <a href=\"https:\/\/nagelfar.sourceforge.net\/\" target=\"_blank\" rel=\"noopener\">Nagelfar<\/a> sowie ein <a href=\"https:\/\/github.com\/mwagner-webdev\/tcltk-tools\/blob\/main\/reformat.tcl\" target=\"_blank\" rel=\"noopener\">Formatierungs-Tool<\/a>. Diese sind aber bei weitem nicht so <em>opinionated<\/em> wie ein ordentlich eingerichtetes <code>eslint<\/code> oder <code>prettier<\/code>. Das halten wir f\u00fcr einen leichten Nachteil, denn so treten beim gemeinsamen Arbeiten h\u00e4ufiger Git-Konflikte auf.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Auch gibt es derzeit noch keine nutzbare LSP-Implementierung, sodass die Code-Completion in IDEs wie Visual Studio Code vergleichsweise eingeschr\u00e4nkt ist.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-b83d14c\" id=\"fehlende-bibliotheken-fur-web-development\" data-block-id=\"b83d14c\"><h3 class=\"stk-block-heading__text\">Fehlende Bibliotheken f\u00fcr Web-Development<\/h3><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Tcl hat den Trend zu Web-Frameworks nicht mitgemacht und kann daher f\u00fcr viele Web-Themen keine Bibliotheken vorweisen. So gibt es etwa keine OAuth- oder JWT-Bibliothek, au\u00dfer im Framework <a href=\"https:\/\/openacs.org\/\" target=\"_blank\" rel=\"noopener\">OpenACS<\/a>, das aber eher ein komplettes CMS ist. F\u00fcr die Entwicklung von APIs und Services gibt es daher zwei Optionen: Die n\u00f6tige Funktionalit\u00e4t selbst entwickeln und auf ein leichtgewichtiges Framework wie <a href=\"https:\/\/woof.sourceforge.net\/woof-ug\/_woof\/docs\/ug\/index\" target=\"_blank\" rel=\"noopener\">Woof<\/a> oder <a href=\"https:\/\/wapp.tcl.tk\/home\/doc\/trunk\/README.md\" target=\"_blank\" rel=\"noopener\">Wapp<\/a> f\u00fcr das Request-Handling zu setzen, oder gleich das gro\u00dfe, monolithische OpenACS zu nutzen.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-b3a8c54\" id=\"fehlender-packag\" data-block-id=\"b3a8c54\"><h3 class=\"stk-block-heading__text\">Fehlender Package-Manager<\/h3><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Bereich, wo Tcl anderen Sprachen hinterherhinkt, ist das Package-Management. Das war nicht immer so, das <code>teacup<\/code>-Tool erf\u00fcllte vor etlichen Jahren diese Funktion, es wird jedoch nicht mehr gepflegt. Nun ist mit <a href=\"https:\/\/openacs.org\/conf2024\/info\/download\/file\/Obermeier-Tcl9-Extensions-EuroTcl2024.pdf\" target=\"_blank\" rel=\"noopener\">BAWT<\/a> eine gangbare Alternative verf\u00fcgbar, wo auch viele Tcl-9-Packages momentan eingepflegt werden. Den Status als Standard, wie NPM oder PyPi, hat BAWT aber momentan noch nicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da wir Tcl-Applikationen oft in Containern ausf\u00fchren, werden wir in einem zuk\u00fcnftigen Post noch berichten, wie sich BAWT in den Docker-Workflow einf\u00fcgen l\u00e4sst.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-5d22ac5\" id=\"fazit\" data-block-id=\"5d22ac5\"><h1 class=\"stk-block-heading__text\">Fazit<\/h1><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Das neue Release beweist, dass sich in der Welt von Tcl\/Tk immer noch viel bewegt. Die Sprache ist weiterhin ein Vorbild f\u00fcr pragmatische Ans\u00e4tze, erfolgreiche Kombinationen von Paradigmen und Mut zur Nische. Es hat die Tcl-Community klar motiviert, weiter am \u00d6kosystem zu feilen und seine Schw\u00e4chen auszumerzen. Wenn es so weitergeht, hat Tcl noch ein langes Leben vor sich.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Am 26. September war es endlich so weit: Ein neues Major-Release der Programmiersprache Tcl (ausgesprochen &#8222;Tickle&#8220;, wie das englische Wort f\u00fcr &#8222;kitzeln&#8220;) ist erschienen. F\u00fcr die Sprache, die sonst eher auf evolution\u00e4re Entwicklung, R\u00fcckw\u00e4rtskompatibilit\u00e4t und Library-Unterst\u00fctzung setzt, ist das ein entscheidender Schritt. Tcl besticht seit seinen fr\u00fchen Tagen mit innovativer Funktionalit\u00e4t, die es noch gar [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":2263,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[39,38],"tags":[],"class_list":["post-1914","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software","category-nerd-talk"],"blocksy_meta":[],"acf":[],"_links":{"self":[{"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/posts\/1914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/comments?post=1914"}],"version-history":[{"count":1,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/posts\/1914\/revisions"}],"predecessor-version":[{"id":2395,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/posts\/1914\/revisions\/2395"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/media\/2263"}],"wp:attachment":[{"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/media?parent=1914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/categories?post=1914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/tags?post=1914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}