• bb01100100 3 days ago

    I was doing some looping recently with tcl and comparing against another implementation (called Jim [1], a very cool project in its own right) and wondered why datetime formatting was so slow when using `clock format`.

    The code at [2] provided an alternative approach using C via critcl. It was interesting to see how malleable tcl can be.

    [1] https://github.com/msteveb/jimtcl [2] https://wiki.tcl-lang.org/page/speed+up+clock+format+and+clo...

    • NelsonMinar 3 days ago

      Still in active development, or at least maintenance. https://github.com/andreas-kupries/critcl/commits/master/

      • ofalkaed 3 days ago

        I don't think it needs much development at this point, it is stable, all it needs to do is keep up with Tcl/Tk development. I just started playing with it two days ago so I might be missing some of its flaws but so far it seems quite mature.

      • monetus 3 days ago

        I've been using critcl for a long time, and maybe weirdly still end up using it despite often using nim. Fantastic software.

        • ofalkaed 3 days ago

          Any chance you can elaborate on your use case? Part of why I submitted this is because I am not completely sure on when it is wise to use, I can see situations where it is clearly useful but things get fuzzy rather quickly.

          Are you the monetus who used to post on the pd forums? If so, thanks, I have found some of my answers in threads which you contributed too and probably provided the solution too.

        • qalmakka 17 hours ago

          This is insane and I love it. Just like Tcl. The fact everything is a string in Tcl makes embedding languages wonderfully simple.

          • johnisgood 15 hours ago

            Somewhat related, it is something I have been trying to figure out, and I did, successfully! This information might help others.

            You can create a standalone binary from .tcl files by using KitCreator and sdx (Starkit Developer eXtension). You need to wrap your Tcl script into a .kit file (a virtual filesystem), then combine it with a Tcl runtime to produce a native ELF (or Windows) binary. Optionally, you can encrypt your Tcl code with AES (e.g., using openssl enc) before embedding it, and decrypt it at runtime via a custom loader. The result is a self-contained executable that runs anywhere Tcl is supported. :)

            I have a script for it!

              Standalone encrypted application created:
              -> /tmp/tcl/app.run
              -> AES KEY (hex): 95a8a95e8322344b808ebd3fd3986b5b
              -> AES IV  (hex): 69eac67341d2657a0b00d3006addb131
              -> To run it: ./app.run
            
              $ ./app.run
              Hello world from binary!
              $ file app.run
              app.run: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=f3fabb748cc7e61c2fafc7c288f282db2f6de0c7, for GNU/Linux 3.2.0, stripped
            
            The generated app.run is 10 MB and ldd shows it only needs "linux-vdso", "libm", "libc", and "ld-linux-*".

            Useful links (taken from my script):

              TCL_VERSION="9.0.1"
              TCL_SRC_URL="https://sourceforge.net/projects/tcl/files/Tcl/${TCL_VERSION}/tcl${TCL_VERSION}-src.tar.gz"
              SDX_KIT_URL="https://chiselapp.com/user/aspect/repository/sdx/uv/sdx-20110317.kit"
              TCLLIB_URL="https://github.com/tcltk/tcllib/archive/refs/heads/main.zip"
            
            I wonder if there is a more recent sdx, although it still works.

            FWIW, the steps are:

              1. Download and build Tcl
              2. Clone KitCreator and build Tclkit
              3. Download SDX
              4. Create the loader ($VFS_DIR/main.tcl)
              5. Download and extract Tcllib (optional)
              6. Copy any modules you want from Tcllib (optional)
              7. Add dummy assets to $VFS_DIR/assets/data.json (has a specific format) (probably optional)
              8. Wrap and generate .kit and final .run ELF (you need 2 Tclkit binaries, just duplicate it)
            
            If you have any questions, let me know!

            ---

            I have used critcl before, but can't find my code anymore. :( It is good stuff though.

            • johnisgood 10 hours ago

              Correction: "The result is a self-contained executable that runs anywhere Tcl is supported" is inaccurate. You do not need Tcl to be supported, hence the binaries.

            • forinti 3 days ago

              I suppose you would use this to do low level stuff because it's much harder to do in TCL, but it just doesn't feel right.

              It makes more sense to me to embed Tk into a C program.

              • ofalkaed 3 days ago

                Depends on how much C you need, it might make more sense to write a proper Tcl extension and it might make sense to just embed Tcl/Tk but having this middle ground is nice because swinging to the fences is rarely the best course of action.

                Critcl looks to be quite nice in those situations when Tcl/Tk is almost but not quite, you get the speed and ease of Tcl/Tk but a little more as well. The big gotcha looks to be having the foresight of identifying when writing a proper Tcl/Tk extension or switching language is the better plan, but this is almost always the big gotcha.

                • Joel_Mckay 3 days ago

                  TCL is popular for automated scripting, and is still quite popular with "expect" and "autoexpect" package users. The key feature is opening a remote scripted or interactive ssh session, and running setup/install commands admins would otherwise have to type in thousands of times a month (or worse, leave sensitive information/CSR on short lived host nodes.)

                  Being able to compile ephemeral objects is actually pretty useful in some use-cases. =3

                  • kemyd 17 hours ago

                    Not contributing much to the discussion, but thanks for explaining who still uses Tcl. It was my first programming language about 20 years ago (I used it to write scripts for Eggdrop - an IRC bot). Just stopped by the comments out of nostalgia.

                    • Joel_Mckay 16 hours ago

                      The language core is still actively used, but not in the way most people assume.

                      Expanding TCL C support proves it is not deprecated as some suggested (most Java VM also run a dual stack with C/C++ native binary object support.)

                      Automated remote host administration with TCL is one area where it still works extremely well... I guess it is not relevant if people like pseudo-repetitive typing... so much typing people actually know all the parameters to tar without the manual. lol

                      Have a great day =3

                      • johnisgood 16 hours ago

                        Nitpick: it is Tcl, not TCL, just like how Ada is not ADA.

                        • Joel_Mckay 15 hours ago

                          Following the Wikipedia citation will point people here:

                          https://wiki.tcl-lang.org/page/Tcl+vs%2E+TCL

                          Which gets into the syntactical preference people developed over time.

                          The Tool Command Language acronym allusion is rather distinct from a popular "Tcl" colloquialism for the "tickle" project. From my perspective Tcl is a TCL, but not all TCLs are necessarily Tcl nor include a specific extension package.

                          Have a glorious day friend =3

                          • johnisgood 14 hours ago

                            When I say it out loud, I say T-C-L, too, but I write it as Tcl.

                            You have a nice day too! =3

                • hoherd 3 days ago

                  Not to be confused with the kubernetes container runtime interface CLI https://github.com/kubernetes-sigs/cri-tools/blob/master/doc...