RSML 1.0.5

dotnet add package RSML --version 1.0.5
                    
NuGet\Install-Package RSML -Version 1.0.5
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="RSML" Version="1.0.5" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="RSML" Version="1.0.5" />
                    
Directory.Packages.props
<PackageReference Include="RSML" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add RSML --version 1.0.5
                    
#r "nuget: RSML, 1.0.5"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#addin nuget:?package=RSML&version=1.0.5
                    
Install as a Cake Addin
#tool nuget:?package=RSML&version=1.0.5
                    
Install as a Cake Tool

Red Sea Markup Language

<img src="Assets/FullSizeLogo.png" alt="RSML Logo" align="right" width="96" height="96">

NuGet Version GitHub Release GitHub License GitHub top language GitHub Repo stars NuGet Downloads

The modern fork of MF's Crossroad we're sure you'll love.

Below is a list of features (or reasons why RSML is better than MFRoad - call them what you want) in this markup language.

<hr />

Regex Support

Instead of those awful win32:any and any:amd64, you have Regex support in RSML.

win.+ -> "Return value"
# ^ this literally stands for "starts with win and goes on undefinitely"
# pure regex, as simple as it can get, eh eh

<hr />

More space to breathe

One of the low points of MFRoad was not allowing for spaces in statements. Worry no more.

# all of the below statements are valid
win -> "valid"
win->"valid"
win                      ->               "valid"
win                                 ->"valid"
win->          "valid"

<hr />

Known system identifier format

MFRoad used the poorly-documented sys.platform from python and, for Linux distros, the distro module.

Since RSML is made in C#, we decided to change things up a bit: system identifiers are now the same as MSBuild Runtime Identifiers, which are pretty well documented.

<hr />

Directly in your terminal

RSML is not just a library for .NET: you can also use it directly in your terminal.

cat somefile.rsea | RSML.CLI evaluate --no-pretty

--no-pretty disables ASCII art and copyright messages so you can easily pipe the evaluation into another command without it also piping the ASCII art.

<hr />

Documentation build process

You may build the documentation for RSML yourself!

Just try doing this:

RSML.Docs

Or, if you're scared of the commandline, just run the main.py that's bundled with RSML.Docs.

<hr />

Still kind of compatible?

Yes, RSML is still kind of compatible with MFRoad. It supports MFRoad's operators as long as they're specified.

It can't emulate the any or the <system>:<architecture> behavior though.

<hr />

Comments

This might be hard to take in at first but... everything that's not a statement is a comment. Yup.

# this is a comment - the recommended way as these are always ignored
// but this is technically also a valid comment

in fact, any statement that does not start with special actions
and does not have any operators

yup, it's a comment

the problem arises when you do things like this:
etc etc -> etc etc

problem? RSML considers that to be a valid statement because of the operator in it

so my recommendation?
# always stick with the default comments, as they're always ignored

<hr />

Custom actions

MFRoad only allowed 3 actions: returning a value (primary), outputting text (secondary) and throwing an error (tertiary).

RSML still only allows 3 main actions, but they can be customized (does not apply to the CLI).

Hell, you can even customize the operators that those actions use.

using System;

// ...

// let's say your RSParser is at a variable named "parser"
parser.DefineOperator(OperatorType.Primary, ";)")
// ;) will now be your primary operator (basically, it'll replace ->)

// you may also register an action
parser.RegisterAction(OperatorType.Secondary, (_, argument) => Console.WriteLine(argument));
// _ is a parameter of type RSParser. I've discarded it as we don't need it
// argument is a string

// you can register actions only for secondary, tertiary and special operators
// the primary action cannot be redefined - it's always the return action

<hr />

Special Actions

Special actions are also a new thing.

@MySpecialAction TheArgument # arguments here cannot contain any spaces

There is only one built-in special action, an argument-less one. All of the others must be defined for them to work.

@EndAll # the only built-in special action in RSML

You may define special actions but keep in mind they take 2 arguments, like normal main actions but also return a value, of type byte.

parser.RegisterSpecialFunction("TestFunc", (_, _) => 251);
// 251 is a special return code that removes all defined special actions (except for @EndAll)
// other special return codes are 250 and 252

This TestFunc can then be used in RSML.

@TestFunc
@MySpecial
# even if MySpecial was defined, it'll become undefined after @TestFunc

<hr />

What about other languages?

As for right now, we don't intend in porting RSML library to other languages, but You could include the DLLs in your project and call them. Not a graceful solution, but not a bad one either.

<table>

<tr>
	<th>
		Languages
	</th>
	<th>
		Is available?
	</th>
	<th>
		Documentaion
	</th>
	<th>
		Is official?
	</th>
	<th>
		Package Manager
	</th>
	<th>
		Other Links
	</th>
</tr>

<tr>
	<td>
		<img src="https://raw.githubusercontent.com/vscode-icons/vscode-icons/refs/heads/master/icons/file_type_csharp.svg" alt="C#" width="80" />
		
	</td>
	<td>
		✔ RSML is intended for use in C#.
	</td>
	<td>
		🟡 In the making.
	</td>
	<td>
		✔
	</td>
	<td>
		<a href="https://www.nuget.org/packages/RSML">NuGet</a>
	</td>
	<td>
		---
	</td>
</tr>
<tr>
	<td>
		<img src="https://raw.githubusercontent.com/vscode-icons/vscode-icons/refs/heads/master/icons/file_type_python.svg" alt="Python 3" width="80" />
	</td>
	<td>
		✔ Since June 12, 2025.
	</td>
	<td>
		🔴 Not started.
	</td>
	<td>
		✔
	</td>
	<td>
		<a href="https://pypi.org/project/rsml-python/">PyPI</a>
	</td>
	<td>
		---
	</td>
</tr>
<tr>
	<td>
		<img src="https://raw.githubusercontent.com/vscode-icons/vscode-icons/refs/heads/master/icons/file_type_cpp.svg" alt="C++" width="80" />
	</td>
	<td>
		❌
	</td>
	<td>
		---
	</td>
	<td>
		---
	</td>
	<td>
		---
	</td>
	<td>
		---
	</td>
</tr>
<tr>
	<td>
		<img src="https://raw.githubusercontent.com/vscode-icons/vscode-icons/refs/heads/master/icons/file_type_c.svg" alt="C" width="80" />
	</td>
	<td>
		❌
	</td>
	<td>
		---
	</td>
	<td>
		---
	</td>
	<td>
		---
	</td>
	<td>
		---
	</td>
</tr>
<tr>
	<td>
		<img src="https://raw.githubusercontent.com/vscode-icons/vscode-icons/refs/heads/master/icons/file_type_lua.svg" alt="Lua" width="80" />
	</td>
	<td>
		❌
	</td>
	<td>
		---
	</td>
	<td>
		---
	</td>
	<td>
		---
	</td>
	<td>
		---
	</td>
</tr>
<tr>
	<td>
		<img src="https://raw.githubusercontent.com/vscode-icons/vscode-icons/refs/heads/master/icons/file_type_vb.svg" alt="Visual Basic.NET" width="80" />
	</td>
	<td>
		⚠ Not tested but should be compatible with the C# package, since they're both .NET languages.
	</td>
	<td>
		🟣 No specific documentation planned (refer to RSML for C# docs).
	</td>
	<td>
		⚠ Hasn't been officially tested on VB.NET, but yes.
	</td>
	<td>
		<a href="https://www.nuget.org/packages/RSML">NuGet</a>
	</td>
	<td>
		---
	</td>
</tr>

</table>

<hr />

Copyright (c) 2025 OceanApocalypseStudios

We ❤️ open-source!

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.5 80 6/21/2025
1.0.3 149 6/14/2025
1.0.2 271 6/12/2025
1.0.1 95 5/31/2025

# 🚀 v1.0.5 is now available
- CLI is now AOT-compatible