From 6abc3c7783d54d2470a0f9c2150abca4c9380895 Mon Sep 17 00:00:00 2001 From: "NGnius (Graham)" Date: Fri, 4 Mar 2022 11:37:16 -0500 Subject: [PATCH] Update root README to reflect recent improvements --- README.md | 30 ++++++++++++++++++++++++------ extras/demo.png | Bin 26300 -> 26570 bytes src/main.rs | 30 ++++++++++++++++++++++++------ 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 51576c6..d34445f 100644 --- a/README.md +++ b/README.md @@ -8,28 +8,46 @@ The CLI interface includes a REPL for running scripts. The REPL interactive mode also provides more details about using MPS through the `?help` command. ## Usage -To access the REPL, simply run `cargo run`. You will need the [Rust toolchain installed](https://rustup.rs/). +To access the REPL, simply run `cargo run`. You will need the [Rust toolchain installed](https://rustup.rs/). For a bit of extra performance, run `cargo run --release` instead. ## Examples + +### One-liners + +All songs by artist `` (in your library), sorted by similarity to a random first song by the artist. +```mps +files().(artist? like "")~(shuffle)~(advanced bliss_next); +``` + +All songs with a `.flac` file extension (anywhere in their path -- not necessarily at the end). +```mps +files().(filename? like ".flac"); +``` + +All songs by artist `` or ``, sorted by similarity to a random first song by either artist. +```mps +files().(artist? like "" || artist? like "")~(shuffle)~(advanced bliss_next); +``` + +### Bigger examples + For now, check out `./src/tests`, `./mps-player/tests`, and `./mps-interpreter/tests` for examples. One day I'll add pretty REPL example pictures and some script files... // TODO ## FAQ -### Is MPS Turing-Complete? -**No**. It can't perform arbitrary calculations (yet), which easily disqualifies MPS from being Turing-complete. ### Can I use MPS right now? -**Sure!** It's not complete, but MPS is completely useable for basic music queries right now. Hopefully most of the bugs have been ironed out as well... +**Sure!** It's not complete, but MPS is completely useable for basic music queries right now. Hopefully most of the bugs have been ironed out as well :) ### Why write a new language? -**I thought it would be fun**. I also wanted to be able to play my music without having to be at the whim of someone else's algorithm (and music), and playing just by album or artist was getting boring. I also thought designing a language specifically for iteration would be a novel approach to a language (though every approach is a novel approach for me). +**I thought it would be fun**. I also wanted to be able to play my music without having to be at the whim of someone else's algorithm (and music), and playing just by album or artist was getting boring. Designing a language specifically for iteration seemed like a cool & novel way of doing it, too (though every approach is a novel approach for me). ### What is MPS? **Music Playlist Script (MPS) is technically a query language for music files.** It uses an (auto-generated) SQLite3 database for SQL queries and can also directly query the filesystem. Queries can be modified by using filters, functions, and sorters built-in to MPS (see mps-interpreter's README.md). ### Is MPS a scripting language? -**No**. Technically, it was designed to be one, but it doesn't meet the requirements of a scripting language (yet). One day, I would like it be Turing-complete and then it could be considered a scripting language. At the moment it is barely a query language. +**Yes**. It evolved from a simple query language into something that can do arbitrary calculations. Whether it's Turing-complete is still unproved, but it's powerful enough to do what I want it to do. ## License diff --git a/extras/demo.png b/extras/demo.png index dfa320e743f4a84a0df4d36ad7089ac3d642756a..d4ce65cb96f8efdae8f3919e057c50db578fffa8 100644 GIT binary patch literal 26570 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 bM}s{W3N?6hPXX}s#IB{Tr&gr${Qds`IRodd diff --git a/src/main.rs b/src/main.rs index e3f4dc9..29c0408 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,28 +4,46 @@ //! The REPL interactive mode also provides more details about using MPS through the `?help` command. //! //! # Usage -//! To access the REPL, simply run `cargo run`. You will need the [Rust toolchain installed](https://rustup.rs/). +//! To access the REPL, simply run `cargo run`. You will need the [Rust toolchain installed](https://rustup.rs/). For a bit of extra performance, run `cargo run --release` instead. //! //! # Examples +//! +//! ## One-liners +//! +//! All songs by artist `` (in your library), sorted by similarity to a random first song by the artist. +//! ```mps +//! files().(artist? like "")~(shuffle)~(advanced bliss_next); +//! ``` +//! +//! All songs with a `.flac` file extension (anywhere in their path -- not necessarily at the end). +//! ```mps +//! files().(filename? like ".flac"); +//! ``` +//! +//! All songs by artist `` or ``, sorted by similarity to a random first song by either artist. +//! ```mps +//! files().(artist? like "" || artist? like "")~(shuffle)~(advanced bliss_next); +//! ``` +//! +//! ## Bigger examples +//! //! For now, check out `./src/tests`, `./mps-player/tests`, and `./mps-interpreter/tests` for examples. //! One day I'll add pretty REPL example pictures and some script files... //! // TODO //! //! # FAQ -//! ## Is MPS Turing-Complete? -//! **No**. It can't perform arbitrary calculations (yet), which easily disqualifies MPS from being Turing-complete. //! //! ## Can I use MPS right now? -//! **Sure!** It's not complete, but MPS is completely useable for basic music queries right now. Hopefully most of the bugs have been ironed out as well... +//! **Sure!** It's not complete, but MPS is completely useable for basic music queries right now. Hopefully most of the bugs have been ironed out as well :) //! //! ## Why write a new language? -//! **I thought it would be fun**. I also wanted to be able to play my music without having to be at the whim of someone else's algorithm (and music), and playing just by album or artist was getting boring. I also thought designing a language specifically for iteration would be a novel approach to a language (though every approach is a novel approach for me). +//! **I thought it would be fun**. I also wanted to be able to play my music without having to be at the whim of someone else's algorithm (and music), and playing just by album or artist was getting boring. Designing a language specifically for iteration seemed like a cool & novel way of doing it, too (though every approach is a novel approach for me). //! //! ## What is MPS? //! **Music Playlist Script (MPS) is technically a query language for music files.** It uses an (auto-generated) SQLite3 database for SQL queries and can also directly query the filesystem. Queries can be modified by using filters, functions, and sorters built-in to MPS (see mps-interpreter's README.md). //! //! ## Is MPS a scripting language? -//! **No**. Technically, it was designed to be one, but it doesn't meet the requirements of a scripting language (yet). One day, I would like it be Turing-complete and then it could be considered a scripting language. At the moment it is barely a query language. +//! **Yes**. It evolved from a simple query language into something that can do arbitrary calculations. Whether it's Turing-complete is still unproved, but it's powerful enough to do what I want it to do. //! mod channel_io;