From a01df39ff0a175aade466a2c525e1ddecf59836c Mon Sep 17 00:00:00 2001 From: Scott Richmond Date: Mon, 7 Jul 2025 00:27:20 -0400 Subject: [PATCH] bring in old readme --- README.md | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- logo.png | Bin 0 -> 40613 bytes 2 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 logo.png diff --git a/README.md b/README.md index bf252a2..be588f6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,93 @@ -# rudus +![Ludus logo](logo.png) +## Ludus: A friendly, dynamic, functional language +Ludus is a scripting programming language that is designed to be friendly, dynamic, and functional. -A Rust implementation of Ludus. \ No newline at end of file +This repo currently contains a work-in-progress implementation of an interpreter for the Ludus programming language, using [Janet](https://janet-lang.org) as a host language. +Ludus is part of the [_Thinking with Computers_ project](https://alea.ludus.dev/twc/), run by Scott Richmond at the University of Toronto, with collaborator Matt Nish-Lapidus; Bree Lohman and Mynt Marsellus are the RAs for the project. Ludus is our research language, which aspires to be a free translation of Logo for the 2020s. + +Here are our design goals: + +#### Friendly +Ludus, like Logo, is meant to be a teaching language, often for students who don't think of themselves as "computer people." Our intended audience are humanities and art people at the university level (undergrads, grads, faculty). Everything is kept as simple as possible, but no simpler. Everything is consistent as possible. We aspire to the best error messages we can muster, which is important for a language to be teachable. That means being as strict as we can muster, _in order to be friendlier_. + +Our current development target is Ludus on the web: https://web.ludus.dev. That wires what we do on the langauge interpreter (here in this repo) to a web frontend. + +Naturally, it starts with Logo's famed turtle graphics. + +#### Dynamic +Statically typed programming languages generally give more helpful error messages than dynamic ones, but learning a type system (even one with robust type inference) requires learning two parallel systems: the type system and the expression system (well, and the pattern system). Type systems only really make sense once you've learned why they're necessary. And their benefits seem (to us, anyway) to be largely necessary when writing long-lived, maintainable, multi-author code. Ludus code is likely to be one-off, expressive, and single-authored. + +To stay friendly, Ludus is dynamic. But: despite the dynamism, we aim to be as strict as possible. Certainly, we want to avoid the type conversion shenanigans of a language like JavaScript. + +#### Functional +Ludus is emphatically functional: it uses functions for just about everything. This is both because your humble PI had his world reordered when he learned his first functional language (Elixir), and because the research into Logo and the programming cultures of MIT in the 1970s revolve around extremely functional Lisp code (i.e., Scheme). Logo is a weird little language, but it is a descendant of Lisp. So is Ludus. + +Also, we believe that Ludus's immutable bindings and persistent or immutable data structures and careful approach to manipulating state lead to a lot of good pedagogical results. Learning a programming language involves learning how to model what's going on inside the computer; Ludus, we think, makes that both simpler and easier. + +If you're looking for cognate languages, Ludus takes a _lot_ of design inspiration from Clojure and Elixir (which itself took a lot from Clojure). (The current--quick, dirty, and slow--version of Ludus is written in [Janet](https://janet-lang.org).) Clojure and Elixir are great! If you're asking why you should use Ludus instead of them, you're already at the point where you should be using them. Ludus is, maybe, for the people whom you'd like to work with in 5 years at your Pheonix shop (but even then, probably not). + +### Status +Pre-alpha, still under active development. Lots of things change all the time. + +The current version of Ludus is a pure function that runs in JavaScript as a WASM blob. We have plans for more and better things. + +### Use +Current emphasis is on the web version: https://web.ludus.dev. + +### Main features +* Expression-oriented: everything returns a value +* Pattern matching in all the places +* No operators: everything is called as a function +* Easy-peasy partial application with placeholders +* Function pipelines +* Persistent or immutable data structures +* Careful, explicit state management using `box`es +* Clean, concise, expressive syntax +* Value-based equality; only functions are reference types + +#### Under construction +* Actor-model style concurrency. +* Faster, bytecode-based VM written in a systems language, for better performance. +* Performant persistent, immutable data structures, à la Clojure. + +### `Hello, world!` +Ludus is a scripting language. At current it does not have a good REPL. Our aim is to get interactive coding absolutely correct, and our efforts in [ludus-web](https://github.com/thinking-with-computers/ludus-web) are currently under way to surface the right interactivity models for Ludus. + +Either: +``` +"Hello, world!" +``` +`=> "Hello, world!"` + +Ludus scripts (and blocks) simply return their last expression; this script returns the bare string and exits. + +Or: +``` +print! ("Hello, world!") +``` +``` +=> Hello, world! +=> :ok +``` + +Here, we use the `print!` function, which sends a string to a console (`stdout` on Unix, or a little console box on the web). Because `print!` returns the keyword `:ok` when it completes, that is the result of the last expression in the script--and so Ludus also prints this. + +### Some code +Fibonacci numbers: +``` +& fibonacci!, with multi-clause fns/pattern matching + +fn fib { + "Returns the nth fibonacci number." + (1) -> 1 + (2) -> 1 + (n) -> add ( + fib (sub (n, 1)) + fib (sub (n, 2))) +} + +fib (10) &=> 55 +``` + +### More on Ludus +See the [language reference](language.md) and [the documentation for the prelude](prelude.md). diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3631e9d40b5e4bec0d4dc4b4edf0511dd58ce93f GIT binary patch literal 40613 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�#{UXx=wI`xbThI&5kRE)JJ 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 literal 0 HcmV?d00001