Show HN: Cicada – A scripting language that integrates with C (github.com)

57 points by briancr ↗ HN
I wrote a lightweight scripting language that runs together with C. Specifically, it's a C library, you run it through a C function call, and it can callback your own C functions. Compiles to ~250 kB. No dependencies beyond the C standard library.

Key language features: * Uses aliases not pointers, so it's memory-safe * Arrays are N-dimensional and resizable * Runs scripts or its own 'shell' * Error trapping * Methods, inheritance, etc. * Customizable syntax

10 comments

[ 0.24 ms ] story [ 32.3 ms ] thread
Cool, I like these kinds of projects. When it comes to embedding a scripting language in C, there are already some excellent options: Notable ones are Janet, Guile, and Lua. Tcl is also worth considering. My personal favorite is still Janet[0]. Others?

[0]: https://janet-lang.org/

What's the use case? Clearly, you made it with some specific use in mind, at least initially. What was it?
Thanks for the references! Writing a language was almost an accident — I worked on a neural networks tool with a scripted interface back around 2000, before I’d ever heard of some of these other languages.. and I’ve been using/updating it ever since.

Beyond NNs, my use case to embed fast C calculations into the language to make scientific programming easier. But the inspiration was less about the use case and more about certain programming innovations which I’m sure are elsewhere but I’m not sure where — like aliases, callable function arguments, generalized inheritance, etc.

That’s a great list — most of those languages I’ve honestly never heard of..

Can I call into the interpreter from multiple threads or does it use global state?
The for loop is odd. Why is the word counter in there twice?

    counter :: int

    for counter in <1, 10-counter> (
       print(counter)
       print(" ")
    )
Using backfor to count backwards is an odd choice. Why not overload for?

    backfor counter in <1, 9> print(counter, " ")
This is confusing to me. Maybe I'm misunderstanding the design principles, but the syntax seems unintuitive.
> Uses aliases not pointers, so it's memory-safe

How does it deal with use after free? How does it deal with data races?

Memory safety can't be solved by just eliminating pointer arithmetic, there's more stuff needed to achieve it